From 10d0a78b963419769f84b0ed94739c56f0a48a9a Mon Sep 17 00:00:00 2001 From: Cameron Sparr Date: Mon, 23 Jan 2017 16:38:07 -0800 Subject: [PATCH] influxdb output: treat field type conflicts as a successful write If we write a batch of points and get a "field type conflict" error message in return, we should drop the entire batch of points because this indicates that one or more points have a type that doesnt match the database. These errors will never go away on their own, and InfluxDB will successfully write the points that dont have a conflict. closes #2245 --- CHANGELOG.md | 1 + plugins/outputs/influxdb/influxdb.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b7670dee..263cb959c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,7 @@ plugins, not just statsd. - [#1814](https://github.com/influxdata/telegraf/issues/1814): snmp: ensure proper context is present on error messages. - [#2299](https://github.com/influxdata/telegraf/issues/2299): opentsdb: add tcp:// prefix if no scheme provided. - [#2297](https://github.com/influxdata/telegraf/issues/2297): influx parser: parse line-protocol without newlines. +- [#2245](https://github.com/influxdata/telegraf/issues/2245): influxdb output: fix field type conflict blocking output buffer. ## v1.1.2 [2016-12-12] diff --git a/plugins/outputs/influxdb/influxdb.go b/plugins/outputs/influxdb/influxdb.go index 8c23b2c5a..999e1bc6f 100644 --- a/plugins/outputs/influxdb/influxdb.go +++ b/plugins/outputs/influxdb/influxdb.go @@ -200,8 +200,6 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error { p := rand.Perm(len(i.conns)) for _, n := range p { if e := i.conns[n].Write(bp); e != nil { - // Log write failure - log.Printf("E! InfluxDB Output Error: %s", e) // If the database was not found, try to recreate it if strings.Contains(e.Error(), "database not found") { if errc := createDatabase(i.conns[n], i.Database); errc != nil { @@ -209,6 +207,15 @@ func (i *InfluxDB) Write(metrics []telegraf.Metric) error { i.Database) } } + if strings.Contains(e.Error(), "field type conflict") { + log.Printf("E! Field type conflict, dropping conflicted points: %s", e) + // setting err to nil, otherwise we will keep retrying and points + // w/ conflicting types will get stuck in the buffer forever. + err = nil + break + } + // Log write failure + log.Printf("E! InfluxDB Output Error: %s", e) } else { err = nil break