72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
|
package unpivot
|
||
|
|
||
|
import (
|
||
|
"github.com/influxdata/telegraf"
|
||
|
"github.com/influxdata/telegraf/plugins/processors"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
description = "Rotate multi field metric into several single field metrics"
|
||
|
sampleConfig = `
|
||
|
## Tag to use for the name.
|
||
|
tag_key = "name"
|
||
|
## Field to use for the name of the value.
|
||
|
value_key = "value"
|
||
|
`
|
||
|
)
|
||
|
|
||
|
type Unpivot struct {
|
||
|
TagKey string `toml:"tag_key"`
|
||
|
ValueKey string `toml:"value_key"`
|
||
|
}
|
||
|
|
||
|
func (p *Unpivot) SampleConfig() string {
|
||
|
return sampleConfig
|
||
|
}
|
||
|
|
||
|
func (p *Unpivot) Description() string {
|
||
|
return description
|
||
|
}
|
||
|
|
||
|
func copyWithoutFields(metric telegraf.Metric) telegraf.Metric {
|
||
|
m := metric.Copy()
|
||
|
|
||
|
fieldKeys := make([]string, 0, len(m.FieldList()))
|
||
|
for _, field := range m.FieldList() {
|
||
|
fieldKeys = append(fieldKeys, field.Key)
|
||
|
}
|
||
|
|
||
|
for _, fk := range fieldKeys {
|
||
|
m.RemoveField(fk)
|
||
|
}
|
||
|
|
||
|
return m
|
||
|
}
|
||
|
|
||
|
func (p *Unpivot) Apply(metrics ...telegraf.Metric) []telegraf.Metric {
|
||
|
fieldCount := 0
|
||
|
for _, m := range metrics {
|
||
|
fieldCount += len(m.FieldList())
|
||
|
}
|
||
|
|
||
|
results := make([]telegraf.Metric, 0, fieldCount)
|
||
|
|
||
|
for _, m := range metrics {
|
||
|
base := copyWithoutFields(m)
|
||
|
for _, field := range m.FieldList() {
|
||
|
newMetric := base.Copy()
|
||
|
newMetric.AddField(p.ValueKey, field.Value)
|
||
|
newMetric.AddTag(p.TagKey, field.Key)
|
||
|
results = append(results, newMetric)
|
||
|
}
|
||
|
m.Accept()
|
||
|
}
|
||
|
return results
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
processors.Add("unpivot", func() telegraf.Processor {
|
||
|
return &Unpivot{}
|
||
|
})
|
||
|
}
|