Allow metrics to be unserializable in influx.Reader (#4047)
Metrics that are unserializable will be logged at debug level, but the rest of the batch will be sent. Unserializable metrics can occur during normal operation such as if you remove all fields from a metric or the metric cannot fit within the line size limit.
This commit is contained in:
@@ -2,7 +2,9 @@ package influx
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
)
|
||||
@@ -47,11 +49,25 @@ func (r *reader) Read(p []byte) (int, error) {
|
||||
return 0, io.EOF
|
||||
}
|
||||
|
||||
_, err := r.serializer.Write(r.buf, r.metrics[r.offset])
|
||||
r.offset += 1
|
||||
if err != nil {
|
||||
r.buf.Reset()
|
||||
return 0, err
|
||||
for _, metric := range r.metrics[r.offset:] {
|
||||
_, err := r.serializer.Write(r.buf, metric)
|
||||
r.offset += 1
|
||||
if err != nil {
|
||||
r.buf.Reset()
|
||||
switch err.(type) {
|
||||
case *MetricError:
|
||||
// Since we are serializing an array of metrics, don't fail
|
||||
// the entire batch just because of one unserializable metric.
|
||||
log.Printf(
|
||||
"D! [serializers.influx] could not serialize metric %q: %v; discarding metric",
|
||||
metric.Name(), err)
|
||||
continue
|
||||
default:
|
||||
fmt.Println(err)
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
return r.buf.Read(p)
|
||||
|
||||
Reference in New Issue
Block a user