@@ -40,7 +40,7 @@ func NewPGProcessIdleCollector(config collectorConfig) (Collector, error) {
40
40
var pgProcessIdleSeconds = prometheus .NewDesc (
41
41
prometheus .BuildFQName (namespace , processIdleSubsystem , "seconds" ),
42
42
"Idle time of server processes" ,
43
- []string {"application_name" },
43
+ []string {"state" , " application_name" },
44
44
prometheus.Labels {},
45
45
)
46
46
@@ -50,15 +50,17 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
50
50
`WITH
51
51
metrics AS (
52
52
SELECT
53
+ state,
53
54
application_name,
54
55
SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
55
56
COUNT(*) AS process_idle_seconds_count
56
57
FROM pg_stat_activity
57
- WHERE state = ' idle'
58
- GROUP BY application_name
58
+ WHERE state ~ '^ idle'
59
+ GROUP BY state, application_name
59
60
),
60
61
buckets AS (
61
62
SELECT
63
+ state,
62
64
application_name,
63
65
le,
64
66
SUM(
@@ -70,25 +72,27 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
70
72
FROM
71
73
pg_stat_activity,
72
74
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
75
77
)
76
78
SELECT
79
+ state,
77
80
application_name,
78
81
process_idle_seconds_sum as seconds_sum,
79
82
process_idle_seconds_count as seconds_count,
80
83
ARRAY_AGG(le) AS seconds,
81
84
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 ;` )
84
87
88
+ var state sql.NullString
85
89
var applicationName sql.NullString
86
90
var secondsSum sql.NullFloat64
87
91
var secondsCount sql.NullInt64
88
92
var seconds []float64
89
93
var secondsBucket []int64
90
94
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 ))
92
96
if err != nil {
93
97
return err
94
98
}
@@ -101,6 +105,11 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
101
105
buckets [second ] = uint64 (secondsBucket [i ])
102
106
}
103
107
108
+ stateLabel := "unknown"
109
+ if state .Valid {
110
+ stateLabel = state .String
111
+ }
112
+
104
113
applicationNameLabel := "unknown"
105
114
if applicationName .Valid {
106
115
applicationNameLabel = applicationName .String
@@ -117,7 +126,7 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
117
126
ch <- prometheus .MustNewConstHistogram (
118
127
pgProcessIdleSeconds ,
119
128
secondsCountMetric , secondsSumMetric , buckets ,
120
- applicationNameLabel ,
129
+ stateLabel , applicationNameLabel ,
121
130
)
122
131
return nil
123
132
}
0 commit comments