Fix InfluxDB output UDP line splitting (#5439)
This commit is contained in:
parent
e4d084fbc3
commit
5dfa3fa769
|
@ -1,6 +1,8 @@
|
|||
package influxdb
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
@ -45,9 +47,9 @@ func NewUDPClient(config *UDPConfig) (*udpClient, error) {
|
|||
serializer := config.Serializer
|
||||
if serializer == nil {
|
||||
s := influx.NewSerializer()
|
||||
s.SetMaxLineBytes(config.MaxPayloadSize)
|
||||
serializer = s
|
||||
}
|
||||
serializer.SetMaxLineBytes(size)
|
||||
|
||||
dialer := config.Dialer
|
||||
if dialer == nil {
|
||||
|
@ -96,7 +98,11 @@ func (c *udpClient) Write(ctx context.Context, metrics []telegraf.Metric) error
|
|||
continue
|
||||
}
|
||||
|
||||
_, err = c.conn.Write(octets)
|
||||
scanner := bufio.NewScanner(bytes.NewReader(octets))
|
||||
scanner.Split(scanLines)
|
||||
for scanner.Scan() {
|
||||
_, err = c.conn.Write(scanner.Bytes())
|
||||
}
|
||||
if err != nil {
|
||||
c.conn.Close()
|
||||
c.conn = nil
|
||||
|
@ -118,3 +124,15 @@ type netDialer struct {
|
|||
func (d *netDialer) DialContext(ctx context.Context, network, address string) (Conn, error) {
|
||||
return d.Dialer.DialContext(ctx, network, address)
|
||||
}
|
||||
|
||||
func scanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
|
||||
if atEOF && len(data) == 0 {
|
||||
return 0, nil, nil
|
||||
}
|
||||
if i := bytes.IndexByte(data, '\n'); i >= 0 {
|
||||
// We have a full newline-terminated line.
|
||||
return i + 1, data[0 : i+1], nil
|
||||
|
||||
}
|
||||
return 0, nil, nil
|
||||
}
|
||||
|
|
|
@ -240,6 +240,7 @@ func (s *Serializer) writeMetric(w io.Writer, m telegraf.Metric) error {
|
|||
return err
|
||||
}
|
||||
|
||||
pairsLen = 0
|
||||
firstField = true
|
||||
bytesNeeded = len(s.header) + len(s.pair) + len(s.footer)
|
||||
|
||||
|
|
|
@ -275,6 +275,24 @@ var tests = []struct {
|
|||
),
|
||||
output: []byte("cpu abc=123i 1519194109000000042\ncpu def=456i 1519194109000000042\n"),
|
||||
},
|
||||
{
|
||||
name: "split_fields_overflow",
|
||||
maxBytes: 43,
|
||||
input: MustMetric(
|
||||
metric.New(
|
||||
"cpu",
|
||||
map[string]string{},
|
||||
map[string]interface{}{
|
||||
"abc": 123,
|
||||
"def": 456,
|
||||
"ghi": 789,
|
||||
"jkl": 123,
|
||||
},
|
||||
time.Unix(1519194109, 42),
|
||||
),
|
||||
),
|
||||
output: []byte("cpu abc=123i,def=456i 1519194109000000042\ncpu ghi=789i,jkl=123i 1519194109000000042\n"),
|
||||
},
|
||||
{
|
||||
name: "name newline",
|
||||
input: MustMetric(
|
||||
|
|
Loading…
Reference in New Issue