601 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			601 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
| package dropwizard
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/metric"
 | |
| 
 | |
| 	"fmt"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| var TimeFunc = func() time.Time {
 | |
| 	return time.Unix(0, 0)
 | |
| }
 | |
| 
 | |
| // validEmptyJSON is a valid dropwizard json document, but without any metrics
 | |
| const validEmptyJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" :	{},
 | |
| 	"meters" :		{},
 | |
| 	"gauges" :		{},
 | |
| 	"histograms" :	{},
 | |
| 	"timers" :		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidEmptyJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	// Most basic vanilla test
 | |
| 	metrics, err := parser.Parse([]byte(validEmptyJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 0)
 | |
| }
 | |
| 
 | |
| // validCounterJSON is a valid dropwizard json document containing one counter
 | |
| const validCounterJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{ 
 | |
| 		"measurement" : {
 | |
| 			"count" : 1
 | |
| 		}
 | |
| 	},
 | |
| 	"meters" : 		{},
 | |
| 	"gauges" : 		{},
 | |
| 	"histograms" : 	{},
 | |
| 	"timers" : 		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidCounterJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validCounterJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count": float64(1),
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "counter"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validEmbeddedCounterJSON is a valid json document containing separate fields for dropwizard metrics, tags and time override.
 | |
