@@ -119,11 +119,12 @@ type Mapping map[string]MappingOptions
119
119
120
120
// nolint: golint
121
121
type UserQuery struct {
122
- Query string `yaml:"query"`
123
- Metrics []Mapping `yaml:"metrics"`
124
- Master bool `yaml:"master"` // Querying only for master database
125
- CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
126
- RunOnServer string `yaml:"runonserver"` // Querying to run on which server version
122
+ Query string `yaml:"query"`
123
+ Metrics []Mapping `yaml:"metrics"`
124
+ BreakingChanges []BreakingChanges `yaml:"breakingChanges"`
125
+ Master bool `yaml:"master"` // Querying only for master database
126
+ CacheSeconds uint64 `yaml:"cache_seconds"` // Number of seconds to cache the namespace result metrics for.
127
+ RunOnServer string `yaml:"runonserver"` // Querying to run on which server version
127
128
}
128
129
129
130
// nolint: golint
@@ -517,7 +518,7 @@ func makeQueryOverrideMap(pgVersion semver.Version, queryOverrides map[string][]
517
518
return resultMap
518
519
}
519
520
520
- func parseUserQueries (content []byte ) (map [string ]intermediateMetricMap , map [string ]string , error ) {
521
+ func parseUserQueries (content []byte , pgVersion semver. Version ) (map [string ]intermediateMetricMap , map [string ]string , error ) {
521
522
var userQueries UserQueries
522
523
523
524
err := yaml .Unmarshal (content , & userQueries )
@@ -532,6 +533,30 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
532
533
for metric , specs := range userQueries {
533
534
level .Debug (logger ).Log ("msg" , "New user metric namespace from YAML metric" , "metric" , metric , "cache_seconds" , specs .CacheSeconds )
534
535
newQueryOverrides [metric ] = specs .Query
536
+ columnT := make (map [string ]string )
537
+ for i := range specs .BreakingChanges {
538
+ if err := specs .BreakingChanges [i ].parseVerTolerant (); err != nil {
539
+ return nil , nil , err
540
+ }
541
+
542
+ if pgVersion .GE (specs .BreakingChanges [i ].ver ) {
543
+ for t := range specs .BreakingChanges [i ].Columns {
544
+ columnT [t ] = specs .BreakingChanges [i ].Columns [t ]
545
+ }
546
+ }
547
+ }
548
+
549
+ // nolint: golint
550
+ // 2 because old - new
551
+ oldnew := make ([]string , 0 , 2 * len (columnT ))
552
+ for t := range columnT {
553
+ oldnew = append (oldnew , t , columnT [t ])
554
+ }
555
+
556
+ r := strings .NewReplacer (oldnew ... )
557
+
558
+ newQueryOverrides [metric ] = r .Replace (newQueryOverrides [metric ])
559
+
535
560
metricMap , ok := metricMaps [metric ]
536
561
if ! ok {
537
562
// Namespace for metric not found - add it.
@@ -571,7 +596,7 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
571
596
// TODO: test code for all cu.
572
597
// TODO: the YAML this supports is "non-standard" - we should move away from it.
573
598
func addQueries (content []byte , pgVersion semver.Version , server * Server ) error {
574
- metricMaps , newQueryOverrides , err := parseUserQueries (content )
599
+ metricMaps , newQueryOverrides , err := parseUserQueries (content , pgVersion )
575
600
if err != nil {
576
601
return err
577
602
}
0 commit comments