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  }