mirror of
https://github.com/prometheus-community/postgres_exporter
synced 2025-05-04 08:58:03 +00:00
Add labels SELECT|INSERT|UPDATE|DELETE|OTHER
Signed-off-by: Deryugin, Nikolay <nikolay.deryugin@itglobal.com>
This commit is contained in:
parent
d6229af4c4
commit
693bd7d08d
@ -43,31 +43,31 @@ var (
|
|||||||
statStatementsCallsTotal = prometheus.NewDesc(
|
statStatementsCallsTotal = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, statStatementsSubsystem, "calls_total"),
|
prometheus.BuildFQName(namespace, statStatementsSubsystem, "calls_total"),
|
||||||
"Number of times executed",
|
"Number of times executed",
|
||||||
[]string{"user", "datname", "queryid", "query"},
|
[]string{"user", "datname", "queryid", "query", "stmt_type"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
statStatementsSecondsTotal = prometheus.NewDesc(
|
statStatementsSecondsTotal = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, statStatementsSubsystem, "seconds_total"),
|
prometheus.BuildFQName(namespace, statStatementsSubsystem, "seconds_total"),
|
||||||
"Total time spent in the statement, in seconds",
|
"Total time spent in the statement, in seconds",
|
||||||
[]string{"user", "datname", "queryid", "query"},
|
[]string{"user", "datname", "queryid", "query", "stmt_type"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
statStatementsRowsTotal = prometheus.NewDesc(
|
statStatementsRowsTotal = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, statStatementsSubsystem, "rows_total"),
|
prometheus.BuildFQName(namespace, statStatementsSubsystem, "rows_total"),
|
||||||
"Total number of rows retrieved or affected by the statement",
|
"Total number of rows retrieved or affected by the statement",
|
||||||
[]string{"user", "datname", "queryid", "query"},
|
[]string{"user", "datname", "queryid", "query", "stmt_type"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
statStatementsBlockReadSecondsTotal = prometheus.NewDesc(
|
statStatementsBlockReadSecondsTotal = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_read_seconds_total"),
|
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_read_seconds_total"),
|
||||||
"Total time the statement spent reading blocks, in seconds",
|
"Total time the statement spent reading blocks, in seconds",
|
||||||
[]string{"user", "datname", "queryid", "query"},
|
[]string{"user", "datname", "queryid", "query", "stmt_type"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
statStatementsBlockWriteSecondsTotal = prometheus.NewDesc(
|
statStatementsBlockWriteSecondsTotal = prometheus.NewDesc(
|
||||||
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_write_seconds_total"),
|
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_write_seconds_total"),
|
||||||
"Total time the statement spent writing blocks, in seconds",
|
"Total time the statement spent writing blocks, in seconds",
|
||||||
[]string{"user", "datname", "queryid", "query"},
|
[]string{"user", "datname", "queryid", "query", "stmt_type"},
|
||||||
prometheus.Labels{},
|
prometheus.Labels{},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -75,7 +75,14 @@ var (
|
|||||||
pg_get_userbyid(userid) as user,
|
pg_get_userbyid(userid) as user,
|
||||||
pg_database.datname,
|
pg_database.datname,
|
||||||
pg_stat_statements.queryid,
|
pg_stat_statements.queryid,
|
||||||
LEFT(pg_stat_statements.query, %d) as query,
|
LEFT(pg_stat_statements.query, 120) as query,
|
||||||
|
CASE
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'SELECT%' THEN 'SELECT'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'INSERT%' THEN 'INSERT'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'UPDATE%' THEN 'UPDATE'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'DELETE%' THEN 'DELETE'
|
||||||
|
ELSE 'OTHER'
|
||||||
|
END AS stmt_type,
|
||||||
pg_stat_statements.calls as calls_total,
|
pg_stat_statements.calls as calls_total,
|
||||||
pg_stat_statements.total_time / 1000.0 as seconds_total,
|
pg_stat_statements.total_time / 1000.0 as seconds_total,
|
||||||
pg_stat_statements.rows as rows_total,
|
pg_stat_statements.rows as rows_total,
|
||||||
@ -97,7 +104,14 @@ var (
|
|||||||
pg_get_userbyid(userid) as user,
|
pg_get_userbyid(userid) as user,
|
||||||
pg_database.datname,
|
pg_database.datname,
|
||||||
pg_stat_statements.queryid,
|
pg_stat_statements.queryid,
|
||||||
LEFT(pg_stat_statements.query, %d) as query,
|
LEFT(pg_stat_statements.query, 120) as query,
|
||||||
|
CASE
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'SELECT%' THEN 'SELECT'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'INSERT%' THEN 'INSERT'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'UPDATE%' THEN 'UPDATE'
|
||||||
|
WHEN pg_stat_statements.query ILIKE 'DELETE%' THEN 'DELETE'
|
||||||
|
ELSE 'OTHER'
|
||||||
|
END AS stmt_type,
|
||||||
pg_stat_statements.calls as calls_total,
|
pg_stat_statements.calls as calls_total,
|
||||||
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
|
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
|
||||||
pg_stat_statements.rows as rows_total,
|
pg_stat_statements.rows as rows_total,
|
||||||
@ -130,11 +144,11 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var user, datname, queryid, query sql.NullString
|
var user, datname, queryid, query, stmt_type sql.NullString
|
||||||
var callsTotal, rowsTotal sql.NullInt64
|
var callsTotal, rowsTotal sql.NullInt64
|
||||||
var secondsTotal, blockReadSecondsTotal, blockWriteSecondsTotal sql.NullFloat64
|
var secondsTotal, blockReadSecondsTotal, blockWriteSecondsTotal sql.NullFloat64
|
||||||
|
|
||||||
if err := rows.Scan(&user, &datname, &queryid, &query, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
|
if err := rows.Scan(&user, &datname, &queryid, &query, &stmt_type, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,7 +168,10 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
if query.Valid {
|
if query.Valid {
|
||||||
queryLabel = query.String
|
queryLabel = query.String
|
||||||
}
|
}
|
||||||
|
stmt_typeLabel := "unknown"
|
||||||
|
if stmt_type.Valid {
|
||||||
|
stmt_typeLabel = stmt_type.String
|
||||||
|
}
|
||||||
callsTotalMetric := 0.0
|
callsTotalMetric := 0.0
|
||||||
if callsTotal.Valid {
|
if callsTotal.Valid {
|
||||||
callsTotalMetric = float64(callsTotal.Int64)
|
callsTotalMetric = float64(callsTotal.Int64)
|
||||||
@ -163,7 +180,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
statStatementsCallsTotal,
|
statStatementsCallsTotal,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
callsTotalMetric,
|
callsTotalMetric,
|
||||||
userLabel, datnameLabel, queryidLabel, queryLabel,
|
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
|
||||||
)
|
)
|
||||||
|
|
||||||
secondsTotalMetric := 0.0
|
secondsTotalMetric := 0.0
|
||||||
@ -174,7 +191,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
statStatementsSecondsTotal,
|
statStatementsSecondsTotal,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
secondsTotalMetric,
|
secondsTotalMetric,
|
||||||
userLabel, datnameLabel, queryidLabel, queryLabel,
|
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
|
||||||
)
|
)
|
||||||
|
|
||||||
rowsTotalMetric := 0.0
|
rowsTotalMetric := 0.0
|
||||||
@ -185,7 +202,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
statStatementsRowsTotal,
|
statStatementsRowsTotal,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
rowsTotalMetric,
|
rowsTotalMetric,
|
||||||
userLabel, datnameLabel, queryidLabel, queryLabel,
|
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
|
||||||
)
|
)
|
||||||
|
|
||||||
blockReadSecondsTotalMetric := 0.0
|
blockReadSecondsTotalMetric := 0.0
|
||||||
@ -196,7 +213,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
statStatementsBlockReadSecondsTotal,
|
statStatementsBlockReadSecondsTotal,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
blockReadSecondsTotalMetric,
|
blockReadSecondsTotalMetric,
|
||||||
userLabel, datnameLabel, queryidLabel, queryLabel,
|
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
|
||||||
)
|
)
|
||||||
|
|
||||||
blockWriteSecondsTotalMetric := 0.0
|
blockWriteSecondsTotalMetric := 0.0
|
||||||
@ -207,7 +224,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
|
|||||||
statStatementsBlockWriteSecondsTotal,
|
statStatementsBlockWriteSecondsTotal,
|
||||||
prometheus.CounterValue,
|
prometheus.CounterValue,
|
||||||
blockWriteSecondsTotalMetric,
|
blockWriteSecondsTotalMetric,
|
||||||
userLabel, datnameLabel, queryidLabel, queryLabel,
|
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if err := rows.Err(); err != nil {
|
if err := rows.Err(); err != nil {
|
||||||
|
@ -32,9 +32,9 @@ func TestPGStateStatementsCollector(t *testing.T) {
|
|||||||
|
|
||||||
inst := &instance{db: db, version: semver.MustParse("12.0.0")}
|
inst := &instance{db: db, version: semver.MustParse("12.0.0")}
|
||||||
|
|
||||||
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
||||||
rows := sqlmock.NewRows(columns).
|
rows := sqlmock.NewRows(columns).
|
||||||
AddRow("postgres", "postgres", 1500, "SELECT", 5, 0.4, 100, 0.1, 0.2)
|
AddRow("postgres", "postgres", 1500, "SELECT", "SELECT", 5, 0.4, 100, 0.1, 0.2)
|
||||||
mock.ExpectQuery(sanitizeQuery(pgStatStatementsQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(pgStatStatementsQuery)).WillReturnRows(rows)
|
||||||
|
|
||||||
ch := make(chan prometheus.Metric)
|
ch := make(chan prometheus.Metric)
|
||||||
@ -48,11 +48,11 @@ func TestPGStateStatementsCollector(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
expected := []MetricResult{
|
expected := []MetricResult{
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
|
||||||
}
|
}
|
||||||
|
|
||||||
convey.Convey("Metrics comparison", t, func() {
|
convey.Convey("Metrics comparison", t, func() {
|
||||||
@ -75,9 +75,9 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
|
|||||||
|
|
||||||
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
|
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
|
||||||
|
|
||||||
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
||||||
rows := sqlmock.NewRows(columns).
|
rows := sqlmock.NewRows(columns).
|
||||||
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil)
|
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
|
||||||
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
|
||||||
|
|
||||||
ch := make(chan prometheus.Metric)
|
ch := make(chan prometheus.Metric)
|
||||||
@ -91,11 +91,11 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
expected := []MetricResult{
|
expected := []MetricResult{
|
||||||
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
|
||||||
}
|
}
|
||||||
|
|
||||||
convey.Convey("Metrics comparison", t, func() {
|
convey.Convey("Metrics comparison", t, func() {
|
||||||
@ -118,9 +118,9 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
|
|||||||
|
|
||||||
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
|
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
|
||||||
|
|
||||||
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
|
||||||
rows := sqlmock.NewRows(columns).
|
rows := sqlmock.NewRows(columns).
|
||||||
AddRow("postgres", "postgres", 1500, "SELECT", 5, 0.4, 100, 0.1, 0.2)
|
AddRow("postgres", "postgres", 1500, "SELECT", "SELECT", 5, 0.4, 100, 0.1, 0.2)
|
||||||
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
|
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
|
||||||
|
|
||||||
ch := make(chan prometheus.Metric)
|
ch := make(chan prometheus.Metric)
|
||||||
@ -134,11 +134,11 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
expected := []MetricResult{
|
expected := []MetricResult{
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
|
||||||
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
|
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
|
||||||
}
|
}
|
||||||
|
|
||||||
convey.Convey("Metrics comparison", t, func() {
|
convey.Convey("Metrics comparison", t, func() {
|
||||||
|
Loading…
Reference in New Issue
Block a user