Removed the Tags capability from the graphite parser.

This commit is contained in:
Henry Hu 2016-02-04 14:02:47 +08:00
parent d74159d6d1
commit 93709e0209
11 changed files with 71 additions and 185 deletions

View File

@ -3,8 +3,6 @@ package graphite
import (
"fmt"
"strings"
"github.com/influxdata/influxdb/models"
)
const (
@ -16,30 +14,15 @@ const (
// Config represents the configuration for Graphite endpoints.
type Config struct {
Separator string
Tags []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.
func (c *Config) Validate() error {
if err := c.validateTemplates(); err != nil {
return err
}
if err := c.validateTags(); err != nil {
return err
}
return nil
}
@ -110,15 +93,6 @@ func (c *Config) validateTemplates() error {
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 {
hasMeasurement := false
for _, p := range strings.Split(template, ".") {

View File

@ -35,14 +35,12 @@ func init() {
// Parser encapsulates a Graphite Parser.
type Parser struct {
matcher *matcher
tags models.Tags
}
// Options are configurable values that can be provided to a Parser
type Options struct {
Separator string
Templates []string
DefaultTags models.Tags
Separator string
Templates []string
}
// NewParserWithOptions returns a graphite parser using the given options
@ -84,16 +82,15 @@ func NewParserWithOptions(options Options) (*Parser, error) {
}
matcher.Add(filter, tmpl)
}
return &Parser{matcher: matcher, tags: options.DefaultTags}, nil
return &Parser{matcher: matcher}, nil
}
// NewParser returns a GraphiteParser instance.
func NewParser(templates []string, defaultTags models.Tags) (*Parser, error) {
func NewParser(templates []string) (*Parser, error) {
return NewParserWithOptions(
Options{
Templates: templates,
DefaultTags: defaultTags,
Separator: DefaultSeparator,
Templates: templates,
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)
}
@ -202,12 +193,7 @@ func (p *Parser) ApplyTemplate(line string) (string, map[string]string, string,
// decode the name and tags
template := p.matcher.Match(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
}

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.
#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
### 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
### similar to the line protocol format. The can be only one default template.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
#templates = [
# "*.app env.service.resource.measurement",
# "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.
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
### 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
### similar to the line protocol format. The can be only one default template.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",

View File

@ -4,12 +4,6 @@ import (
"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.
type Config struct {
Commands []string
@ -17,21 +11,15 @@ type Config struct {
}
// New Config instance.
func NewConfig(commands, tags, templates []string, separator string) *Config {
func NewConfig(commands, templates []string, separator string) *Config {
c := &Config{}
if separator == "" {
separator = graphite.DefaultSeparator
}
c.Commands = commands
c.Tags = tags
c.Templates = templates
c.Separator = separator
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.
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
### 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
### similar to the line protocol format. The can be only one default template.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",
@ -59,7 +55,6 @@ type Exec struct {
DataFormat string
Separator string
Tags []string
Templates []string
encodingParser *encoding.Parser
@ -125,8 +120,7 @@ func (e *Exec) initConfig() error {
e.Commands = []string{e.Command}
}
c := NewConfig(e.Commands, e.Tags, e.Templates, e.Separator)
c.WithDefaults()
c := NewConfig(e.Commands, e.Templates, e.Separator)
if err := c.Validate(); err != nil {
return fmt.Errorf("exec configuration is error: %s ", err.Error())
@ -134,9 +128,8 @@ func (e *Exec) initConfig() error {
e.config = c
graphiteParser, err := graphite.NewParserWithOptions(graphite.Options{
Templates: e.config.Templates,
DefaultTags: e.config.DefaultTags(),
Separator: e.config.Separator})
Templates: e.config.Templates,
Separator: e.config.Separator})
if err != nil {
return fmt.Errorf("exec input parser config is error: %s ", err.Error())
@ -152,7 +145,7 @@ func (e *Exec) SampleConfig() 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 {

View File

@ -142,19 +142,15 @@ If you need to add the same set of tags to all metrics, you can define them glob
### If matching multiple measurement files, this string will be used to join the matched values.
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=us-east", "zone=1c"]
### 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
### 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.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",

View File

@ -9,10 +9,6 @@ const (
// DefaultProtocol is the default IP protocol used by the Graphite input.
DefaultProtocol = "tcp"
// DefaultSeparator is the default join character to use when joining multiple
// measurment parts in a template.
DefaultSeparator = "."
// DefaultUDPReadBuffer is the default buffer size for the UDP listener.
// Sets the size of the operating system's receive buffer associated with
// the UDP traffic. Keep in mind that the OS must be able
@ -36,34 +32,26 @@ type Config struct {
graphite.Config
}
// 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.BindAddress == "" {
d.BindAddress = DefaultBindAddress
}
if d.Protocol == "" {
d.Protocol = DefaultProtocol
}
if d.Separator == "" {
d.Separator = DefaultSeparator
}
if d.UdpReadBuffer == 0 {
d.UdpReadBuffer = DefaultUdpReadBuffer
}
return &d
}
// New Config instance.
func NewConfig(bindAddress, protocol string, udpReadBuffer int, separator string, tags []string, templates []string) *Config {
func NewConfig(bindAddress, protocol string, udpReadBuffer int, separator string, templates []string) *Config {
c := &Config{}
if bindAddress == "" {
bindAddress = DefaultBindAddress
}
if protocol == "" {
protocol = DefaultProtocol
}
if udpReadBuffer < 0 {
udpReadBuffer = DefaultUdpReadBuffer
}
if separator == "" {
separator = graphite.DefaultSeparator
}
c.BindAddress = bindAddress
c.Protocol = protocol
c.UdpReadBuffer = udpReadBuffer
c.Separator = separator
c.Tags = tags
c.Templates = templates
return c

View File

@ -40,7 +40,6 @@ type Socket struct {
DataFormat string
Separator string
Tags []string
Templates []string
mu sync.Mutex
@ -76,19 +75,15 @@ var sampleConfig = `
### If matching multiple measurement files, this string will be used to join the matched values.
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-china", "zone=1c"]
### 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
### 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.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",
@ -110,18 +105,16 @@ func (s *Socket) Start() error {
s.mu.Lock()
defer s.mu.Unlock()
c := NewConfig(s.BindAddress, s.Protocol, s.UdpReadBuffer, s.Separator, s.Tags, s.Templates)
c := NewConfig(s.BindAddress, s.Protocol, s.UdpReadBuffer, s.Separator, s.Templates)
c.WithDefaults()
if err := c.Validate(); err != nil {
return fmt.Errorf("Socket input configuration is error: %s ", err.Error())
}
s.config = c
graphiteParser, err := graphite.NewParserWithOptions(graphite.Options{
Templates: s.config.Templates,
DefaultTags: s.config.DefaultTags(),
Separator: s.config.Separator})
Templates: s.config.Templates,
Separator: s.config.Separator})
if err != nil {
return fmt.Errorf("Socket input parser config is error: %s ", err.Error())

View File

@ -135,19 +135,15 @@ If you need to add the same set of tags to all metrics, you can define them glob
### If matching multiple measurement files, this string will be used to join the matched values.
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-china", "zone=1c"]
### 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
### 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.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",

View File

@ -2,12 +2,6 @@ package tail
import "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.
type Config struct {
Files []string
@ -15,23 +9,16 @@ type Config struct {
graphite.Config
}
// 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
}
// New Config instance.
func NewConfig(files []string, separator string, tags []string, templates []string) *Config {
func NewConfig(files []string, separator string, templates []string) *Config {
c := &Config{}
if separator == "" {
separator = graphite.DefaultSeparator
}
c.Files = files
c.Separator = separator
c.Tags = tags
c.Templates = templates
c.Separator = separator
return c
}

View File

@ -23,7 +23,6 @@ type Tail struct {
DataFormat string
Separator string
Tags []string
Templates []string
mu sync.Mutex
@ -52,19 +51,15 @@ var sampleConfig = `
### If matching multiple measurement files, this string will be used to join the matched values.
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-china", "zone=1c"]
### 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
### 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.
### Templates support below format:
### filter + template
### filter + template + extra tag
### filter + template with field key
### default template. Ignore the first graphite component "servers"
### 1. filter + template
### 2. filter + template + extra tag
### 3. filter + template with field key
### 4. default template
templates = [
"*.app env.service.resource.measurement",
"stats.* .host.measurement* region=us-west,agent=sensu",
@ -86,17 +81,15 @@ func (t *Tail) Start() error {
t.mu.Lock()
defer t.mu.Unlock()
c := NewConfig(t.Files, t.Separator, t.Tags, t.Templates)
c.WithDefaults()
c := NewConfig(t.Files, t.Separator, t.Templates)
if err := c.Validate(); err != nil {
return fmt.Errorf("Tail input configuration is error: %s ", err.Error())
}
t.config = c
graphiteParser, err := graphite.NewParserWithOptions(graphite.Options{
Templates: t.config.Templates,
DefaultTags: t.config.DefaultTags(),
Separator: t.config.Separator})
Templates: t.config.Templates,
Separator: t.config.Separator})
if err != nil {
return fmt.Errorf("Tail input parser config is error: %s ", err.Error())