Change to NewStreamParser to accept larger inputs from scanner (#8892)
* change to NewStreamParser to accept larger inputs from scanner * fmt changes
This commit is contained in:
parent
5f26582582
commit
f3229f5ec1
|
|
@ -1,14 +1,13 @@
|
||||||
package shim
|
package shim
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/agent"
|
"github.com/influxdata/telegraf/agent"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers"
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
||||||
"github.com/influxdata/telegraf/plugins/processors"
|
"github.com/influxdata/telegraf/plugins/processors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -37,12 +36,7 @@ func (s *Shim) RunProcessor() error {
|
||||||
acc := agent.NewAccumulator(s, s.metricCh)
|
acc := agent.NewAccumulator(s, s.metricCh)
|
||||||
acc.SetPrecision(time.Nanosecond)
|
acc.SetPrecision(time.Nanosecond)
|
||||||
|
|
||||||
parser, err := parsers.NewInfluxParser()
|
err := s.Processor.Start(acc)
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("Failed to create new parser: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = s.Processor.Start(acc)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to start processor: %w", err)
|
return fmt.Errorf("failed to start processor: %w", err)
|
||||||
}
|
}
|
||||||
|
|
@ -54,13 +48,21 @@ func (s *Shim) RunProcessor() error {
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
scanner := bufio.NewScanner(s.stdin)
|
parser := influx.NewStreamParser(s.stdin)
|
||||||
for scanner.Scan() {
|
for {
|
||||||
m, err := parser.ParseLine(scanner.Text())
|
m, err := parser.Next()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(s.stderr, "Failed to parse metric: %s\b", err)
|
if err == influx.EOF {
|
||||||
|
break // stream ended
|
||||||
|
}
|
||||||
|
if parseErr, isParseError := err.(*influx.ParseError); isParseError {
|
||||||
|
fmt.Fprintf(s.stderr, "Failed to parse metric: %s\b", parseErr)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Fprintf(s.stderr, "Failure during reading stdin: %s\b", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
s.Processor.Add(m, acc)
|
s.Processor.Add(m, acc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math/rand"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -16,7 +17,21 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestProcessorShim(t *testing.T) {
|
func TestProcessorShim(t *testing.T) {
|
||||||
p := &testProcessor{}
|
testSendAndRecieve(t, "f1", "fv1")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProcessorShimWithLargerThanDefaultScannerBufferSize(t *testing.T) {
|
||||||
|
letters := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
|
||||||
|
b := make([]rune, bufio.MaxScanTokenSize*2)
|
||||||
|
for i := range b {
|
||||||
|
b[i] = letters[rand.Intn(len(letters))]
|
||||||
|
}
|
||||||
|
|
||||||
|
testSendAndRecieve(t, "f1", string(b))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testSendAndRecieve(t *testing.T, fieldKey string, fieldValue string) {
|
||||||
|
p := &testProcessor{"hi", "mom"}
|
||||||
|
|
||||||
stdinReader, stdinWriter := io.Pipe()
|
stdinReader, stdinWriter := io.Pipe()
|
||||||
stdoutReader, stdoutWriter := io.Pipe()
|
stdoutReader, stdoutWriter := io.Pipe()
|
||||||
|
|
@ -45,7 +60,8 @@ func TestProcessorShim(t *testing.T) {
|
||||||
"a": "b",
|
"a": "b",
|
||||||
},
|
},
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"v": 1,
|
"v": 1,
|
||||||
|
fieldKey: fieldValue,
|
||||||
},
|
},
|
||||||
time.Now(),
|
time.Now(),
|
||||||
)
|
)
|
||||||
|
|
@ -62,19 +78,24 @@ func TestProcessorShim(t *testing.T) {
|
||||||
mOut, err := parser.ParseLine(out)
|
mOut, err := parser.ParseLine(out)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
val, ok := mOut.GetTag("hi")
|
val, ok := mOut.GetTag(p.tagName)
|
||||||
require.True(t, ok)
|
require.True(t, ok)
|
||||||
require.Equal(t, "mom", val)
|
require.Equal(t, p.tagValue, val)
|
||||||
|
val2, ok := mOut.Fields()[fieldKey]
|
||||||
|
require.True(t, ok)
|
||||||
|
require.Equal(t, fieldValue, val2)
|
||||||
go ioutil.ReadAll(r)
|
go ioutil.ReadAll(r)
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
type testProcessor struct{}
|
type testProcessor struct {
|
||||||
|
tagName string
|
||||||
|
tagValue string
|
||||||
|
}
|
||||||
|
|
||||||
func (p *testProcessor) Apply(in ...telegraf.Metric) []telegraf.Metric {
|
func (p *testProcessor) Apply(in ...telegraf.Metric) []telegraf.Metric {
|
||||||
for _, metric := range in {
|
for _, metric := range in {
|
||||||
metric.AddTag("hi", "mom")
|
metric.AddTag(p.tagName, p.tagValue)
|
||||||
}
|
}
|
||||||
return in
|
return in
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue