diff --git a/plugins/inputs/reader/reader.go b/plugins/inputs/reader/reader.go index 274f22a66..36c2a742e 100644 --- a/plugins/inputs/reader/reader.go +++ b/plugins/inputs/reader/reader.go @@ -18,6 +18,12 @@ type Reader struct { Tags []string Filenames []string + + //for grok parser + Patterns []string + namedPatterns []string + CustomPatterns string + CustomPatternFiles []string } const sampleConfig = `## Files to parse. @@ -63,13 +69,15 @@ func (r *Reader) compileParser() { log.Printf("E! No data_format specified") return } - if r.DataFormat == "grok" { - log.Printf("Grok isn't supported yet") - return - } r.ParserConfig = parsers.Config{ DataFormat: r.DataFormat, TagKeys: r.Tags, + + //grok settings + Patterns: r.Patterns, + NamedPatterns: r.namedPatterns, + CustomPatterns: r.CustomPatterns, + CustomPatternFiles: r.CustomPatternFiles, } nParser, err := parsers.NewParser(&r.ParserConfig) if err != nil { diff --git a/plugins/inputs/reader/reader_test.go b/plugins/inputs/reader/reader_test.go index e073a6f54..a30ec2f92 100644 --- a/plugins/inputs/reader/reader_test.go +++ b/plugins/inputs/reader/reader_test.go @@ -35,6 +35,23 @@ func TestJSONParserCompile(t *testing.T) { assert.Equal(t, 5, len(acc.Metrics[0].Fields)) } +func TestGrokParser(t *testing.T) { + testDir := getPluginDir() + var acc testutil.Accumulator + r := Reader{ + Filepaths: []string{testDir + "/reader/testfiles/grok_a.log"}, + DataFormat: "grok", + Patterns: []string{"%{COMMON_LOG_FORMAT}"}, + } + + r.compileParser() + err := r.Gather(&acc) + log.Printf("err: %v", err) + log.Printf("metric[0]_tags: %v, metric[0]_fields: %v", acc.Metrics[0].Tags, acc.Metrics[0].Fields) + log.Printf("metric[1]_tags: %v, metric[1]_fields: %v", acc.Metrics[1].Tags, acc.Metrics[1].Fields) + t.Error() +} + func getPluginDir() string { _, filename, _, _ := runtime.Caller(1) return strings.Replace(filename, "/reader/reader_test.go", "", 1) diff --git a/plugins/parsers/registry.go b/plugins/parsers/registry.go index 58fce1722..e15632b8e 100644 --- a/plugins/parsers/registry.go +++ b/plugins/parsers/registry.go @@ -8,6 +8,7 @@ import ( "github.com/influxdata/telegraf/plugins/parsers/collectd" "github.com/influxdata/telegraf/plugins/parsers/dropwizard" "github.com/influxdata/telegraf/plugins/parsers/graphite" + "github.com/influxdata/telegraf/plugins/parsers/grok" "github.com/influxdata/telegraf/plugins/parsers/influx" "github.com/influxdata/telegraf/plugins/parsers/json" "github.com/influxdata/telegraf/plugins/parsers/nagios" @@ -87,6 +88,12 @@ type Config struct { // an optional map containing tag names as keys and json paths to retrieve the tag values from as values // used if TagsPath is empty or doesn't return any tags DropwizardTagPathsMap map[string]string + + //grok patterns + Patterns []string + NamedPatterns []string + CustomPatterns string + CustomPatternFiles []string } // NewParser returns a Parser interface based on the given config. @@ -120,12 +127,36 @@ func NewParser(config *Config) (Parser, error) { config.DefaultTags, config.Separator, config.Templates) + case "grok": + parser, err = NewGrokParser( + config.MetricName, + config.Patterns, + config.NamedPatterns, + config.CustomPatterns, + config.CustomPatternFiles) default: err = fmt.Errorf("Invalid data format: %s", config.DataFormat) } return parser, err } +func NewGrokParser(metricName string, + patterns []string, + nPatterns []string, + cPatterns string, + cPatternFiles []string) (Parser, error) { + parser := grok.Parser{ + Measurement: metricName, + Patterns: patterns, + NamedPatterns: nPatterns, + CustomPatterns: cPatterns, + CustomPatternFiles: cPatternFiles, + } + + parser.Compile() + return &parser, nil +} + func NewJSONParser( metricName string, tagKeys []string,