2017-02-16 4 views
0

Я должен суммировать данные в pg_stat_activity и возвращать их как json. Postgres 9.3 на борту. Результат нужно, это как-л:pg_stat_activity агрегированные данные для мониторинга в json

{ 
    "web": 67, 
    "postgres": 2, 
    "totalSessions": 69, 
    "idle in transaction": 2, 
    "active": 1, 
    "idle": 66 
} 

где активен является количество активных сеансов, в режиме ожидания - в режиме ожидания, всего - сумма обоих, а остальное количество сеансов для каждого пользователя. Нам не нужно было группировать его по базам данных, но принцип был бы таким же.

Нет - как я могу это сделать?

ответ

0

QRY я придумал не лучше, то:

mon=# with pre as (
    select DISTINCT 
    concat('"totalSessions":',sum(count(1)) over(),'') total 
    , concat('"',usename,'":',sum(count(1)) over (partition by usename),'') u 
    , concat('"',state,'":',sum(count(1)) over (partition by state),'') s 
    from pg_stat_activity 
    group by state,usename 
) 
    select concat('{',string_agg(j,','),'}')::json from (
    select distinct u j from pre u 
    union all 
    select distinct total from pre s 
    union all 
    select distinct s from pre s 
) pg_stat_act 
; 
              concat 
------------------------------------------------------------------------------------------- 
{"web":67,"postgres":2,"totalSessions":69,"idle in transaction":2,"active":1,"idle":66} 
(1 row) 

Time: 1.807 ms