Allow a user defined field to be used as the graylog short_message (#6700)

This commit is contained in:
Daniel Nelson 2020-01-21 10:49:01 -08:00 committed by GitHub
parent ebebfd9573
commit c6f8b273c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 22 deletions

View File

@ -1,14 +1,18 @@
# Graylog Output Plugin
This plugin writes to a Graylog instance using the "gelf" format.
This plugin writes to a Graylog instance using the "[GELF][]" format.
It requires a `servers` name.
[GELF]: https://docs.graylog.org/en/3.1/pages/gelf.html#gelf-payload-specification
### Configuration:
```toml
# Send telegraf metrics to graylog(s)
[[outputs.graylog]]
## UDP endpoint for your graylog instance(s).
servers = ["127.0.0.1:12201", "192.168.1.1:12201"]
## UDP endpoint for your graylog instances.
servers = ["127.0.0.1:12201"]
## The field to use as the GELF short_message, if unset the static string
## "telegraf" will be used.
## example: short_message_field = "message"
# short_message_field = ""
```

View File

@ -150,13 +150,19 @@ func (g *Gelf) send(b []byte) (n int, err error) {
}
type Graylog struct {
Servers []string
Servers []string `toml:"servers"`
ShortMessageField string `toml:"short_message_field"`
writer io.Writer
}
var sampleConfig = `
## UDP endpoint for your graylog instance.
servers = ["127.0.0.1:12201", "192.168.1.1:12201"]
servers = ["127.0.0.1:12201"]
## The field to use as the GELF short_message, if unset the static string
## "telegraf" will be used.
## example: short_message_field = "message"
# short_message_field = ""
`
func (g *Graylog) Connect() error {
@ -184,16 +190,12 @@ func (g *Graylog) SampleConfig() string {
}
func (g *Graylog) Description() string {
return "Send telegraf metrics to graylog(s)"
return "Send telegraf metrics to graylog"
}
func (g *Graylog) Write(metrics []telegraf.Metric) error {
if len(metrics) == 0 {
return nil
}
for _, metric := range metrics {
values, err := serialize(metric)
values, err := g.serialize(metric)
if err != nil {
return err
}
@ -201,14 +203,14 @@ func (g *Graylog) Write(metrics []telegraf.Metric) error {
for _, value := range values {
_, err := g.writer.Write([]byte(value))
if err != nil {
return fmt.Errorf("FAILED to write message: %s, %s", value, err)
return fmt.Errorf("error writing message: %q, %v", value, err)
}
}
}
return nil
}
func serialize(metric telegraf.Metric) ([]string, error) {
func (g *Graylog) serialize(metric telegraf.Metric) ([]string, error) {
out := []string{}
m := make(map[string]interface{})
@ -217,7 +219,7 @@ func serialize(metric telegraf.Metric) ([]string, error) {
m["short_message"] = "telegraf"
m["name"] = metric.Name()
if host, ok := metric.Tags()["host"]; ok {
if host, ok := metric.GetTag("host"); ok {
m["host"] = host
} else {
host, err := os.Hostname()
@ -227,14 +229,18 @@ func serialize(metric telegraf.Metric) ([]string, error) {
m["host"] = host
}
for key, value := range metric.Tags() {
if key != "host" {
m["_"+key] = value
for _, tag := range metric.TagList() {
if tag.Key != "host" {
m["_"+tag.Key] = tag.Value
}
}
for key, value := range metric.Fields() {
m["_"+key] = value
for _, field := range metric.FieldList() {
if field.Key == g.ShortMessageField {
m["short_message"] = field.Value
} else {
m["_"+field.Key] = field.Value
}
}
serialized, err := ejson.Marshal(m)