feat: migrate grok to new parser style (#11408)
This commit is contained in:
parent
f8766bc1b1
commit
56a3f18cdf
|
|
@ -15,8 +15,8 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers"
|
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/csv"
|
"github.com/influxdata/telegraf/plugins/parsers/csv"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/json"
|
"github.com/influxdata/telegraf/plugins/parsers/json"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
)
|
)
|
||||||
|
|
@ -90,12 +90,15 @@ func TestGrokParser(t *testing.T) {
|
||||||
err := r.Init()
|
err := r.Init()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
parserConfig := parsers.Config{
|
r.SetParserFunc(func() (telegraf.Parser, error) {
|
||||||
DataFormat: "grok",
|
parser := &grok.Parser{
|
||||||
GrokPatterns: []string{"%{COMMON_LOG_FORMAT}"},
|
Patterns: []string{"%{COMMON_LOG_FORMAT}"},
|
||||||
|
Log: testutil.Logger{},
|
||||||
}
|
}
|
||||||
|
err := parser.Init()
|
||||||
|
|
||||||
r.SetParserFunc(func() (telegraf.Parser, error) { return parsers.NewParser(&parserConfig) })
|
return parser, err
|
||||||
|
})
|
||||||
|
|
||||||
err = r.Gather(&acc)
|
err = r.Gather(&acc)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ import (
|
||||||
"github.com/influxdata/telegraf/models"
|
"github.com/influxdata/telegraf/models"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers"
|
"github.com/influxdata/telegraf/plugins/parsers"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DO NOT REMOVE THE NEXT TWO LINES! This is required to embed the sampleConfig data.
|
// DO NOT REMOVE THE NEXT TWO LINES! This is required to embed the sampleConfig data.
|
||||||
|
|
@ -117,22 +118,20 @@ func (l *LogParserPlugin) Start(acc telegraf.Accumulator) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Looks for fields which implement LogParser interface
|
// Looks for fields which implement LogParser interface
|
||||||
config := &parsers.Config{
|
parser := grok.Parser{
|
||||||
MetricName: mName,
|
Measurement: mName,
|
||||||
GrokPatterns: l.GrokConfig.Patterns,
|
Patterns: l.GrokConfig.Patterns,
|
||||||
GrokNamedPatterns: l.GrokConfig.NamedPatterns,
|
NamedPatterns: l.GrokConfig.NamedPatterns,
|
||||||
GrokCustomPatterns: l.GrokConfig.CustomPatterns,
|
CustomPatterns: l.GrokConfig.CustomPatterns,
|
||||||
GrokCustomPatternFiles: l.GrokConfig.CustomPatternFiles,
|
CustomPatternFiles: l.GrokConfig.CustomPatternFiles,
|
||||||
GrokTimezone: l.GrokConfig.Timezone,
|
Timezone: l.GrokConfig.Timezone,
|
||||||
GrokUniqueTimestamp: l.GrokConfig.UniqueTimestamp,
|
UniqueTimestamp: l.GrokConfig.UniqueTimestamp,
|
||||||
DataFormat: "grok",
|
|
||||||
}
|
}
|
||||||
|
err := parser.Init()
|
||||||
var err error
|
|
||||||
l.GrokParser, err = parsers.NewParser(config)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
l.GrokParser = &parser
|
||||||
models.SetLoggerOnPlugin(l.GrokParser, l.Log)
|
models.SetLoggerOnPlugin(l.GrokParser, l.Log)
|
||||||
|
|
||||||
l.wg.Add(1)
|
l.wg.Add(1)
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ func TestStartNoParsers(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
acc := testutil.Accumulator{}
|
acc := testutil.Accumulator{}
|
||||||
require.Error(t, logparser.Start(&acc))
|
require.NoError(t, logparser.Start(&acc))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGrokParseLogFilesNonExistPattern(t *testing.T) {
|
func TestGrokParseLogFilesNonExistPattern(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers"
|
"github.com/influxdata/telegraf/plugins/parsers"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/csv"
|
"github.com/influxdata/telegraf/plugins/parsers/csv"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/json"
|
"github.com/influxdata/telegraf/plugins/parsers/json"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
|
|
@ -306,13 +307,13 @@ func TestGrokParseLogFilesWithMultilineTailerCloseFlushesMultilineBuffer(t *test
|
||||||
}
|
}
|
||||||
|
|
||||||
func createGrokParser() (parsers.Parser, error) {
|
func createGrokParser() (parsers.Parser, error) {
|
||||||
grokConfig := &parsers.Config{
|
parser := &grok.Parser{
|
||||||
MetricName: "tail_grok",
|
Measurement: "tail_grok",
|
||||||
GrokPatterns: []string{"%{TEST_LOG_MULTILINE}"},
|
Patterns: []string{"%{TEST_LOG_MULTILINE}"},
|
||||||
GrokCustomPatternFiles: []string{filepath.Join(testdataDir, "test-patterns")},
|
CustomPatternFiles: []string{filepath.Join(testdataDir, "test-patterns")},
|
||||||
DataFormat: "grok",
|
Log: testutil.Logger{},
|
||||||
}
|
}
|
||||||
parser, err := parsers.NewParser(grokConfig)
|
err := parser.Init()
|
||||||
return parser, err
|
return parser, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import (
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/dropwizard"
|
_ "github.com/influxdata/telegraf/plugins/parsers/dropwizard"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/form_urlencoded"
|
_ "github.com/influxdata/telegraf/plugins/parsers/form_urlencoded"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/graphite"
|
_ "github.com/influxdata/telegraf/plugins/parsers/graphite"
|
||||||
|
_ "github.com/influxdata/telegraf/plugins/parsers/grok"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/json"
|
_ "github.com/influxdata/telegraf/plugins/parsers/json"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/json_v2"
|
_ "github.com/influxdata/telegraf/plugins/parsers/json_v2"
|
||||||
_ "github.com/influxdata/telegraf/plugins/parsers/logfmt"
|
_ "github.com/influxdata/telegraf/plugins/parsers/logfmt"
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/metric"
|
"github.com/influxdata/telegraf/metric"
|
||||||
|
"github.com/influxdata/telegraf/plugins/parsers"
|
||||||
)
|
)
|
||||||
|
|
||||||
var timeLayouts = map[string]string{
|
var timeLayouts = map[string]string{
|
||||||
|
|
@ -66,16 +67,16 @@ var (
|
||||||
|
|
||||||
// Parser is the primary struct to handle and grok-patterns defined in the config toml
|
// Parser is the primary struct to handle and grok-patterns defined in the config toml
|
||||||
type Parser struct {
|
type Parser struct {
|
||||||
Patterns []string
|
Patterns []string `toml:"grok_patterns"`
|
||||||
// namedPatterns is a list of internally-assigned names to the patterns
|
// namedPatterns is a list of internally-assigned names to the patterns
|
||||||
// specified by the user in Patterns.
|
// specified by the user in Patterns.
|
||||||
// They will look like:
|
// They will look like:
|
||||||
// GROK_INTERNAL_PATTERN_0, GROK_INTERNAL_PATTERN_1, etc.
|
// GROK_INTERNAL_PATTERN_0, GROK_INTERNAL_PATTERN_1, etc.
|
||||||
NamedPatterns []string
|
NamedPatterns []string `toml:"grok_named_patterns"`
|
||||||
CustomPatterns string
|
CustomPatterns string `toml:"grok_custom_patterns"`
|
||||||
CustomPatternFiles []string
|
CustomPatternFiles []string `toml:"grok_custom_pattern_files"`
|
||||||
Measurement string
|
Measurement string `toml:"-"`
|
||||||
DefaultTags map[string]string
|
DefaultTags map[string]string `toml:"-"`
|
||||||
Log telegraf.Logger `toml:"-"`
|
Log telegraf.Logger `toml:"-"`
|
||||||
|
|
||||||
// Timezone is an optional component to help render log dates to
|
// Timezone is an optional component to help render log dates to
|
||||||
|
|
@ -85,11 +86,11 @@ type Parser struct {
|
||||||
// 1. Local -- interpret based on machine localtime
|
// 1. Local -- interpret based on machine localtime
|
||||||
// 2. "America/Chicago" -- Unix TZ values like those found in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
// 2. "America/Chicago" -- Unix TZ values like those found in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
// 3. UTC -- or blank/unspecified, will return timestamp in UTC
|
// 3. UTC -- or blank/unspecified, will return timestamp in UTC
|
||||||
Timezone string
|
Timezone string `toml:"grok_timezone"`
|
||||||
loc *time.Location
|
loc *time.Location
|
||||||
|
|
||||||
// UniqueTimestamp when set to "disable", timestamp will not incremented if there is a duplicate.
|
// UniqueTimestamp when set to "disable", timestamp will not incremented if there is a duplicate.
|
||||||
UniqueTimestamp string
|
UniqueTimestamp string `toml:"grok_unique_timestamp"`
|
||||||
|
|
||||||
// typeMap is a map of patterns -> capture name -> modifier,
|
// typeMap is a map of patterns -> capture name -> modifier,
|
||||||
// ie, {
|
// ie, {
|
||||||
|
|
@ -558,3 +559,43 @@ func (t *tsModder) tsMod(ts time.Time) time.Time {
|
||||||
}
|
}
|
||||||
return ts.Add(t.incr*t.incrn + t.rollover)
|
return ts.Add(t.incr*t.incrn + t.rollover)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InitFromConfig is a compatibility function to construct the parser the old way
|
||||||
|
func (p *Parser) InitFromConfig(config *parsers.Config) error {
|
||||||
|
p.Measurement = config.MetricName
|
||||||
|
p.DefaultTags = config.DefaultTags
|
||||||
|
p.CustomPatterns = config.GrokCustomPatterns
|
||||||
|
p.CustomPatternFiles = config.GrokCustomPatternFiles
|
||||||
|
p.NamedPatterns = config.GrokNamedPatterns
|
||||||
|
p.Patterns = config.GrokPatterns
|
||||||
|
p.Timezone = config.GrokTimezone
|
||||||
|
p.UniqueTimestamp = config.GrokUniqueTimestamp
|
||||||
|
|
||||||
|
return p.Init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Parser) Init() error {
|
||||||
|
if len(p.Patterns) == 0 {
|
||||||
|
p.Patterns = []string{"%{COMBINED_LOG_FORMAT}"}
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.UniqueTimestamp == "" {
|
||||||
|
p.UniqueTimestamp = "auto"
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.Timezone == "" {
|
||||||
|
p.Timezone = "Canada/Eastern"
|
||||||
|
}
|
||||||
|
|
||||||
|
return p.Compile()
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
parsers.Add("grok",
|
||||||
|
func(defaultMetricName string) telegraf.Parser {
|
||||||
|
return &Parser{
|
||||||
|
Measurement: defaultMetricName,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/grok"
|
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/influx/influx_upstream"
|
"github.com/influxdata/telegraf/plugins/parsers/influx/influx_upstream"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/nagios"
|
"github.com/influxdata/telegraf/plugins/parsers/nagios"
|
||||||
|
|
@ -206,15 +205,6 @@ func NewParser(config *Config) (Parser, error) {
|
||||||
}
|
}
|
||||||
case "nagios":
|
case "nagios":
|
||||||
parser, err = NewNagiosParser()
|
parser, err = NewNagiosParser()
|
||||||
case "grok":
|
|
||||||
parser, err = newGrokParser(
|
|
||||||
config.MetricName,
|
|
||||||
config.GrokPatterns,
|
|
||||||
config.GrokNamedPatterns,
|
|
||||||
config.GrokCustomPatterns,
|
|
||||||
config.GrokCustomPatternFiles,
|
|
||||||
config.GrokTimezone,
|
|
||||||
config.GrokUniqueTimestamp)
|
|
||||||
case "prometheus":
|
case "prometheus":
|
||||||
parser, err = NewPrometheusParser(
|
parser, err = NewPrometheusParser(
|
||||||
config.DefaultTags,
|
config.DefaultTags,
|
||||||
|
|
@ -240,24 +230,6 @@ func NewParser(config *Config) (Parser, error) {
|
||||||
return parser, err
|
return parser, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func newGrokParser(metricName string,
|
|
||||||
patterns []string, nPatterns []string,
|
|
||||||
cPatterns string, cPatternFiles []string,
|
|
||||||
tZone string, uniqueTimestamp string) (Parser, error) {
|
|
||||||
parser := grok.Parser{
|
|
||||||
Measurement: metricName,
|
|
||||||
Patterns: patterns,
|
|
||||||
NamedPatterns: nPatterns,
|
|
||||||
CustomPatterns: cPatterns,
|
|
||||||
CustomPatternFiles: cPatternFiles,
|
|
||||||
Timezone: tZone,
|
|
||||||
UniqueTimestamp: uniqueTimestamp,
|
|
||||||
}
|
|
||||||
|
|
||||||
err := parser.Compile()
|
|
||||||
return &parser, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewNagiosParser() (Parser, error) {
|
func NewNagiosParser() (Parser, error) {
|
||||||
return &nagios.NagiosParser{}, nil
|
return &nagios.NagiosParser{}, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue