Removed the Tags capability from the graphite parser and modified the exe description...

This commit is contained in:
Henry Hu 2016-02-04 14:14:34 +08:00
parent 51622d0bbf
commit 3e9cf6a3ea
5 changed files with 29 additions and 96 deletions

View File

@ -3,8 +3,6 @@ package graphite
import ( import (
"fmt" "fmt"
"strings" "strings"
"github.com/influxdata/influxdb/models"
) )
const ( const (
@ -16,30 +14,15 @@ const (
// Config represents the configuration for Graphite endpoints. // Config represents the configuration for Graphite endpoints.
type Config struct { type Config struct {
Separator string Separator string
Tags []string
Templates []string Templates []string
} }
// DefaultTags returns the config's tags.
func (c *Config) DefaultTags() models.Tags {
tags := models.Tags{}
for _, t := range c.Tags {
parts := strings.Split(t, "=")
tags[parts[0]] = parts[1]
}
return tags
}
// Validate validates the config's templates and tags. // Validate validates the config's templates and tags.
func (c *Config) Validate() error { func (c *Config) Validate() error {
if err := c.validateTemplates(); err != nil { if err := c.validateTemplates(); err != nil {
return err return err
} }
if err := c.validateTags(); err != nil {
return err
}
return nil return nil
} }
@ -110,15 +93,6 @@ func (c *Config) validateTemplates() error {
return nil return nil
} }
func (c *Config) validateTags() error {
for _, t := range c.Tags {
if err := c.validateTag(t); err != nil {
return err
}
}
return nil
}
func (c *Config) validateTemplate(template string) error { func (c *Config) validateTemplate(template string) error {
hasMeasurement := false hasMeasurement := false
for _, p := range strings.Split(template, ".") { for _, p := range strings.Split(template, ".") {

View File

@ -35,14 +35,12 @@ func init() {
// Parser encapsulates a Graphite Parser. // Parser encapsulates a Graphite Parser.
type Parser struct { type Parser struct {
matcher *matcher matcher *matcher
tags models.Tags
} }
// Options are configurable values that can be provided to a Parser // Options are configurable values that can be provided to a Parser
type Options struct { type Options struct {
Separator string Separator string
Templates []string Templates []string
DefaultTags models.Tags
} }
// NewParserWithOptions returns a graphite parser using the given options // NewParserWithOptions returns a graphite parser using the given options
@ -84,15 +82,14 @@ func NewParserWithOptions(options Options) (*Parser, error) {
} }
matcher.Add(filter, tmpl) matcher.Add(filter, tmpl)
} }
return &Parser{matcher: matcher, tags: options.DefaultTags}, nil return &Parser{matcher: matcher}, nil
} }
// NewParser returns a GraphiteParser instance. // NewParser returns a GraphiteParser instance.
func NewParser(templates []string, defaultTags models.Tags) (*Parser, error) { func NewParser(templates []string) (*Parser, error) {
return NewParserWithOptions( return NewParserWithOptions(
Options{ Options{
Templates: templates, Templates: templates,
DefaultTags: defaultTags,
Separator: DefaultSeparator, Separator: DefaultSeparator,
}) })
} }
@ -182,12 +179,6 @@ func (p *Parser) Parse(line string) (telegraf.Metric, error) {
} }
} }
// Set the default tags on the point if they are not already set
for k, v := range p.tags {
if _, ok := tags[k]; !ok {
tags[k] = v
}
}
return telegraf.NewMetric(measurement, tags, fieldValues, timestamp) return telegraf.NewMetric(measurement, tags, fieldValues, timestamp)
} }
@ -202,12 +193,7 @@ func (p *Parser) ApplyTemplate(line string) (string, map[string]string, string,
// decode the name and tags // decode the name and tags
template := p.matcher.Match(fields[0]) template := p.matcher.Match(fields[0])
name, tags, field, err := template.Apply(fields[0]) name, tags, field, err := template.Apply(fields[0])
// Set the default tags on the point if they are not already set
for k, v := range p.tags {
if _, ok := tags[k]; !ok {
tags[k] = v
}
}
return name, tags, field, err return name, tags, field, err
} }

View File

@ -44,19 +44,15 @@ and strings will be ignored.
### If matching multiple measurement files, this string will be used to join the matched values. ### If matching multiple measurement files, this string will be used to join the matched values.
#separator = "." #separator = "."
### Default tags that will be added to all metrics. These can be overridden at the template level
### or by tags extracted from metric
#tags = ["region=north-east", "zone=1c"]
### Each template line requires a template pattern. It can have an optional ### Each template line requires a template pattern. It can have an optional
### filter before the template and separated by spaces. It can also have optional extra ### filter before the template and separated by spaces. It can also have optional extra
### tags following the template. Multiple tags should be separated by commas and no spaces ### tags following the template. Multiple tags should be separated by commas and no spaces
### similar to the line protocol format. The can be only one default template. ### similar to the line protocol format. The can be only one default template.
### Templates support below format: ### Templates support below format:
### filter + template ### 1. filter + template
### filter + template + extra tag ### 2. filter + template + extra tag
### filter + template with field key ### 3. filter + template with field key
### default template. Ignore the first graphite component "servers" ### 4. default template
#templates = [ #templates = [
# "*.app env.service.resource.measurement", # "*.app env.service.resource.measurement",
# "stats.* .host.measurement* region=us-west,agent=sensu", # "stats.* .host.measurement* region=us-west,agent=sensu",
@ -149,19 +145,15 @@ We can also change the data_format to "graphite" to use the metrics collecting s
### If matching multiple measurement files, this string will be used to join the matched values. ### If matching multiple measurement files, this string will be used to join the matched values.
separator = "." separator = "."
### Default tags that will be added to all metrics. These can be overridden at the template level
### or by tags extracted from metric
tags = ["region=north-east", "zone=1c"]
### Each template line requires a template pattern. It can have an optional ### Each template line requires a template pattern. It can have an optional
### filter before the template and separated by spaces. It can also have optional extra ### filter before the template and separated by spaces. It can also have optional extra
### tags following the template. Multiple tags should be separated by commas and no spaces ### tags following the template. Multiple tags should be separated by commas and no spaces
### similar to the line protocol format. The can be only one default template. ### similar to the line protocol format. The can be only one default template.
### Templates support below format: ### Templates support below format:
### filter + template ### 1. filter + template
### filter + template + extra tag ### 2. filter + template + extra tag
### filter + template with field key ### 3. filter + template with field key
### default template. Ignore the first graphite component "servers" ### 4. default template
templates = [ templates = [
"*.app env.service.resource.measurement", "*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu", "stats.* .host.measurement* region=us-west,agent=sensu",

View File

@ -4,12 +4,6 @@ import (
"github.com/influxdata/telegraf/internal/encoding/graphite" "github.com/influxdata/telegraf/internal/encoding/graphite"
) )
const (
// DefaultSeparator is the default join character to use when joining multiple
// measurment parts in a template.
DefaultSeparator = "."
)
// Config represents the configuration for Graphite endpoints. // Config represents the configuration for Graphite endpoints.
type Config struct { type Config struct {
Commands []string Commands []string
@ -17,21 +11,15 @@ type Config struct {
} }
// New Config instance. // New Config instance.
func NewConfig(commands, tags, templates []string, separator string) *Config { func NewConfig(commands, templates []string, separator string) *Config {
c := &Config{} c := &Config{}
if separator == "" {
separator = graphite.DefaultSeparator
}
c.Commands = commands c.Commands = commands
c.Tags = tags
c.Templates = templates c.Templates = templates
c.Separator = separator c.Separator = separator
return c return c
} }
// WithDefaults takes the given config and returns a new config with any required
// default values set.
func (c *Config) WithDefaults() *Config {
d := *c
if d.Separator == "" {
d.Separator = DefaultSeparator
}
return &d
}

View File

@ -32,19 +32,15 @@ const sampleConfig = `
### If matching multiple measurement files, this string will be used to join the matched values. ### If matching multiple measurement files, this string will be used to join the matched values.
separator = "." separator = "."
### Default tags that will be added to all metrics. These can be overridden at the template level
### or by tags extracted from metric
tags = ["region=north-east", "zone=1c"]
### Each template line requires a template pattern. It can have an optional ### Each template line requires a template pattern. It can have an optional
### filter before the template and separated by spaces. It can also have optional extra ### filter before the template and separated by spaces. It can also have optional extra
### tags following the template. Multiple tags should be separated by commas and no spaces ### tags following the template. Multiple tags should be separated by commas and no spaces
### similar to the line protocol format. The can be only one default template. ### similar to the line protocol format. The can be only one default template.
### Templates support below format: ### Templates support below format:
### filter + template ### 1. filter + template
### filter + template + extra tag ### 2. filter + template + extra tag
### filter + template with field key ### 3. filter + template with field key
### default template. Ignore the first graphite component "servers" ### 4. default template
templates = [ templates = [
"*.app env.service.resource.measurement", "*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu", "stats.* .host.measurement* region=us-west,agent=sensu",
@ -59,7 +55,6 @@ type Exec struct {
DataFormat string DataFormat string
Separator string Separator string
Tags []string
Templates []string Templates []string
encodingParser *encoding.Parser encodingParser *encoding.Parser
@ -125,8 +120,7 @@ func (e *Exec) initConfig() error {
e.Commands = []string{e.Command} e.Commands = []string{e.Command}
} }
c := NewConfig(e.Commands, e.Tags, e.Templates, e.Separator) c := NewConfig(e.Commands, e.Templates, e.Separator)
c.WithDefaults()
if err := c.Validate(); err != nil { if err := c.Validate(); err != nil {
return fmt.Errorf("exec configuration is error: %s ", err.Error()) return fmt.Errorf("exec configuration is error: %s ", err.Error())
@ -135,7 +129,6 @@ func (e *Exec) initConfig() error {
graphiteParser, err := graphite.NewParserWithOptions(graphite.Options{ graphiteParser, err := graphite.NewParserWithOptions(graphite.Options{
Templates: e.config.Templates, Templates: e.config.Templates,
DefaultTags: e.config.DefaultTags(),
Separator: e.config.Separator}) Separator: e.config.Separator})
if err != nil { if err != nil {
@ -152,7 +145,7 @@ func (e *Exec) SampleConfig() string {
} }
func (e *Exec) Description() string { func (e *Exec) Description() string {
return "Read metrics from one or more commands that output graphite line protocol to stdout" return "Read metrics from one or more commands that can output JSON, influx or graphite line protocol to stdout"
} }
func (e *Exec) Gather(acc telegraf.Accumulator) error { func (e *Exec) Gather(acc telegraf.Accumulator) error {