Reduce the cpu/memory used by the graphite parser (#5841)
This commit is contained in:
parent
1f2cb85354
commit
b35beb2fba
|
@ -1,10 +1,9 @@
|
||||||
package graphite
|
package graphite
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -63,42 +62,36 @@ func NewGraphiteParser(
|
||||||
|
|
||||||
func (p *GraphiteParser) Parse(buf []byte) ([]telegraf.Metric, error) {
|
func (p *GraphiteParser) Parse(buf []byte) ([]telegraf.Metric, error) {
|
||||||
// parse even if the buffer begins with a newline
|
// parse even if the buffer begins with a newline
|
||||||
buf = bytes.TrimPrefix(buf, []byte("\n"))
|
if len(buf) != 0 && buf[0] == '\n' {
|
||||||
// add newline to end if not exists:
|
buf = buf[1:]
|
||||||
if len(buf) > 0 && !bytes.HasSuffix(buf, []byte("\n")) {
|
|
||||||
buf = append(buf, []byte("\n")...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
metrics := make([]telegraf.Metric, 0)
|
var metrics []telegraf.Metric
|
||||||
|
var errs []string
|
||||||
|
|
||||||
var errStr string
|
|
||||||
buffer := bytes.NewBuffer(buf)
|
|
||||||
reader := bufio.NewReader(buffer)
|
|
||||||
for {
|
for {
|
||||||
// Read up to the next newline.
|
n := bytes.IndexByte(buf, '\n')
|
||||||
buf, err := reader.ReadBytes('\n')
|
var line []byte
|
||||||
if err == io.EOF {
|
if n >= 0 {
|
||||||
|
line = bytes.TrimSpace(buf[:n:n])
|
||||||
|
} else {
|
||||||
|
line = bytes.TrimSpace(buf) // last line
|
||||||
|
}
|
||||||
|
if len(line) != 0 {
|
||||||
|
metric, err := p.ParseLine(string(line))
|
||||||
|
if err == nil {
|
||||||
|
metrics = append(metrics, metric)
|
||||||
|
} else {
|
||||||
|
errs = append(errs, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if n < 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
buf = buf[n+1:]
|
||||||
return metrics, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trim the buffer, even though there should be no padding
|
|
||||||
line := strings.TrimSpace(string(buf))
|
|
||||||
if line == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
metric, err := p.ParseLine(line)
|
|
||||||
if err == nil {
|
|
||||||
metrics = append(metrics, metric)
|
|
||||||
} else {
|
|
||||||
errStr += err.Error() + "\n"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if len(errs) != 0 {
|
||||||
if errStr != "" {
|
return metrics, errors.New(strings.Join(errs, "\n"))
|
||||||
return metrics, fmt.Errorf(strings.TrimSpace(errStr))
|
|
||||||
}
|
}
|
||||||
return metrics, nil
|
return metrics, nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue