Skip to content

Commit 4ac5481

Browse files
authored
Merge pull request #862 from tomhughes/idle-state
Include all idle processes in the process idle metrics
2 parents 9a9a429 + a8b86cf commit 4ac5481

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

collector/pg_process_idle.go

+18-9
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func NewPGProcessIdleCollector(config collectorConfig) (Collector, error) {
4040
var 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

Comments
 (0)