82 lines
1.7 KiB
Go
82 lines
1.7 KiB
Go
//go:generate ../../../tools/readme_config_includer/generator
|
|
package unpivot
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/metric"
|
|
"github.com/influxdata/telegraf/plugins/processors"
|
|
)
|
|
|
|
//go:embed sample.conf
|
|
var sampleConfig string
|
|
|
|
type Unpivot struct {
|
|
FieldNameAs string `toml:"use_fieldname_as"`
|
|
TagKey string `toml:"tag_key"`
|
|
ValueKey string `toml:"value_key"`
|
|
}
|
|
|
|
func (*Unpivot) SampleConfig() string {
|
|
return sampleConfig
|
|
}
|
|
|
|
func (p *Unpivot) Init() error {
|
|
switch p.FieldNameAs {
|
|
case "", "tag":
|
|
p.FieldNameAs = "tag"
|
|
case "metric":
|
|
default:
|
|
return fmt.Errorf("unrecognized metric mode: %q", p.FieldNameAs)
|
|
}
|
|
|
|
if p.TagKey == "" {
|
|
p.TagKey = "name"
|
|
}
|
|
if p.ValueKey == "" {
|
|
p.ValueKey = "value"
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
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 _, src := range metrics {
|
|
// Create a copy without fields and tracking information
|
|
base := metric.New(src.Name(), make(map[string]string), make(map[string]interface{}), src.Time())
|
|
for _, t := range src.TagList() {
|
|
base.AddTag(t.Key, t.Value)
|
|
}
|
|
|
|
// Create a new metric per field and add it to the output
|
|
for _, field := range src.FieldList() {
|
|
m := base.Copy()
|
|
m.AddField(p.ValueKey, field.Value)
|
|
|
|
switch p.FieldNameAs {
|
|
case "metric":
|
|
m.SetName(field.Key)
|
|
case "tag":
|
|
m.AddTag(p.TagKey, field.Key)
|
|
}
|
|
|
|
results = append(results, m)
|
|
}
|
|
src.Accept()
|
|
}
|
|
return results
|
|
}
|
|
|
|
func init() {
|
|
processors.Add("unpivot", func() telegraf.Processor {
|
|
return &Unpivot{}
|
|
})
|
|
}
|