Skip to content

Commit d6e4925

Browse files
author
nikolay.deryugin
committed
Append new query label
Signed-off-by: nikolay.deryugin <[email protected]>
1 parent 4e521d4 commit d6e4925

File tree

2 files changed

+41
-35
lines changed

2 files changed

+41
-35
lines changed

Diff for: collector/pg_stat_statements.go

+20-14
Original file line numberDiff line numberDiff line change
@@ -40,41 +40,42 @@ func NewPGStatStatementsCollector(config collectorConfig) (Collector, error) {
4040
}
4141

4242
var (
43-
statSTatementsCallsTotal = prometheus.NewDesc(
43+
statStatementsCallsTotal = prometheus.NewDesc(
4444
prometheus.BuildFQName(namespace, statStatementsSubsystem, "calls_total"),
4545
"Number of times executed",
46-
[]string{"user", "datname", "queryid"},
46+
[]string{"user", "datname", "queryid", "query"},
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"},
52+
[]string{"user", "datname", "queryid", "query"},
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"},
58+
[]string{"user", "datname", "queryid", "query"},
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"},
64+
[]string{"user", "datname", "queryid", "query"},
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"},
70+
[]string{"user", "datname", "queryid", "query"},
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+
pg_stat_statements.query as query,
7879
pg_stat_statements.calls as calls_total,
7980
pg_stat_statements.total_time / 1000.0 as seconds_total,
8081
pg_stat_statements.rows as rows_total,
@@ -96,6 +97,7 @@ var (
9697
pg_get_userbyid(userid) as user,
9798
pg_database.datname,
9899
pg_stat_statements.queryid,
100+
pg_stat_statements.query as query,
99101
pg_stat_statements.calls as calls_total,
100102
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
101103
pg_stat_statements.rows as rows_total,
@@ -128,11 +130,11 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
128130
}
129131
defer rows.Close()
130132
for rows.Next() {
131-
var user, datname, queryid sql.NullString
133+
var user, datname, queryid, query sql.NullString
132134
var callsTotal, rowsTotal sql.NullInt64
133135
var secondsTotal, blockReadSecondsTotal, blockWriteSecondsTotal sql.NullFloat64
134136

135-
if err := rows.Scan(&user, &datname, &queryid, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
137+
if err := rows.Scan(&user, &datname, &queryid, &query, &callsTotal, &secondsTotal, &rowsTotal, &blockReadSecondsTotal, &blockWriteSecondsTotal); err != nil {
136138
return err
137139
}
138140

@@ -148,16 +150,20 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
148150
if queryid.Valid {
149151
queryidLabel = queryid.String
150152
}
153+
queryLabel := "unknown"
154+
if query.Valid {
155+
queryLabel = query.String
156+
}
151157

152158
callsTotalMetric := 0.0
153159
if callsTotal.Valid {
154160
callsTotalMetric = float64(callsTotal.Int64)
155161
}
156162
ch <- prometheus.MustNewConstMetric(
157-
statSTatementsCallsTotal,
163+
statStatementsCallsTotal,
158164
prometheus.CounterValue,
159165
callsTotalMetric,
160-
userLabel, datnameLabel, queryidLabel,
166+
userLabel, datnameLabel, queryidLabel, queryLabel,
161167
)
162168

163169
secondsTotalMetric := 0.0
@@ -168,7 +174,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
168174
statStatementsSecondsTotal,
169175
prometheus.CounterValue,
170176
secondsTotalMetric,
171-
userLabel, datnameLabel, queryidLabel,
177+
userLabel, datnameLabel, queryidLabel, queryLabel,
172178
)
173179

174180
rowsTotalMetric := 0.0
@@ -179,7 +185,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
179185
statStatementsRowsTotal,
180186
prometheus.CounterValue,
181187
rowsTotalMetric,
182-
userLabel, datnameLabel, queryidLabel,
188+
userLabel, datnameLabel, queryidLabel, queryLabel,
183189
)
184190

185191
blockReadSecondsTotalMetric := 0.0
@@ -190,7 +196,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
190196
statStatementsBlockReadSecondsTotal,
191197
prometheus.CounterValue,
192198
blockReadSecondsTotalMetric,
193-
userLabel, datnameLabel, queryidLabel,
199+
userLabel, datnameLabel, queryidLabel, queryLabel,
194200
)
195201

196202
blockWriteSecondsTotalMetric := 0.0
@@ -201,7 +207,7 @@ func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance,
201207
statStatementsBlockWriteSecondsTotal,
202208
prometheus.CounterValue,
203209
blockWriteSecondsTotalMetric,
204-
userLabel, datnameLabel, queryidLabel,
210+
userLabel, datnameLabel, queryidLabel, queryLabel,
205211
)
206212
}
207213
if err := rows.Err(); err != nil {

Diff for: 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", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
35+
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
3636
rows := sqlmock.NewRows(columns).
37-
AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
37+
AddRow("postgres", "postgres", 1500, "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", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
52-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
53-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
54-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
55-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
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},
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", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
78+
columns := []string{"user", "datname", "queryid", "query", "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)
80+
AddRow(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", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
95-
{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
96-
{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
97-
{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
98-
{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
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},
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", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
121+
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
122122
rows := sqlmock.NewRows(columns).
123-
AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
123+
AddRow("postgres", "postgres", 1500, "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", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
138-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
139-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
140-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
141-
{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
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},
142142
}
143143

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

0 commit comments

Comments
 (0)