bosun.org@v0.0.0-20250213104149-b8d3e981f37d/cmd/tsdbrelay/denormalize/denormalization.go (about) 1 package denormalize 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 8 "bosun.org/opentsdb" 9 ) 10 11 type DenormalizationRule struct { 12 Metric string 13 TagNames []string 14 } 15 16 func (d *DenormalizationRule) String() string { 17 inputTags, outputTags := "", "" 18 val := 'a' 19 for i, tagk := range d.TagNames { 20 if i != 0 { 21 inputTags += "," 22 outputTags += "." 23 } 24 inputTags += fmt.Sprintf("%s=%s", tagk, string(val)) 25 outputTags += fmt.Sprintf("%s", string(val)) 26 val++ 27 } 28 return fmt.Sprintf("%s{%s} -> __%s.%s", d.Metric, inputTags, outputTags, d.Metric) 29 } 30 31 func ParseDenormalizationRules(config string) (map[string]*DenormalizationRule, error) { 32 m := make(map[string]*DenormalizationRule) 33 rules := strings.Split(config, ",") 34 for _, r := range rules { 35 parts := strings.Split(r, "__") 36 if len(parts) < 2 { 37 return nil, fmt.Errorf("Denormalization rules must have at least one tag name specified.") 38 } 39 rule := &DenormalizationRule{Metric: parts[0]} 40 rule.TagNames = append(rule.TagNames, parts[1:]...) 41 log.Println("Denormalizing", rule) 42 m[rule.Metric] = rule 43 } 44 return m, nil 45 } 46 47 func (d *DenormalizationRule) Translate(dp *opentsdb.DataPoint) error { 48 tagString := "__" 49 for i, tagName := range d.TagNames { 50 val, ok := dp.Tags[tagName] 51 if !ok { 52 return fmt.Errorf("tag %s not present in data point for %s.", tagName, dp.Metric) 53 } 54 if i > 0 { 55 tagString += "." 56 } 57 tagString += val 58 } 59 dp.Metric = tagString + "." + dp.Metric 60 return nil 61 }