Skip to content

Commit bc3ef78

Browse files
committed
added version
Signed-off-by: vl4deee11 <[email protected]>
1 parent df461c2 commit bc3ef78

File tree

4 files changed

+66
-9
lines changed

4 files changed

+66
-9
lines changed

cmd/postgres_exporter/postgres_exporter_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ func (s *FunctionalSuite) TestBooleanConversionToValueAndString(c *C) {
410410
func (s *FunctionalSuite) TestParseUserQueries(c *C) {
411411
userQueriesData, err := ioutil.ReadFile("./tests/user_queries_ok.yaml")
412412
if err == nil {
413-
metricMaps, newQueryOverrides, err := parseUserQueries(userQueriesData)
413+
metricMaps, newQueryOverrides, err := parseUserQueries(userQueriesData, semver.Version{Major: 13})
414414
c.Assert(err, Equals, nil)
415415
c.Assert(metricMaps, NotNil)
416416
c.Assert(newQueryOverrides, NotNil)

cmd/postgres_exporter/queries.go

+29-8
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,32 @@ import (
2424

2525
// UserQuery represents a user defined query
2626
type UserQuery struct {
27-
Query string `yaml:"query"`
28-
Metrics []Mapping `yaml:"metrics"`
29-
Master bool `yaml:"master"` // Querying only for master database
30-
CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
31-
RunOnServer string `yaml:"runonserver"` // Querying to run on which server version
27+
Query string `yaml:"query"`
28+
Metrics []Mapping `yaml:"metrics"`
29+
VersionQueries []VersionQ `yaml:"versionQueries"`
30+
Master bool `yaml:"master"` // Querying only for master database
31+
CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
32+
RunOnServer string `yaml:"runonserver"` // Querying to run on which server version
3233
}
3334

3435
// UserQueries represents a set of UserQuery objects
3536
type UserQueries map[string]UserQuery
3637

38+
func (uq *UserQuery) getVersionedQuery(pgVersion semver.Version) (string, error) {
39+
r := uq.Query
40+
if len(uq.VersionQueries) != 0 {
41+
for i := range uq.VersionQueries {
42+
if err := uq.VersionQueries[i].parseVerTolerant(); err != nil {
43+
return "", err
44+
}
45+
if pgVersion.GE(uq.VersionQueries[i].ver) {
46+
r = uq.VersionQueries[i].Query
47+
}
48+
}
49+
}
50+
return r, nil
51+
}
52+
3753
// OverrideQuery 's are run in-place of simple namespace look ups, and provide
3854
// advanced functionality. But they have a tendency to postgres version specific.
3955
// There aren't too many versions, so we simply store customized versions using
@@ -197,7 +213,7 @@ func makeQueryOverrideMap(pgVersion semver.Version, queryOverrides map[string][]
197213
return resultMap
198214
}
199215

200-
func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[string]string, error) {
216+
func parseUserQueries(content []byte, pgVersion semver.Version) (map[string]intermediateMetricMap, map[string]string, error) {
201217
var userQueries UserQueries
202218

203219
err := yaml.Unmarshal(content, &userQueries)
@@ -211,7 +227,12 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
211227

212228
for metric, specs := range userQueries {
213229
level.Debug(logger).Log("msg", "New user metric namespace from YAML metric", "metric", metric, "cache_seconds", specs.CacheSeconds)
214-
newQueryOverrides[metric] = specs.Query
230+
versionQuery, err := specs.getVersionedQuery(pgVersion)
231+
if err != nil {
232+
return nil, nil, err
233+
}
234+
newQueryOverrides[metric] = versionQuery
235+
215236
metricMap, ok := metricMaps[metric]
216237
if !ok {
217238
// Namespace for metric not found - add it.
@@ -251,7 +272,7 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
251272
// TODO: test code for all cu.
252273
// TODO: the YAML this supports is "non-standard" - we should move away from it.
253274
func addQueries(content []byte, pgVersion semver.Version, server *Server) error {
254-
metricMaps, newQueryOverrides, err := parseUserQueries(content)
275+
metricMaps, newQueryOverrides, err := parseUserQueries(content, pgVersion)
255276
if err != nil {
256277
return err
257278
}

cmd/postgres_exporter/versionq.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2021 The Prometheus Authors
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
package main
14+
15+
import (
16+
"github.com/blang/semver"
17+
)
18+
19+
type VersionQ struct {
20+
Version string `yaml:"version"`
21+
ver semver.Version
22+
Query string `yaml:"query"`
23+
}
24+
25+
func (v *VersionQ) parseVerTolerant() error {
26+
bcVer, err := semver.ParseTolerant(v.Version)
27+
if err != nil {
28+
return err
29+
}
30+
v.ver = bcVer
31+
return nil
32+
}

queries.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ pg_database:
159159
description: "Disk space used by the database"
160160

161161
pg_stat_statements:
162+
versionQueries:
163+
# should be in asc order by version
164+
- version: '13.0.0'
165+
query: "SELECT t2.rolname, t3.datname, queryid, calls, total_exec_time / 1000 as total_time_seconds, min_exec_time / 1000 as min_time_seconds, max_exec_time / 1000 as max_time_seconds, mean_exec_time / 1000 as mean_time_seconds, stddev_exec_time / 1000 as stddev_time_seconds, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time / 1000 as blk_read_time_seconds, blk_write_time / 1000 as blk_write_time_seconds FROM pg_stat_statements t1 JOIN pg_roles t2 ON (t1.userid=t2.oid) JOIN pg_database t3 ON (t1.dbid=t3.oid) WHERE t2.rolname != 'rdsadmin'"
162166
query: "SELECT t2.rolname, t3.datname, queryid, calls, total_time / 1000 as total_time_seconds, min_time / 1000 as min_time_seconds, max_time / 1000 as max_time_seconds, mean_time / 1000 as mean_time_seconds, stddev_time / 1000 as stddev_time_seconds, rows, shared_blks_hit, shared_blks_read, shared_blks_dirtied, shared_blks_written, local_blks_hit, local_blks_read, local_blks_dirtied, local_blks_written, temp_blks_read, temp_blks_written, blk_read_time / 1000 as blk_read_time_seconds, blk_write_time / 1000 as blk_write_time_seconds FROM pg_stat_statements t1 JOIN pg_roles t2 ON (t1.userid=t2.oid) JOIN pg_database t3 ON (t1.dbid=t3.oid) WHERE t2.rolname != 'rdsadmin'"
163167
master: true
164168
metrics:

0 commit comments

Comments
 (0)