Skip to content

Commit fecb070

Browse files
author
Deryugin, Nikolay
committed
Add labels SELECT|INSERT|UPDATE|DELETE|OTHER
1 parent 98819bd commit fecb070

File tree

2 files changed

+53
-36
lines changed

2 files changed

+53
-36
lines changed

collector/pg_stat_statements.go

+32-15
Original file line numberDiff line numberDiff line change
@@ -43,39 +43,46 @@ var (
4343
statStatementsCallsTotal = prometheus.NewDesc(
4444
prometheus.BuildFQName(namespace, statStatementsSubsystem, "calls_total"),
4545
"Number of times executed",
46-
[]string{"user", "datname", "queryid", "query"},
46+
[]string{"user", "datname", "queryid", "query", "stmt_type"},
4747
prometheus.Labels{},
4848
)
4949
statStatementsSecondsTotal = prometheus.NewDesc(
5050
prometheus.BuildFQName(namespace, statStatementsSubsystem, "seconds_total"),
5151
"Total time spent in the statement, in seconds",
52-
[]string{"user", "datname", "queryid", "query"},
52+
[]string{"user", "datname", "queryid", "query", "stmt_type"},
5353
prometheus.Labels{},
5454
)
5555
statStatementsRowsTotal = prometheus.NewDesc(
5656
prometheus.BuildFQName(namespace, statStatementsSubsystem, "rows_total"),
5757
"Total number of rows retrieved or affected by the statement",
58-
[]string{"user", "datname", "queryid", "query"},
58+
[]string{"user", "datname", "queryid", "query", "stmt_type"},
5959
prometheus.Labels{},
6060
)
6161
statStatementsBlockReadSecondsTotal = prometheus.NewDesc(
6262
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_read_seconds_total"),
6363
"Total time the statement spent reading blocks, in seconds",
64-
[]string{"user", "datname", "queryid", "query"},
64+
[]string{"user", "datname", "queryid", "query", "stmt_type"},
6565
prometheus.Labels{},
6666
)
6767
statStatementsBlockWriteSecondsTotal = prometheus.NewDesc(
6868
prometheus.BuildFQName(namespace, statStatementsSubsystem, "block_write_seconds_total"),
6969
"Total time the statement spent writing blocks, in seconds",
70-
[]string{"user", "datname", "queryid", "query"},
70+
[]string{"user", "datname", "queryid", "query", "stmt_type"},
7171
prometheus.Labels{},
7272
)
7373

7474
pgStatStatementsQuery = `SELECT
7575
pg_get_userbyid(userid) as user,
7676
pg_database.datname,
7777
pg_stat_statements.queryid,
78-
LEFT(pg_stat_statements.query, %d) as query,
78+
LEFT(pg_stat_statements.query, 120) as query,
79+
CASE
80+
WHEN pg_stat_statements.query ILIKE 'SELECT%' THEN 'SELECT'
81+
WHEN pg_stat_statements.query ILIKE 'INSERT%' THEN 'INSERT'
82+
WHEN pg_stat_statements.query ILIKE 'UPDATE%' THEN 'UPDATE'
83+
WHEN pg_stat_statements.query ILIKE 'DELETE%' THEN 'DELETE'
84+
ELSE 'OTHER'
85+
END AS stmt_type,
7986
pg_stat_statements.calls as calls_total,
8087
pg_stat_statements.total_time / 1000.0 as seconds_total,
8188
pg_stat_statements.rows as rows_total,
@@ -97,7 +104,14 @@ var (
97104
pg_get_userbyid(userid) as user,
98105
pg_database.datname,
99106
pg_stat_statements.queryid,
100-
LEFT(pg_stat_statements.query, %d) as query,
107+
LEFT(pg_stat_statements.query, 120) as query,
108+
CASE
109+
WHEN pg_stat_statements.query ILIKE 'SELECT%' THEN 'SELECT'
110+
WHEN pg_stat_statements.query ILIKE 'INSERT%' THEN 'INSERT'
111+
WHEN pg_stat_statements.query ILIKE 'UPDATE%' THEN 'UPDATE'
112+
WHEN pg_stat_statements.query ILIKE 'DELETE%' THEN 'DELETE'
113+
ELSE 'OTHER'
114+
END AS stmt_type,
101115
pg_stat_statements.calls as calls_total,
102116
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
103117
pg_stat_statements.rows as rows_total,
@@ -130,11 +144,11 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
130144
}
131145
defer rows.Close()
132146
for rows.Next() {
133-
var user, datname, queryid, query sql.NullString
147+
var user, datname, queryid, query, stmt_type sql.NullString
134148
var callsTotal, rowsTotal sql.NullInt64
135149
var secondsTotal, blockReadSecondsTotal, blockWriteSecondsTotal sql.NullFloat64
136150

137-
if err := rows.Scan(&user, &datname, &queryid, &query, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
151+
if err := rows.Scan(&user, &datname, &queryid, &query, &stmt_type, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
138152
return err
139153
}
140154

@@ -154,7 +168,10 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
154168
if query.Valid {
155169
queryLabel = query.String
156170
}
157-
171+
stmt_typeLabel := "unknown"
172+
if stmt_type.Valid {
173+
stmt_typeLabel = stmt_type.String
174+
}
158175
callsTotalMetric := 0.0
159176
if callsTotal.Valid {
160177
callsTotalMetric = float64(callsTotal.Int64)
@@ -163,7 +180,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
163180
statStatementsCallsTotal,
164181
prometheus.CounterValue,
165182
callsTotalMetric,
166-
userLabel, datnameLabel, queryidLabel, queryLabel,
183+
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
167184
)
168185

169186
secondsTotalMetric := 0.0
@@ -174,7 +191,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
174191
statStatementsSecondsTotal,
175192
prometheus.CounterValue,
176193
secondsTotalMetric,
177-
userLabel, datnameLabel, queryidLabel, queryLabel,
194+
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
178195
)
179196

180197
rowsTotalMetric := 0.0
@@ -185,7 +202,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
185202
statStatementsRowsTotal,
186203
prometheus.CounterValue,
187204
rowsTotalMetric,
188-
userLabel, datnameLabel, queryidLabel, queryLabel,
205+
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
189206
)
190207

191208
blockReadSecondsTotalMetric := 0.0
@@ -196,7 +213,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
196213
statStatementsBlockReadSecondsTotal,
197214
prometheus.CounterValue,
198215
blockReadSecondsTotalMetric,
199-
userLabel, datnameLabel, queryidLabel, queryLabel,
216+
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
200217
)
201218

202219
blockWriteSecondsTotalMetric := 0.0
@@ -207,7 +224,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
207224
statStatementsBlockWriteSecondsTotal,
208225
prometheus.CounterValue,
209226
blockWriteSecondsTotalMetric,
210-
userLabel, datnameLabel, queryidLabel, queryLabel,
227+
userLabel, datnameLabel, queryidLabel, queryLabel, stmt_typeLabel,
211228
)
212229
}
213230
if err := rows.Err(); err != nil {

collector/pg_stat_statements_test.go

+21-21
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ func TestPGStateStatementsCollector(t *testing.T) {
3232

3333
inst := &instance{db: db, version: semver.MustParse("12.0.0")}
3434

35-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
35+
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
3636
rows := sqlmock.NewRows(columns).
37-
AddRow("postgres", "postgres", 1500, "SELECT", 5, 0.4, 100, 0.1, 0.2)
37+
AddRow("postgres", "postgres", 1500, "SELECT", "SELECT", 5, 0.4, 100, 0.1, 0.2)
3838
mock.ExpectQuery(sanitizeQuery(pgStatStatementsQuery)).WillReturnRows(rows)
3939

4040
ch := make(chan prometheus.Metric)
@@ -48,11 +48,11 @@ func TestPGStateStatementsCollector(t *testing.T) {
4848
}()
4949

5050
expected := []MetricResult{
51-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
52-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
53-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
54-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
55-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
51+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
52+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
53+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
54+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
55+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
5656
}
5757

5858
convey.Convey("Metrics comparison", t, func() {
@@ -75,9 +75,9 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
7575

7676
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
7777

78-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
78+
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
7979
rows := sqlmock.NewRows(columns).
80-
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil)
80+
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
8181
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
8282

8383
ch := make(chan prometheus.Metric)
@@ -91,11 +91,11 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
9191
}()
9292

9393
expected := []MetricResult{
94-
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
95-
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
96-
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
97-
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
98-
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
94+
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
95+
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
96+
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
97+
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
98+
{labels: labelMap{"user": "unknown", "datname": "unknown", "query": "unknown", "stmt_type": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
9999
}
100100

101101
convey.Convey("Metrics comparison", t, func() {
@@ -118,9 +118,9 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
118118

119119
inst := &instance{db: db, version: semver.MustParse("13.3.7")}
120120

121-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
121+
columns := []string{"user", "datname", "queryid", "query", "stmt_type", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
122122
rows := sqlmock.NewRows(columns).
123-
AddRow("postgres", "postgres", 1500, "SELECT", 5, 0.4, 100, 0.1, 0.2)
123+
AddRow("postgres", "postgres", 1500, "SELECT", "SELECT", 5, 0.4, 100, 0.1, 0.2)
124124
mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
125125

126126
ch := make(chan prometheus.Metric)
@@ -134,11 +134,11 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
134134
}()
135135

136136
expected := []MetricResult{
137-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
138-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
139-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
140-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
141-
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
137+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
138+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
139+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
140+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
141+
{labels: labelMap{"user": "postgres", "datname": "postgres", "query": "SELECT", "stmt_type": "SELECT", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
142142
}
143143

144144
convey.Convey("Metrics comparison", t, func() {

0 commit comments

Comments
 (0)