@@ -40,7 +40,7 @@ func NewPGProcessIdleCollector(config collectorConfig) (Collector, error) {
4040var pgProcessIdleSeconds = prometheus .NewDesc (
4141 prometheus .BuildFQName (namespace , processIdleSubsystem , "seconds" ),
4242 "Idle time of server processes" ,
43- []string {"application_name" },
43+ []string {"state" , " application_name" },
4444 prometheus.Labels {},
4545)
4646
@@ -50,15 +50,17 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
5050 `WITH
5151 metrics AS (
5252 SELECT
53+ state,
5354 application_name,
5455 SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
5556 COUNT(*) AS process_idle_seconds_count
5657 FROM pg_stat_activity
57- WHERE state = ' idle'
58- GROUP BY application_name
58+ WHERE state ~ '^ idle'
59+ GROUP BY state, application_name
5960 ),
6061 buckets AS (
6162 SELECT
63+ state,
6264 application_name,
6365 le,
6466 SUM(
@@ -70,25 +72,27 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
7072 FROM
7173 pg_stat_activity,
7274 UNNEST(ARRAY[1, 2, 5, 15, 30, 60, 90, 120, 300]) AS le
73- GROUP BY application_name, le
74- ORDER BY application_name, le
75+ GROUP BY state, application_name, le
76+ ORDER BY state, application_name, le
7577 )
7678 SELECT
79+ state,
7780 application_name,
7881 process_idle_seconds_sum as seconds_sum,
7982 process_idle_seconds_count as seconds_count,
8083 ARRAY_AGG(le) AS seconds,
8184 ARRAY_AGG(bucket) AS seconds_bucket
82- FROM metrics JOIN buckets USING (application_name)
83- GROUP BY 1, 2, 3;` )
85+ FROM metrics JOIN buckets USING (state, application_name)
86+ GROUP BY 1, 2, 3, 4 ;` )
8487
88+ var state sql.NullString
8589 var applicationName sql.NullString
8690 var secondsSum sql.NullFloat64
8791 var secondsCount sql.NullInt64
8892 var seconds []float64
8993 var secondsBucket []int64
9094
91- err := row .Scan (& applicationName , & secondsSum , & secondsCount , pq .Array (& seconds ), pq .Array (& secondsBucket ))
95+ err := row .Scan (& state , & applicationName , & secondsSum , & secondsCount , pq .Array (& seconds ), pq .Array (& secondsBucket ))
9296 if err != nil {
9397 return err
9498 }
@@ -101,6 +105,11 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
101105 buckets [second ] = uint64 (secondsBucket [i ])
102106 }
103107
108+ stateLabel := "unknown"
109+ if state .Valid {
110+ stateLabel = state .String
111+ }
112+
104113 applicationNameLabel := "unknown"
105114 if applicationName .Valid {
106115 applicationNameLabel = applicationName .String
@@ -117,7 +126,7 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
117126 ch <- prometheus .MustNewConstHistogram (
118127 pgProcessIdleSeconds ,
119128 secondsCountMetric , secondsSumMetric , buckets ,
120- applicationNameLabel ,
129+ stateLabel , applicationNameLabel ,
121130 )
122131 return nil
123132}
0 commit comments