@@ -115,6 +115,7 @@ type UserQuery struct {
115
115
Metrics []Mapping `yaml:"metrics"`
116
116
Master bool `yaml:"master"` // Querying only for master database
117
117
CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
118
+ RunOnServer string `yaml:"runonserver"` // Querying to run on which server version
118
119
}
119
120
120
121
// nolint: golint
@@ -155,6 +156,7 @@ type intermediateMetricMap struct {
155
156
columnMappings map [string ]ColumnMapping
156
157
master bool
157
158
cacheSeconds uint64
159
+ runonserver string
158
160
}
159
161
160
162
// MetricMapNamespace groups metric maps under a shared set of labels.
@@ -163,6 +165,7 @@ type MetricMapNamespace struct {
163
165
columnMappings map [string ]MetricMap // Column mappings in this namespace
164
166
master bool // Call query only for master database
165
167
cacheSeconds uint64 // Number of seconds this metric namespace can be cached. 0 disables.
168
+ runonserver string // Run the query on which server version
166
169
}
167
170
168
171
// MetricMap stores the prometheus metric description which a given column will
@@ -221,6 +224,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
221
224
},
222
225
true ,
223
226
0 ,
227
+ "all" ,
224
228
},
225
229
"pg_stat_database" : {
226
230
map [string ]ColumnMapping {
@@ -246,6 +250,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
246
250
},
247
251
true ,
248
252
0 ,
253
+ "all" ,
249
254
},
250
255
"pg_stat_database_conflicts" : {
251
256
map [string ]ColumnMapping {
@@ -259,6 +264,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
259
264
},
260
265
true ,
261
266
0 ,
267
+ "all" ,
262
268
},
263
269
"pg_locks" : {
264
270
map [string ]ColumnMapping {
@@ -268,6 +274,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
268
274
},
269
275
true ,
270
276
0 ,
277
+ "all" ,
271
278
},
272
279
"pg_stat_replication" : {
273
280
map [string ]ColumnMapping {
@@ -314,6 +321,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
314
321
},
315
322
true ,
316
323
0 ,
324
+ "all" ,
317
325
},
318
326
"pg_stat_archiver" : {
319
327
map [string ]ColumnMapping {
@@ -328,6 +336,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
328
336
},
329
337
true ,
330
338
0 ,
339
+ "all" ,
331
340
},
332
341
"pg_stat_activity" : {
333
342
map [string ]ColumnMapping {
@@ -338,6 +347,7 @@ var builtinMetricMaps = map[string]intermediateMetricMap{
338
347
},
339
348
true ,
340
349
0 ,
350
+ "all" ,
341
351
},
342
352
}
343
353
@@ -494,6 +504,7 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
494
504
return nil , nil , err
495
505
}
496
506
507
+
497
508
// Stores the loaded map representation
498
509
metricMaps := make (map [string ]intermediateMetricMap )
499
510
newQueryOverrides := make (map [string ]string )
@@ -509,6 +520,7 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
509
520
columnMappings : newMetricMap ,
510
521
master : specs .Master ,
511
522
cacheSeconds : specs .CacheSeconds ,
523
+ runonserver : specs .RunOnServer ,
512
524
}
513
525
metricMaps [metric ] = metricMap
514
526
}
@@ -678,7 +690,7 @@ func makeDescMap(pgVersion semver.Version, serverLabels prometheus.Labels, metri
678
690
}
679
691
}
680
692
681
- metricMap [namespace ] = MetricMapNamespace {variableLabels , thisMap , intermediateMappings .master , intermediateMappings .cacheSeconds }
693
+ metricMap [namespace ] = MetricMapNamespace {variableLabels , thisMap , intermediateMappings .master , intermediateMappings .cacheSeconds , intermediateMappings . runonserver }
682
694
}
683
695
684
696
return metricMap
@@ -835,6 +847,8 @@ type Server struct {
835
847
db * sql.DB
836
848
labels prometheus.Labels
837
849
master bool
850
+ runonserver string
851
+ serverversion string
838
852
839
853
// Last version used to calculate metric map. If mismatch on scrape,
840
854
// then maps are recalculated.
@@ -880,6 +894,7 @@ func NewServer(dsn string, opts ...ServerOpt) (*Server, error) {
880
894
s := & Server {
881
895
db : db ,
882
896
master : false ,
897
+ runonserver : "all" ,
883
898
labels : prometheus.Labels {
884
899
serverLabelName : fingerprint ,
885
900
},
@@ -1327,6 +1342,12 @@ func queryNamespaceMappings(ch chan<- prometheus.Metric, server *Server) map[str
1327
1342
continue
1328
1343
}
1329
1344
1345
+ // check if the query is to be run on specific server version or not
1346
+ if len (mapping .runonserver ) > 0 && ! strings .Contains (mapping .runonserver , "all" ) && ! strings .Contains (server .serverversion , mapping .runonserver ) {
1347
+ log .Debugln ("Query skipped for database version: [%s] as it should be run on database server version: [%s]" , server .serverversion , mapping .runonserver )
1348
+ continue
1349
+ }
1350
+
1330
1351
scrapeMetric := false
1331
1352
// Check if the metric is cached
1332
1353
server .cacheMtx .Lock ()
@@ -1415,6 +1436,7 @@ func (e *Exporter) checkMapVersions(ch chan<- prometheus.Metric, server *Server)
1415
1436
}
1416
1437
1417
1438
server .lastMapVersion = semanticVersion
1439
+ server .serverversion = semanticVersion .String ()
1418
1440
1419
1441
if e .userQueriesPath != "" {
1420
1442
// Clear the metric while a reload is happening
0 commit comments