mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-02-28 16:30:34 +00:00
Include all idle processes in the process idle metrics
Signed-off-by: Tom Hughes <tom@compton.nu>
This commit is contained in:
parent
6b56e2f057
commit
a8b86cf7da
@ -40,7 +40,7 @@ func NewPGProcessIdleCollector(config collectorConfig) (Collector, error) {
|
|||||||
var pgProcessIdleSeconds = prometheus.NewDesc(
|
var pgProcessIdleSeconds = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, processIdleSubsystem, "seconds"),
|
prometheus.BuildFQName(namespace, processIdleSubsystem, "seconds"),
|
||||||
"Idle time of server processes",
|
"Idle time of server processes",
|
||||||
[]string{"application_name"},
|
[]string{"state", "application_name"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -50,15 +50,17 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
|
|||||||
`WITH
|
`WITH
|
||||||
metrics AS (
|
metrics AS (
|
||||||
SELECT
|
SELECT
|
||||||
|
state,
|
||||||
application_name,
|
application_name,
|
||||||
SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
|
SUM(EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - state_change))::bigint)::float AS process_idle_seconds_sum,
|
||||||
COUNT(*) AS process_idle_seconds_count
|
COUNT(*) AS process_idle_seconds_count
|
||||||
FROM pg_stat_activity
|
FROM pg_stat_activity
|
||||||
WHERE state = 'idle'
|
WHERE state ~ '^idle'
|
||||||
GROUP BY application_name
|
GROUP BY state, application_name
|
||||||
),
|
),
|
||||||
buckets AS (
|
buckets AS (
|
||||||
SELECT
|
SELECT
|
||||||
|
state,
|
||||||
application_name,
|
application_name,
|
||||||
le,
|
le,
|
||||||
SUM(
|
SUM(
|
||||||
@ -70,25 +72,27 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
|
|||||||
FROM
|
FROM
|
||||||
pg_stat_activity,
|
pg_stat_activity,
|
||||||
UNNEST(ARRAY[1, 2, 5, 15, 30, 60, 90, 120, 300]) AS le
|
UNNEST(ARRAY[1, 2, 5, 15, 30, 60, 90, 120, 300]) AS le
|
||||||
GROUP BY application_name, le
|
GROUP BY state, application_name, le
|
||||||
ORDER BY application_name, le
|
ORDER BY state, application_name, le
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
|
state,
|
||||||
application_name,
|
application_name,
|
||||||
process_idle_seconds_sum as seconds_sum,
|
process_idle_seconds_sum as seconds_sum,
|
||||||
process_idle_seconds_count as seconds_count,
|
process_idle_seconds_count as seconds_count,
|
||||||
ARRAY_AGG(le) AS seconds,
|
ARRAY_AGG(le) AS seconds,
|
||||||
ARRAY_AGG(bucket) AS seconds_bucket
|
ARRAY_AGG(bucket) AS seconds_bucket
|
||||||
FROM metrics JOIN buckets USING (application_name)
|
FROM metrics JOIN buckets USING (state, application_name)
|
||||||
GROUP BY 1, 2, 3;`)
|
GROUP BY 1, 2, 3, 4;`)
|
||||||
|
|
||||||
|
var state sql.NullString
|
||||||
var applicationName sql.NullString
|
var applicationName sql.NullString
|
||||||
var secondsSum sql.NullFloat64
|
var secondsSum sql.NullFloat64
|
||||||
var secondsCount sql.NullInt64
|
var secondsCount sql.NullInt64
|
||||||
var seconds []float64
|
var seconds []float64
|
||||||
var secondsBucket []int64
|
var secondsBucket []int64
|
||||||
|
|
||||||
err := row.Scan(&applicationName, &secondsSum, &secondsCount, pq.Array(&seconds), pq.Array(&secondsBucket))
|
err := row.Scan(&state, &applicationName, &secondsSum, &secondsCount, pq.Array(&seconds), pq.Array(&secondsBucket))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -101,6 +105,11 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
|
|||||||
buckets[second] = uint64(secondsBucket[i])
|
buckets[second] = uint64(secondsBucket[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stateLabel := "unknown"
|
||||||
|
if state.Valid {
|
||||||
|
stateLabel = state.String
|
||||||
|
}
|
||||||
|
|
||||||
applicationNameLabel := "unknown"
|
applicationNameLabel := "unknown"
|
||||||
if applicationName.Valid {
|
if applicationName.Valid {
|
||||||
applicationNameLabel = applicationName.String
|
applicationNameLabel = applicationName.String
|
||||||
@ -117,7 +126,7 @@ func (PGProcessIdleCollector) Update(ctx context.Context, instance *instance, ch
|
|||||||
ch <- prometheus.MustNewConstHistogram(
|
ch <- prometheus.MustNewConstHistogram(
|
||||||
pgProcessIdleSeconds,
|
pgProcessIdleSeconds,
|
||||||
secondsCountMetric, secondsSumMetric, buckets,
|
secondsCountMetric, secondsSumMetric, buckets,
|
||||||
applicationNameLabel,
|
stateLabel, applicationNameLabel,
|
||||||
)
|
)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user