68
plugins/parsers/value/parser.go
Normal file
68
plugins/parsers/value/parser.go
Normal file
@@ -0,0 +1,68 @@
|
||||
package value
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/influxdata/telegraf"
|
||||
)
|
||||
|
||||
type ValueParser struct {
|
||||
MetricName string
|
||||
DataType string
|
||||
DefaultTags map[string]string
|
||||
}
|
||||
|
||||
func (v *ValueParser) Parse(buf []byte) ([]telegraf.Metric, error) {
|
||||
// separate out any fields in the buffer, ignore anything but the last.
|
||||
values := bytes.Fields(buf)
|
||||
if len(values) < 1 {
|
||||
return []telegraf.Metric{}, nil
|
||||
}
|
||||
valueStr := string(values[len(values)-1])
|
||||
|
||||
var value interface{}
|
||||
var err error
|
||||
switch v.DataType {
|
||||
case "", "int", "integer":
|
||||
value, err = strconv.Atoi(valueStr)
|
||||
case "float", "long":
|
||||
value, err = strconv.ParseFloat(valueStr, 64)
|
||||
case "str", "string":
|
||||
value = valueStr
|
||||
case "bool", "boolean":
|
||||
value, err = strconv.ParseBool(valueStr)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fields := map[string]interface{}{"value": value}
|
||||
metric, err := telegraf.NewMetric(v.MetricName, v.DefaultTags,
|
||||
fields, time.Now().UTC())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return []telegraf.Metric{metric}, nil
|
||||
}
|
||||
|
||||
func (v *ValueParser) ParseLine(line string) (telegraf.Metric, error) {
|
||||
metrics, err := v.Parse([]byte(line))
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(metrics) < 1 {
|
||||
return nil, fmt.Errorf("Can not parse the line: %s, for data format: value", line)
|
||||
}
|
||||
|
||||
return metrics[0], nil
|
||||
}
|
||||
|
||||
func (v *ValueParser) SetDefaultTags(tags map[string]string) {
|
||||
v.DefaultTags = tags
|
||||
}
|
||||
238
plugins/parsers/value/parser_test.go
Normal file
238
plugins/parsers/value/parser_test.go
Normal file
@@ -0,0 +1,238 @@
|
||||
package value
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestParseValidValues(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
metrics, err := parser.Parse([]byte("55"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": int64(55),
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "float",
|
||||
}
|
||||
metrics, err = parser.Parse([]byte("64"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": float64(64),
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "string",
|
||||
}
|
||||
metrics, err = parser.Parse([]byte("foobar"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": "foobar",
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "boolean",
|
||||
}
|
||||
metrics, err = parser.Parse([]byte("true"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": true,
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{}, metrics[0].Tags())
|
||||
}
|
||||
|
||||
func TestParseMultipleValues(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
metrics, err := parser.Parse([]byte(`55
|
||||
45
|
||||
223
|
||||
12
|
||||
999
|
||||
`))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": int64(999),
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{}, metrics[0].Tags())
|
||||
}
|
||||
|
||||
func TestParseLineValidValues(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
metric, err := parser.ParseLine("55")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "value_test", metric.Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": int64(55),
|
||||
}, metric.Fields())
|
||||
assert.Equal(t, map[string]string{}, metric.Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "float",
|
||||
}
|
||||
metric, err = parser.ParseLine("64")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "value_test", metric.Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": float64(64),
|
||||
}, metric.Fields())
|
||||
assert.Equal(t, map[string]string{}, metric.Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "string",
|
||||
}
|
||||
metric, err = parser.ParseLine("foobar")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "value_test", metric.Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": "foobar",
|
||||
}, metric.Fields())
|
||||
assert.Equal(t, map[string]string{}, metric.Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "boolean",
|
||||
}
|
||||
metric, err = parser.ParseLine("true")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "value_test", metric.Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": true,
|
||||
}, metric.Fields())
|
||||
assert.Equal(t, map[string]string{}, metric.Tags())
|
||||
}
|
||||
|
||||
func TestParseInvalidValues(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
metrics, err := parser.Parse([]byte("55.0"))
|
||||
assert.Error(t, err)
|
||||
assert.Len(t, metrics, 0)
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "float",
|
||||
}
|
||||
metrics, err = parser.Parse([]byte("foobar"))
|
||||
assert.Error(t, err)
|
||||
assert.Len(t, metrics, 0)
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "boolean",
|
||||
}
|
||||
metrics, err = parser.Parse([]byte("213"))
|
||||
assert.Error(t, err)
|
||||
assert.Len(t, metrics, 0)
|
||||
}
|
||||
|
||||
func TestParseLineInvalidValues(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
_, err := parser.ParseLine("55.0")
|
||||
assert.Error(t, err)
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "float",
|
||||
}
|
||||
_, err = parser.ParseLine("foobar")
|
||||
assert.Error(t, err)
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "boolean",
|
||||
}
|
||||
_, err = parser.ParseLine("213")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestParseValidValuesDefaultTags(t *testing.T) {
|
||||
parser := ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "integer",
|
||||
}
|
||||
parser.SetDefaultTags(map[string]string{"test": "tag"})
|
||||
metrics, err := parser.Parse([]byte("55"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": int64(55),
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{"test": "tag"}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "float",
|
||||
}
|
||||
parser.SetDefaultTags(map[string]string{"test": "tag"})
|
||||
metrics, err = parser.Parse([]byte("64"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": float64(64),
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{"test": "tag"}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "string",
|
||||
}
|
||||
parser.SetDefaultTags(map[string]string{"test": "tag"})
|
||||
metrics, err = parser.Parse([]byte("foobar"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": "foobar",
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{"test": "tag"}, metrics[0].Tags())
|
||||
|
||||
parser = ValueParser{
|
||||
MetricName: "value_test",
|
||||
DataType: "boolean",
|
||||
}
|
||||
parser.SetDefaultTags(map[string]string{"test": "tag"})
|
||||
metrics, err = parser.Parse([]byte("true"))
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, metrics, 1)
|
||||
assert.Equal(t, "value_test", metrics[0].Name())
|
||||
assert.Equal(t, map[string]interface{}{
|
||||
"value": true,
|
||||
}, metrics[0].Fields())
|
||||
assert.Equal(t, map[string]string{"test": "tag"}, metrics[0].Tags())
|
||||
}
|
||||
Reference in New Issue
Block a user