telegraf/plugins/serializers/prometheus/prometheus.go

66 lines
1.6 KiB
Go

package prometheus
import (
"bytes"
"time"
"github.com/prometheus/common/expfmt"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/serializers"
)
type FormatConfig struct {
ExportTimestamp bool `toml:"prometheus_export_timestamp"`
SortMetrics bool `toml:"prometheus_sort_metrics"`
StringAsLabel bool `toml:"prometheus_string_as_label"`
// CompactEncoding defines whether to include
// HELP metadata in Prometheus payload. Setting to true
// helps to reduce payload size.
CompactEncoding bool `toml:"prometheus_compact_encoding"`
}
type Serializer struct {
FormatConfig
}
func (s *Serializer) Serialize(metric telegraf.Metric) ([]byte, error) {
return s.SerializeBatch([]telegraf.Metric{metric})
}
func (s *Serializer) SerializeBatch(metrics []telegraf.Metric) ([]byte, error) {
coll := NewCollection(s.FormatConfig)
for _, metric := range metrics {
coll.Add(metric, time.Now())
}
var buf bytes.Buffer
for _, mf := range coll.GetProto() {
enc := expfmt.NewEncoder(&buf, expfmt.FmtText)
err := enc.Encode(mf)
if err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}
func init() {
serializers.Add("prometheus",
func() serializers.Serializer {
return &Serializer{}
},
)
}
// InitFromConfig is a compatibility function to construct the parser the old way
func (s *Serializer) InitFromConfig(cfg *serializers.Config) error {
s.FormatConfig.CompactEncoding = cfg.PrometheusCompactEncoding
s.FormatConfig.SortMetrics = cfg.PrometheusSortMetrics
s.FormatConfig.StringAsLabel = cfg.PrometheusStringAsLabel
s.FormatConfig.ExportTimestamp = cfg.PrometheusExportTimestamp
return nil
}