mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-04-09 18:51:25 +00:00
pg_stat_database: added support for active_time
counter (#961)
* feat(pg_stat_database): active time metric --------- Signed-off-by: Jiri Sveceny <jiri.sveceny@icloud.com>
This commit is contained in:
parent
5ceae7f414
commit
f5b613aba7
@ -206,6 +206,15 @@ var (
|
|||||||
[]string{"datid", "datname"},
|
[]string{"datid", "datname"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
|
statDatabaseActiveTime = prometheus.NewDesc(prometheus.BuildFQName(
|
||||||
|
namespace,
|
||||||
|
statDatabaseSubsystem,
|
||||||
|
"active_time_seconds_total",
|
||||||
|
),
|
||||||
|
"Time spent executing SQL statements in this database, in seconds",
|
||||||
|
[]string{"datid", "datname"},
|
||||||
|
prometheus.Labels{},
|
||||||
|
)
|
||||||
|
|
||||||
statDatabaseQuery = `
|
statDatabaseQuery = `
|
||||||
SELECT
|
SELECT
|
||||||
@ -227,6 +236,7 @@ var (
|
|||||||
,deadlocks
|
,deadlocks
|
||||||
,blk_read_time
|
,blk_read_time
|
||||||
,blk_write_time
|
,blk_write_time
|
||||||
|
,active_time
|
||||||
,stats_reset
|
,stats_reset
|
||||||
FROM pg_stat_database;
|
FROM pg_stat_database;
|
||||||
`
|
`
|
||||||
@ -244,7 +254,7 @@ func (c *PGStatDatabaseCollector) Update(ctx context.Context, instance *instance
|
|||||||
|
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var datid, datname sql.NullString
|
var datid, datname sql.NullString
|
||||||
var numBackends, xactCommit, xactRollback, blksRead, blksHit, tupReturned, tupFetched, tupInserted, tupUpdated, tupDeleted, conflicts, tempFiles, tempBytes, deadlocks, blkReadTime, blkWriteTime sql.NullFloat64
|
var numBackends, xactCommit, xactRollback, blksRead, blksHit, tupReturned, tupFetched, tupInserted, tupUpdated, tupDeleted, conflicts, tempFiles, tempBytes, deadlocks, blkReadTime, blkWriteTime, activeTime sql.NullFloat64
|
||||||
var statsReset sql.NullTime
|
var statsReset sql.NullTime
|
||||||
|
|
||||||
err := rows.Scan(
|
err := rows.Scan(
|
||||||
@ -266,6 +276,7 @@ func (c *PGStatDatabaseCollector) Update(ctx context.Context, instance *instance
|
|||||||
&deadlocks,
|
&deadlocks,
|
||||||
&blkReadTime,
|
&blkReadTime,
|
||||||
&blkWriteTime,
|
&blkWriteTime,
|
||||||
|
&activeTime,
|
||||||
&statsReset,
|
&statsReset,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -344,6 +355,10 @@ func (c *PGStatDatabaseCollector) Update(ctx context.Context, instance *instance
|
|||||||
level.Debug(c.log).Log("msg", "Skipping collecting metric because it has no blk_write_time")
|
level.Debug(c.log).Log("msg", "Skipping collecting metric because it has no blk_write_time")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if !activeTime.Valid {
|
||||||
|
level.Debug(c.log).Log("msg", "Skipping collecting metric because it has no active_time")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
statsResetMetric := 0.0
|
statsResetMetric := 0.0
|
||||||
if !statsReset.Valid {
|
if !statsReset.Valid {
|
||||||
@ -467,6 +482,13 @@ func (c *PGStatDatabaseCollector) Update(ctx context.Context, instance *instance
|
|||||||
labels...,
|
labels...,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ch <- prometheus.MustNewConstMetric(
|
||||||
|
statDatabaseActiveTime,
|
||||||
|
prometheus.CounterValue,
|
||||||
|
activeTime.Float64/1000.0,
|
||||||
|
labels...,
|
||||||
|
)
|
||||||
|
|
||||||
ch <- prometheus.MustNewConstMetric(
|
ch <- prometheus.MustNewConstMetric(
|
||||||
statDatabaseStatsReset,
|
statDatabaseStatsReset,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
|
@ -52,6 +52,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
|
|||||||
"deadlocks",
|
"deadlocks",
|
||||||
"blk_read_time",
|
"blk_read_time",
|
||||||
"blk_write_time",
|
"blk_write_time",
|
||||||
|
"active_time",
|
||||||
"stats_reset",
|
"stats_reset",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
|
|||||||
925,
|
925,
|
||||||
16,
|
16,
|
||||||
823,
|
823,
|
||||||
|
33,
|
||||||
srT)
|
srT)
|
||||||
|
|
||||||
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
||||||
@ -113,6 +115,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
|
|||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
||||||
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0.033},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,6 +162,7 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
|
|||||||
"deadlocks",
|
"deadlocks",
|
||||||
"blk_read_time",
|
"blk_read_time",
|
||||||
"blk_write_time",
|
"blk_write_time",
|
||||||
|
"active_time",
|
||||||
"stats_reset",
|
"stats_reset",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +186,7 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
|
|||||||
925,
|
925,
|
||||||
16,
|
16,
|
||||||
823,
|
823,
|
||||||
|
32,
|
||||||
srT).
|
srT).
|
||||||
AddRow(
|
AddRow(
|
||||||
"pid",
|
"pid",
|
||||||
@ -202,6 +207,7 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
|
|||||||
925,
|
925,
|
||||||
16,
|
16,
|
||||||
823,
|
823,
|
||||||
|
32,
|
||||||
srT)
|
srT)
|
||||||
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
||||||
|
|
||||||
@ -234,6 +240,7 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
|
|||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
||||||
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0.032},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,6 +282,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
"deadlocks",
|
"deadlocks",
|
||||||
"blk_read_time",
|
"blk_read_time",
|
||||||
"blk_write_time",
|
"blk_write_time",
|
||||||
|
"active_time",
|
||||||
"stats_reset",
|
"stats_reset",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,6 +311,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
925,
|
925,
|
||||||
16,
|
16,
|
||||||
823,
|
823,
|
||||||
|
14,
|
||||||
srT).
|
srT).
|
||||||
AddRow(
|
AddRow(
|
||||||
nil,
|
nil,
|
||||||
@ -324,6 +333,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
|
nil,
|
||||||
).
|
).
|
||||||
AddRow(
|
AddRow(
|
||||||
"pid",
|
"pid",
|
||||||
@ -344,6 +354,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
926,
|
926,
|
||||||
17,
|
17,
|
||||||
824,
|
824,
|
||||||
|
15,
|
||||||
srT)
|
srT)
|
||||||
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
||||||
|
|
||||||
@ -376,7 +387,9 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
||||||
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0.014},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
||||||
|
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_GAUGE, value: 355},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_GAUGE, value: 355},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 4946},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 4946},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 289097745},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 289097745},
|
||||||
@ -393,6 +406,7 @@ func TestPGStatDatabaseCollectorRowLeakTest(t *testing.T) {
|
|||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 926},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 926},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 17},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 17},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 824},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 824},
|
||||||
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0.015},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 1685059842},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -435,6 +449,7 @@ func TestPGStatDatabaseCollectorTestNilStatReset(t *testing.T) {
|
|||||||
"deadlocks",
|
"deadlocks",
|
||||||
"blk_read_time",
|
"blk_read_time",
|
||||||
"blk_write_time",
|
"blk_write_time",
|
||||||
|
"active_time",
|
||||||
"stats_reset",
|
"stats_reset",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -458,6 +473,7 @@ func TestPGStatDatabaseCollectorTestNilStatReset(t *testing.T) {
|
|||||||
925,
|
925,
|
||||||
16,
|
16,
|
||||||
823,
|
823,
|
||||||
|
7,
|
||||||
nil)
|
nil)
|
||||||
|
|
||||||
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(statDatabaseQuery)).WillReturnRows(rows)
|
||||||
@ -491,6 +507,7 @@ func TestPGStatDatabaseCollectorTestNilStatReset(t *testing.T) {
|
|||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 925},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 16},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 823},
|
||||||
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0.007},
|
||||||
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"datid": "pid", "datname": "postgres"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user