Skip to content

Commit ba528dd

Browse files
author
Jakub Štiller
committed
Dynamic statement length.
1 parent e5cca16 commit ba528dd

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed

collector/collector.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ const (
3838
// Namespace for all metrics.
3939
namespace = "pg"
4040

41-
defaultEnabled = true
42-
defaultDisabled = false
41+
collectorFlagPrefix = "collector."
42+
defaultEnabled = true
43+
defaultDisabled = false
4344
)
4445

4546
var (
@@ -75,7 +76,7 @@ func registerCollector(name string, isDefaultEnabled bool, createFunc func(colle
7576
}
7677

7778
// Create flag for this collector
78-
flagName := fmt.Sprintf("collector.%s", name)
79+
flagName := fmt.Sprint(collectorFlagPrefix, name)
7980
flagHelp := fmt.Sprintf("Enable the %s collector (default: %s).", name, helpDefaultState)
8081
defaultValue := fmt.Sprintf("%v", isDefaultEnabled)
8182

collector/pg_stat_statements.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,40 @@ import (
2525

2626
const statStatementsSubsystem = "stat_statements"
2727

28-
var includeQueryFlag *bool = nil
28+
var (
29+
includeQueryFlag *bool = nil
30+
statementLengthFlag *uint = nil
31+
)
2932

3033
func init() {
3134
// WARNING:
3235
// Disabled by default because this set of metrics can be quite expensive on a busy server
3336
// Every unique query will cause a new timeseries to be created
3437
registerCollector(statStatementsSubsystem, defaultDisabled, NewPGStatStatementsCollector)
3538

36-
flagName := fmt.Sprintf("collector.%s.include_query", statStatementsSubsystem)
37-
flagHelp := "Enable selecting statement query together with queryId. (default: false)"
38-
defaultValue := fmt.Sprintf("%v", defaultDisabled)
39-
includeQueryFlag = kingpin.Flag(flagName, flagHelp).Default(defaultValue).Bool()
39+
includeQueryFlag = kingpin.Flag(
40+
fmt.Sprint(collectorFlagPrefix, statStatementsSubsystem, ".include_query"),
41+
"Enable selecting statement query together with queryId. (default: disabled)").
42+
Default(fmt.Sprintf("%v", defaultDisabled)).
43+
Bool()
44+
statementLengthFlag = kingpin.Flag(
45+
fmt.Sprint(collectorFlagPrefix, statStatementsSubsystem, ".query_length"),
46+
"Maximum length of the statement text.").
47+
Default("120").
48+
Uint()
4049
}
4150

4251
type PGStatStatementsCollector struct {
4352
log log.Logger
4453
includeQueryStatement bool
54+
statementLength uint
4555
}
4656

4757
func NewPGStatStatementsCollector(config collectorConfig) (Collector, error) {
4858
return &PGStatStatementsCollector{
4959
log: config.logger,
5060
includeQueryStatement: *includeQueryFlag,
61+
statementLength: *statementLengthFlag,
5162
}, nil
5263
}
5364

@@ -89,8 +100,10 @@ var (
89100
[]string{"queryid", "query"},
90101
prometheus.Labels{},
91102
)
103+
)
92104

93-
pgStatStatementQuerySelect = "LEFT(pg_stat_statements.query, 120) as query,"
105+
const (
106+
pgStatStatementQuerySelect = `LEFT(pg_stat_statements.query, %d) as query,`
94107

95108
pgStatStatementsQuery = `SELECT
96109
pg_get_userbyid(userid) as user,
@@ -144,7 +157,7 @@ func (c PGStatStatementsCollector) Update(ctx context.Context, instance *instanc
144157
}
145158
var querySelect = ""
146159
if c.includeQueryStatement {
147-
querySelect = pgStatStatementQuerySelect
160+
querySelect = fmt.Sprintf(pgStatStatementQuerySelect, c.statementLength)
148161
}
149162
query := fmt.Sprintf(queryTemplate, querySelect)
150163

collector/pg_stat_statements_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ func TestPGStateStatementsCollectorWithStatement(t *testing.T) {
7676

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

79-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
79+
columns := []string{"user", "datname", "queryid", "LEFT(pg_stat_statements.query, 100) as query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
8080
rows := sqlmock.NewRows(columns).
8181
AddRow("postgres", "postgres", 1500, "select 1 from foo", 5, 0.4, 100, 0.1, 0.2)
82-
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsQuery, pgStatStatementQuerySelect))).WillReturnRows(rows)
82+
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsQuery, fmt.Sprintf(pgStatStatementQuerySelect, 100)))).WillReturnRows(rows)
8383

8484
ch := make(chan prometheus.Metric)
8585
go func() {
8686
defer close(ch)
87-
c := PGStatStatementsCollector{includeQueryStatement: true}
87+
c := PGStatStatementsCollector{includeQueryStatement: true, statementLength: 100}
8888

8989
if err := c.Update(context.Background(), inst, ch); err != nil {
9090
t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
@@ -163,15 +163,15 @@ func TestPGStateStatementsCollectorNullWithStatement(t *testing.T) {
163163

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

166-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
166+
columns := []string{"user", "datname", "queryid", "LEFT(pg_stat_statements.query, 200) as query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
167167
rows := sqlmock.NewRows(columns).
168168
AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil)
169-
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsNewQuery, pgStatStatementQuerySelect))).WillReturnRows(rows)
169+
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsNewQuery, fmt.Sprintf(pgStatStatementQuerySelect, 200)))).WillReturnRows(rows)
170170

171171
ch := make(chan prometheus.Metric)
172172
go func() {
173173
defer close(ch)
174-
c := PGStatStatementsCollector{includeQueryStatement: true}
174+
c := PGStatStatementsCollector{includeQueryStatement: true, statementLength: 200}
175175

176176
if err := c.Update(context.Background(), inst, ch); err != nil {
177177
t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
@@ -250,15 +250,15 @@ func TestPGStateStatementsCollectorNewPGWithStatement(t *testing.T) {
250250

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

253-
columns := []string{"user", "datname", "queryid", "query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
253+
columns := []string{"user", "datname", "queryid", "LEFT(pg_stat_statements.query, 300) as query", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
254254
rows := sqlmock.NewRows(columns).
255255
AddRow("postgres", "postgres", 1500, "select 1 from foo", 5, 0.4, 100, 0.1, 0.2)
256-
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsNewQuery, pgStatStatementQuerySelect))).WillReturnRows(rows)
256+
mock.ExpectQuery(sanitizeQuery(fmt.Sprintf(pgStatStatementsNewQuery, fmt.Sprintf(pgStatStatementQuerySelect, 300)))).WillReturnRows(rows)
257257

258258
ch := make(chan prometheus.Metric)
259259
go func() {
260260
defer close(ch)
261-
c := PGStatStatementsCollector{includeQueryStatement: true}
261+
c := PGStatStatementsCollector{includeQueryStatement: true, statementLength: 300}
262262

263263
if err := c.Update(context.Background(), inst, ch); err != nil {
264264
t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)

0 commit comments

Comments
 (0)