| const validEmbeddedCounterJSON = `
 | |
| {
 | |
| 	"time" : "2017-02-22T14:33:03.662+02:00",
 | |
| 	"tags" : {
 | |
| 		"tag1" : "green",
 | |
| 		"tag2" : "yellow",
 | |
| 		"tag3 space,comma=equals" : "red ,="
 | |
| 	},
 | |
| 	"metrics" : {
 | |
| 		"counters" : 	{ 
 | |
| 			"measurement" : {
 | |
| 				"count" : 1
 | |
| 			}
 | |
| 		},
 | |
| 		"meters" : 		{},
 | |
| 		"gauges" : 		{},
 | |
| 		"histograms" : 	{},
 | |
| 		"timers" : 		{}
 | |
| 	}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidEmbeddedCounterJSON(t *testing.T) {
 | |
| 	timeFormat := "2006-01-02T15:04:05Z07:00"
 | |
| 	metricTime, _ := time.Parse(timeFormat, "2017-02-22T15:33:03.662+03:00")
 | |
| 	parser := NewParser()
 | |
| 	parser.MetricRegistryPath = "metrics"
 | |
| 	parser.TagsPath = "tags"
 | |
| 	parser.TimePath = "time"
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validEmbeddedCounterJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count": float64(1),
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{
 | |
| 		"metric_type": "counter",
 | |
| 		"tag1":        "green",
 | |
| 		"tag2":        "yellow",
 | |
| 		"tag3 space,comma=equals": "red ,=",
 | |
| 	}, metrics[0].Tags())
 | |
| 	assert.True(t, metricTime.Equal(metrics[0].Time()), fmt.Sprintf("%s should be equal to %s", metrics[0].Time(), metricTime))
 | |
| 
 | |
| 	// now test json tags through TagPathsMap
 | |
| 	parser2 := NewParser()
 | |
| 	parser2.MetricRegistryPath = "metrics"
 | |
| 	parser2.TagPathsMap = map[string]string{"tag1": "tags.tag1"}
 | |
| 	parser2.TimePath = "time"
 | |
| 	metrics2, err2 := parser2.Parse([]byte(validEmbeddedCounterJSON))
 | |
| 	assert.NoError(t, err2)
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "counter", "tag1": "green"}, metrics2[0].Tags())
 | |
| }
 | |
| 
 | |
| // validMeterJSON1 is a valid dropwizard json document containing one meter
 | |
| const validMeterJSON1 = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{},
 | |
| 	"meters" : 		{ 
 | |
| 		"measurement1" : {
 | |
| 			"count" : 1,
 | |
| 			"m15_rate" : 1.0,
 | |
| 			"m1_rate" : 1.0,
 | |
| 			"m5_rate" : 1.0,
 | |
| 			"mean_rate" : 1.0,
 | |
| 			"units" : "events/second"
 | |
| 		}
 | |
| 	},
 | |
| 	"gauges" : 		{},
 | |
| 	"histograms" : 	{},
 | |
| 	"timers" : 		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidMeterJSON1(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validMeterJSON1))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement1", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count":     float64(1),
 | |
| 		"m15_rate":  float64(1),
 | |
| 		"m1_rate":   float64(1),
 | |
| 		"m5_rate":   float64(1),
 | |
| 		"mean_rate": float64(1),
 | |
| 		"units":     "events/second",
 | |
| 	}, metrics[0].Fields())
 | |
| 
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "meter"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validMeterJSON2 is a valid dropwizard json document containing one meter with one tag
 | |
| const validMeterJSON2 = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{},
 | |
| 	"meters" : 		{ 
 | |
| 		"measurement2,key=value" : {
 | |
| 			"count" : 2,
 | |
| 			"m15_rate" : 2.0,
 | |
| 			"m1_rate" : 2.0,
 | |
| 			"m5_rate" : 2.0,
 | |
| 			"mean_rate" : 2.0,
 | |
| 			"units" : "events/second"
 | |
| 		}
 | |
| 	},
 | |
| 	"gauges" : 		{},
 | |
| 	"histograms" : 	{},
 | |
| 	"timers" : 		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidMeterJSON2(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validMeterJSON2))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement2", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count":     float64(2),
 | |
| 		"m15_rate":  float64(2),
 | |
| 		"m1_rate":   float64(2),
 | |
| 		"m5_rate":   float64(2),
 | |
| 		"mean_rate": float64(2),
 | |
| 		"units":     "events/second",
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "meter", "key": "value"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validGaugeJSON is a valid dropwizard json document containing one gauge
 | |
| const validGaugeJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{},
 | |
| 	"meters" : 		{},
 | |
| 	"gauges" : 		{
 | |
| 		"measurement" : {
 | |
| 			"value" : true
 | |
| 		}
 | |
| 	},
 | |
| 	"histograms" : 	{},
 | |
| 	"timers" : 		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidGaugeJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validGaugeJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"value": true,
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "gauge"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validHistogramJSON is a valid dropwizard json document containing one histogram
 | |
| const validHistogramJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{},
 | |
| 	"meters" : 		{},
 | |
| 	"gauges" : 		{},
 | |
| 	"histograms" : 	{
 | |
| 		"measurement" : {
 | |
| 			"count" : 1,
 | |
| 			"max" : 2,
 | |
| 			"mean" : 3,
 | |
| 			"min" : 4,
 | |
| 			"p50" : 5,
 | |
| 			"p75" : 6,
 | |
| 			"p95" : 7,
 | |
| 			"p98" : 8,
 | |
| 			"p99" : 9,
 | |
| 			"p999" : 10,
 | |
| 			"stddev" : 11
 | |
| 		}
 | |
| 	},
 | |
| 	"timers" : 		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidHistogramJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validHistogramJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count":  float64(1),
 | |
| 		"max":    float64(2),
 | |
| 		"mean":   float64(3),
 | |
| 		"min":    float64(4),
 | |
| 		"p50":    float64(5),
 | |
| 		"p75":    float64(6),
 | |
| 		"p95":    float64(7),
 | |
| 		"p98":    float64(8),
 | |
| 		"p99":    float64(9),
 | |
| 		"p999":   float64(10),
 | |
| 		"stddev": float64(11),
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "histogram"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validTimerJSON is a valid dropwizard json document containing one timer
 | |
| const validTimerJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{},
 | |
| 	"meters" : 		{},
 | |
| 	"gauges" : 		{},
 | |
| 	"histograms" : 	{},
 | |
| 	"timers" : 		{
 | |
| 		"measurement" : {
 | |
| 			"count" : 1,
 | |
| 			"max" : 2,
 | |
| 			"mean" : 3,
 | |
| 			"min" : 4,
 | |
| 			"p50" : 5,
 | |
| 			"p75" : 6,
 | |
| 			"p95" : 7,
 | |
| 			"p98" : 8,
 | |
| 			"p99" : 9,
 | |
| 			"p999" : 10,
 | |
| 			"stddev" : 11,
 | |
| 			"m15_rate" : 12,
 | |
| 			"m1_rate" : 13,
 | |
| 			"m5_rate" : 14,
 | |
| 			"mean_rate" : 15,
 | |
| 			"duration_units" : "seconds",
 | |
| 			"rate_units" : "calls/second"
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidTimerJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validTimerJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 1)
 | |
| 	assert.Equal(t, "measurement", metrics[0].Name())
 | |
| 	assert.Equal(t, map[string]interface{}{
 | |
| 		"count":          float64(1),
 | |
| 		"max":            float64(2),
 | |
| 		"mean":           float64(3),
 | |
| 		"min":            float64(4),
 | |
| 		"p50":            float64(5),
 | |
| 		"p75":            float64(6),
 | |
| 		"p95":            float64(7),
 | |
| 		"p98":            float64(8),
 | |
| 		"p99":            float64(9),
 | |
| 		"p999":           float64(10),
 | |
| 		"stddev":         float64(11),
 | |
| 		"m15_rate":       float64(12),
 | |
| 		"m1_rate":        float64(13),
 | |
| 		"m5_rate":        float64(14),
 | |
| 		"mean_rate":      float64(15),
 | |
| 		"duration_units": "seconds",
 | |
| 		"rate_units":     "calls/second",
 | |
| 	}, metrics[0].Fields())
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "timer"}, metrics[0].Tags())
 | |
| }
 | |
| 
 | |
| // validAllJSON is a valid dropwizard json document containing one metric of each type
 | |
| const validAllJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" : 	{
 | |
| 		"measurement" : {"count" : 1}
 | |
| 	},
 | |
| 	"meters" : 		{
 | |
| 		"measurement" : {"count" : 1}
 | |
| 	},
 | |
| 	"gauges" : 		{
 | |
| 		"measurement" : {"value" : 1}
 | |
| 	},
 | |
| 	"histograms" : 	{
 | |
| 		"measurement" : {"count" : 1}
 | |
| 	},
 | |
| 	"timers" : 		{
 | |
| 		"measurement" : {"count" : 1}
 | |
| 	}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseValidAllJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(validAllJSON))
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Len(t, metrics, 5)
 | |
| }
 | |
| 
 | |
| func TestTagParsingProblems(t *testing.T) {
 | |
| 	// giving a wrong path results in empty tags
 | |
| 	parser1 := NewParser()
 | |
| 	parser1.MetricRegistryPath = "metrics"
 | |
| 	parser1.TagsPath = "tags1"
 | |
| 	metrics1, err1 := parser1.Parse([]byte(validEmbeddedCounterJSON))
 | |
| 	assert.NoError(t, err1)
 | |
| 	assert.Len(t, metrics1, 1)
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "counter"}, metrics1[0].Tags())
 | |
| 
 | |
| 	// giving a wrong TagsPath falls back to TagPathsMap
 | |
| 	parser2 := NewParser()
 | |
| 	parser2.MetricRegistryPath = "metrics"
 | |
| 	parser2.TagsPath = "tags1"
 | |
| 	parser2.TagPathsMap = map[string]string{"tag1": "tags.tag1"}
 | |
| 	metrics2, err2 := parser2.Parse([]byte(validEmbeddedCounterJSON))
 | |
| 	assert.NoError(t, err2)
 | |
| 	assert.Len(t, metrics2, 1)
 | |
| 	assert.Equal(t, map[string]string{"metric_type": "counter", "tag1": "green"}, metrics2[0].Tags())
 | |
| }
 | |
| 
 | |
| // sampleTemplateJSON is a sample json document containing metrics to be tested against the templating engine.
 | |
| const sampleTemplateJSON = `
 | |
| {
 | |
| 	"version": 		"3.0.0",
 | |
| 	"counters" :	{},
 | |
| 	"meters" :		{},
 | |
| 	"gauges" :		{
 | |
| 		"vm.memory.heap.committed" 		: { "value" : 1 },
 | |
| 		"vm.memory.heap.init" 			: { "value" : 2 },
 | |
| 		"vm.memory.heap.max" 			: { "value" : 3 },
 | |
| 		"vm.memory.heap.usage" 			: { "value" : 4 },
 | |
| 		"vm.memory.heap.used" 			: { "value" : 5 },
 | |
| 		"vm.memory.non-heap.committed" 	: { "value" : 6 },
 | |
| 		"vm.memory.non-heap.init" 		: { "value" : 7 },
 | |
| 		"vm.memory.non-heap.max" 		: { "value" : 8 },
 | |
| 		"vm.memory.non-heap.usage" 		: { "value" : 9 },
 | |
| 		"vm.memory.non-heap.used" 		: { "value" : 10 }
 | |
| 	},
 | |
| 	"histograms" :	{
 | |
| 		"jenkins.job.building.duration" : {
 | |
| 			"count" : 1,
 | |
| 			"max" : 2,
 | |
| 			"mean" : 3,
 | |
| 			"min" : 4,
 | |
| 			"p50" : 5,
 | |
| 			"p75" : 6,
 | |
| 			"p95" : 7,
 | |
| 			"p98" : 8,
 | |
| 			"p99" : 9,
 | |
| 			"p999" : 10,
 | |
| 			"stddev" : 11
 | |
| 		}
 | |
| 	},
 | |
| 	"timers" :		{}
 | |
| }
 | |
| `
 | |
| 
 | |
| func TestParseSampleTemplateJSON(t *testing.T) {
 | |
| 	parser := NewParser()
 | |
| 	err := parser.SetTemplates("_", []string{
 | |
| 		"jenkins.* measurement.metric.metric.field",
 | |
| 		"vm.* measurement.measurement.pool.field",
 | |
| 	})
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	metrics, err := parser.Parse([]byte(sampleTemplateJSON))
 | |
| 	require.NoError(t, err)
 | |
| 
 | |
| 	require.Len(t, metrics, 11)
 | |
| 
 | |
| 	jenkinsMetric := search(metrics, "jenkins", nil, "")
 | |
| 	require.NotNil(t, jenkinsMetric, "the metrics should contain a jenkins measurement")
 | |
| 	require.Equal(t, map[string]interface{}{
 | |
| 		"duration_count":  float64(1),
 | |
| 		"duration_max":    float64(2),
 | |
| 		"duration_mean":   float64(3),
 | |
| 		"duration_min":    float64(4),
 | |
| 		"duration_p50":    float64(5),
 | |
| 		"duration_p75":    float64(6),
 | |
| 		"duration_p95":    float64(7),
 | |
| 		"duration_p98":    float64(8),
 | |
| 		"duration_p99":    float64(9),
 | |
| 		"duration_p999":   float64(10),
 | |
| 		"duration_stddev": float64(11),
 | |
| 	}, jenkinsMetric.Fields())
 | |
| 	require.Equal(t, map[string]string{"metric_type": "histogram", "metric": "job_building"}, jenkinsMetric.Tags())
 | |
| 
 | |
| 	vmMemoryHeapCommitted := search(metrics, "vm_memory", map[string]string{"pool": "heap"}, "committed_value")
 | |
| 	require.NotNil(t, vmMemoryHeapCommitted)
 | |
| 	require.Equal(t, map[string]interface{}{
 | |
| 		"committed_value": float64(1),
 | |
| 	}, vmMemoryHeapCommitted.Fields())
 | |
| 	require.Equal(t, map[string]string{"metric_type": "gauge", "pool": "heap"}, vmMemoryHeapCommitted.Tags())
 | |
| 
 | |
| 	vmMemoryNonHeapCommitted := search(metrics, "vm_memory", map[string]string{"pool": "non-heap"}, "committed_value")
 | |
| 	require.NotNil(t, vmMemoryNonHeapCommitted)
 | |
| 	require.Equal(t, map[string]interface{}{
 | |
| 		"committed_value": float64(6),
 | |
| 	}, vmMemoryNonHeapCommitted.Fields())
 | |
| 	require.Equal(t, map[string]string{"metric_type": "gauge", "pool": "non-heap"}, vmMemoryNonHeapCommitted.Tags())
 | |
| }
 | |
| 
 | |
| func search(metrics []telegraf.Metric, name string, tags map[string]string, fieldName string) telegraf.Metric {
 | |
| 	for _, v := range metrics {
 | |
| 		if v.Name() == name && containsAll(v.Tags(), tags) {
 | |
| 			if len(fieldName) == 0 {
 | |
| 				return v
 | |
| 			}
 | |
| 			if _, ok := v.Fields()[fieldName]; ok {
 | |
| 				return v
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func containsAll(t1 map[string]string, t2 map[string]string) bool {
 | |
| 	for k, v := range t2 {
 | |
| 		if foundValue, ok := t1[k]; !ok || v != foundValue {
 | |
| 			return false
 | |
| 		}
 | |
| 	}
 | |
| 	return true
 | |
| }
 | |
| 
 | |
| func Metric(v telegraf.Metric, err error) telegraf.Metric {
 | |
| 	if err != nil {
 | |
| 		panic(err)
 | |
| 	}
 | |
| 	return v
 | |
| }
 | |
| 
 | |
| func NoError(t *testing.T, err error) {
 | |
| 	require.NoError(t, err)
 | |
| }
 | |
| 
 | |
| func TestDropWizard(t *testing.T) {
 | |
| 	tests := []struct {
 | |
| 		name    string
 | |
| 		input   []byte
 | |
| 		metrics []telegraf.Metric
 | |
| 		errFunc func(t *testing.T, err error)
 | |
| 	}{
 | |
| 		{
 | |
| 			name:  "minimal",
 | |
| 			input: []byte(`{"version": "3.0.0", "counters": {"cpu": {"value": 42}}}`),
 | |
| 			metrics: []telegraf.Metric{
 | |
| 				Metric(
 | |
| 					metric.New(
 | |
| 						"cpu",
 | |
| 						map[string]string{
 | |
| 							"metric_type": "counter",
 | |
| 						},
 | |
| 						map[string]interface{}{
 | |
| 							"value": 42.0,
 | |
| 						},
 | |
| 						TimeFunc(),
 | |
| 					),
 | |
| 				),
 | |
| 			},
 | |
| 			errFunc: NoError,
 | |
| 		},
 | |
| 		{
 | |
| 			name:  "name with space unescaped",
 | |
| 			input: []byte(`{"version": "3.0.0", "counters": {"hello world": {"value": 42}}}`),
 | |
| 			metrics: []telegraf.Metric{
 | |
| 				Metric(
 | |
| 					metric.New(
 | |
| 						"hello world",
 | |
| 						map[string]string{
 | |
| 							"metric_type": "counter",
 | |
| 						},
 | |
| 						map[string]interface{}{
 | |
| 							"value": 42.0,
 | |
| 						},
 | |
| 						TimeFunc(),
 | |
| 					),
 | |
| 				),
 | |
| 			},
 | |
| 			errFunc: NoError,
 | |
| 		},
 | |
| 		{
 | |
| 			name:  "name with space single slash escaped is not valid JSON",
 | |
| 			input: []byte(`{"version": "3.0.0", "counters": {"hello\ world": {"value": 42}}}`),
 | |
| 			errFunc: func(t *testing.T, err error) {
 | |
| 				require.Error(t, err)
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name:  "name with space double slash escape",
 | |
| 			input: []byte(`{"version": "3.0.0", "counters": {"hello\\ world": {"value": 42}}}`),
 | |
| 			metrics: []telegraf.Metric{
 | |
| 				Metric(
 | |
| 					metric.New(
 | |
| 						"hello world",
 | |
| 						map[string]string{
 | |
| 							"metric_type": "counter",
 | |
| 						},
 | |
| 						map[string]interface{}{
 | |
| 							"value": 42.0,
 | |
| 						},
 | |
| 						TimeFunc(),
 | |
| 					),
 | |
| 				),
 | |
| 			},
 | |
| 			errFunc: NoError,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, tt := range tests {
 | |
| 		t.Run(tt.name, func(t *testing.T) {
 | |
| 			parser := NewParser()
 | |
| 			parser.SetTimeFunc(TimeFunc)
 | |
| 			metrics, err := parser.Parse(tt.input)
 | |
| 			tt.errFunc(t, err)
 | |
| 
 | |
| 			require.Equal(t, len(tt.metrics), len(metrics))
 | |
| 			for i, expected := range tt.metrics {
 | |
| 				require.Equal(t, expected.Name(), metrics[i].Name())
 | |
| 				require.Equal(t, expected.Tags(), metrics[i].Tags())
 | |
| 				require.Equal(t, expected.Fields(), metrics[i].Fields())
 | |
| 				require.Equal(t, expected.Time(), metrics[i].Time())
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 |