2016-02-06 00:36:35 +00:00
|
|
|
package parsers
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/plugins/parsers/graphite"
|
|
|
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
|
|
|
"github.com/influxdata/telegraf/plugins/parsers/json"
|
2016-02-25 04:32:22 +00:00
|
|
|
"github.com/influxdata/telegraf/plugins/parsers/nagios"
|
2016-03-18 00:01:01 +00:00
|
|
|
"github.com/influxdata/telegraf/plugins/parsers/value"
|
2016-02-06 00:36:35 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// ParserInput is an interface for input plugins that are able to parse
|
|
|
|
// arbitrary data formats.
|
|
|
|
type ParserInput interface {
|
|
|
|
// SetParser sets the parser function for the interface
|
|
|
|
SetParser(parser Parser)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Parser is an interface defining functions that a parser plugin must satisfy.
|
|
|
|
type Parser interface {
|
|
|
|
// Parse takes a byte buffer separated by newlines
|
|
|
|
// ie, `cpu.usage.idle 90\ncpu.usage.busy 10`
|
|
|
|
// and parses it into telegraf metrics
|
|
|
|
Parse(buf []byte) ([]telegraf.Metric, error)
|
|
|
|
|
|
|
|
// ParseLine takes a single string metric
|
|
|
|
// ie, "cpu.usage.idle 90"
|
|
|
|
// and parses it into a telegraf metric.
|
|
|
|
ParseLine(line string) (telegraf.Metric, error)
|
2016-02-09 22:03:46 +00:00
|
|
|
|
|
|
|
// SetDefaultTags tells the parser to add all of the given tags
|
|
|
|
// to each parsed metric.
|
|
|
|
// NOTE: do _not_ modify the map after you've passed it here!!
|
|
|
|
SetDefaultTags(tags map[string]string)
|
2016-02-06 00:36:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Config is a struct that covers the data types needed for all parser types,
|
|
|
|
// and can be used to instantiate _any_ of the parsers.
|
|
|
|
type Config struct {
|
2016-02-25 04:32:22 +00:00
|
|
|
// Dataformat can be one of: json, influx, graphite, value, nagios
|
2016-02-06 00:36:35 +00:00
|
|
|
DataFormat string
|
|
|
|
|
|
|
|
// Separator only applied to Graphite data.
|
|
|
|
Separator string
|
|
|
|
// Templates only apply to Graphite data.
|
|
|
|
Templates []string
|
|
|
|
|
|
|
|
// TagKeys only apply to JSON data
|
|
|
|
TagKeys []string
|
2016-03-18 00:01:01 +00:00
|
|
|
// MetricName applies to JSON & value. This will be the name of the measurement.
|
2016-02-06 00:36:35 +00:00
|
|
|
MetricName string
|
|
|
|
|
2016-03-18 00:01:01 +00:00
|
|
|
// DataType only applies to value, this will be the type to parse value to
|
|
|
|
DataType string
|
|
|
|
|
2016-02-06 00:36:35 +00:00
|
|
|
// DefaultTags are the default tags that will be added to all parsed metrics.
|
|
|
|
DefaultTags map[string]string
|
2016-07-27 16:22:02 +00:00
|
|
|
|
|
|
|
// TimestampSelector only applies to JSON
|
|
|
|
TimestampSelector string
|
|
|
|
|
|
|
|
// TimestampFormatter only applies to JSON
|
|
|
|
TimestampFormatter string
|
2016-02-06 00:36:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewParser returns a Parser interface based on the given config.
|
|
|
|
func NewParser(config *Config) (Parser, error) {
|
|
|
|
var err error
|
|
|
|
var parser Parser
|
|
|
|
switch config.DataFormat {
|
|
|
|
case "json":
|
|
|
|
parser, err = NewJSONParser(config.MetricName,
|
2016-07-27 16:22:02 +00:00
|
|
|
config.TagKeys, config.DefaultTags,
|
|
|
|
config.TimestampSelector, config.TimestampFormatter)
|
2016-03-18 00:01:01 +00:00
|
|
|
case "value":
|
|
|
|
parser, err = NewValueParser(config.MetricName,
|
|
|
|
config.DataType, config.DefaultTags)
|
2016-02-06 00:36:35 +00:00
|
|
|
case "influx":
|
|
|
|
parser, err = NewInfluxParser()
|
2016-02-25 04:32:22 +00:00
|
|
|
case "nagios":
|
|
|
|
parser, err = NewNagiosParser()
|
2016-02-06 00:36:35 +00:00
|
|
|
case "graphite":
|
|
|
|
parser, err = NewGraphiteParser(config.Separator,
|
|
|
|
config.Templates, config.DefaultTags)
|
|
|
|
default:
|
|
|
|
err = fmt.Errorf("Invalid data format: %s", config.DataFormat)
|
|
|
|
}
|
|
|
|
return parser, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewJSONParser(
|
|
|
|
metricName string,
|
|
|
|
tagKeys []string,
|
|
|
|
defaultTags map[string]string,
|
2016-07-27 16:22:02 +00:00
|
|
|
timestampParameters ...string,
|
2016-02-06 00:36:35 +00:00
|
|
|
) (Parser, error) {
|
2016-07-27 16:22:02 +00:00
|
|
|
timestampSelector, timestampFormatter := "", ""
|
|
|
|
switch len(timestampParameters) {
|
|
|
|
case 2:
|
|
|
|
timestampFormatter = timestampParameters[1]
|
|
|
|
fallthrough
|
|
|
|
case 1:
|
|
|
|
timestampSelector = timestampParameters[0]
|
|
|
|
}
|
|
|
|
|
2016-02-06 00:36:35 +00:00
|
|
|
parser := &json.JSONParser{
|
2016-07-27 16:22:02 +00:00
|
|
|
MetricName: metricName,
|
|
|
|
TagKeys: tagKeys,
|
|
|
|
DefaultTags: defaultTags,
|
|
|
|
TimestampSelector: timestampSelector,
|
|
|
|
TimestampFormatter: timestampFormatter,
|
2016-02-06 00:36:35 +00:00
|
|
|
}
|
|
|
|
return parser, nil
|
|
|
|
}
|
|
|
|
|
2016-02-25 04:32:22 +00:00
|
|
|
func NewNagiosParser() (Parser, error) {
|
|
|
|
return &nagios.NagiosParser{}, nil
|
|
|
|
}
|
|
|
|
|
2016-02-06 00:36:35 +00:00
|
|
|
func NewInfluxParser() (Parser, error) {
|
|
|
|
return &influx.InfluxParser{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewGraphiteParser(
|
|
|
|
separator string,
|
|
|
|
templates []string,
|
|
|
|
defaultTags map[string]string,
|
|
|
|
) (Parser, error) {
|
|
|
|
return graphite.NewGraphiteParser(separator, templates, defaultTags)
|
|
|
|
}
|
2016-03-18 00:01:01 +00:00
|
|
|
|
|
|
|
func NewValueParser(
|
|
|
|
metricName string,
|
|
|
|
dataType string,
|
|
|
|
defaultTags map[string]string,
|
|
|
|
) (Parser, error) {
|
|
|
|
return &value.ValueParser{
|
|
|
|
MetricName: metricName,
|
|
|
|
DataType: dataType,
|
|
|
|
DefaultTags: defaultTags,
|
|
|
|
}, nil
|
|
|
|
}
|