@@ -119,11 +119,12 @@ type Mapping map[string]MappingOptions
119119
120120// nolint: golint
121121type 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
127128}
128129
129130// nolint: golint
@@ -517,7 +518,7 @@ func makeQueryOverrideMap(pgVersion semver.Version, queryOverrides map[string][]
517518 return resultMap
518519}
519520
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 ) {
521522 var userQueries UserQueries
522523
523524 err := yaml .Unmarshal (content , & userQueries )
@@ -532,6 +533,30 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
532533 for metric , specs := range userQueries {
533534 level .Debug (logger ).Log ("msg" , "New user metric namespace from YAML metric" , "metric" , metric , "cache_seconds" , specs .CacheSeconds )
534535 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+
535560 metricMap , ok := metricMaps [metric ]
536561 if ! ok {
537562 // Namespace for metric not found - add it.
@@ -571,7 +596,7 @@ func parseUserQueries(content []byte) (map[string]intermediateMetricMap, map[str
571596// TODO: test code for all cu.
572597// TODO: the YAML this supports is "non-standard" - we should move away from it.
573598func addQueries (content []byte , pgVersion semver.Version , server * Server ) error {
574- metricMaps , newQueryOverrides , err := parseUserQueries (content )
599+ metricMaps , newQueryOverrides , err := parseUserQueries (content , pgVersion )
575600 if err != nil {
576601 return err
577602 }
0 commit comments