diff --git a/influx2otel/metrics.go b/influx2otel/metrics.go index 7c37cf9..1b3f83e 100644 --- a/influx2otel/metrics.go +++ b/influx2otel/metrics.go @@ -15,13 +15,27 @@ import ( "github.com/influxdata/influxdb-observability/common" ) +type LineProtocolToOtelMetricsConfig struct { + Logger common.Logger + NameSeparator string +} + +func DefaultLineProtocolToOtelMetricsConfig() *LineProtocolToOtelMetricsConfig { + return &LineProtocolToOtelMetricsConfig{ + Logger: new(common.NoopLogger), + NameSeparator: "_", + } +} + type LineProtocolToOtelMetrics struct { - logger common.Logger + logger common.Logger + nameSeparator string } -func NewLineProtocolToOtelMetrics(logger common.Logger) (*LineProtocolToOtelMetrics, error) { +func NewLineProtocolToOtelMetrics(config *LineProtocolToOtelMetricsConfig) (*LineProtocolToOtelMetrics, error) { return &LineProtocolToOtelMetrics{ - logger: logger, + logger: config.Logger, + nameSeparator: config.NameSeparator, }, nil } @@ -33,7 +47,8 @@ func (c *LineProtocolToOtelMetrics) NewBatch() *MetricsBatch { histogramDataPointsByMDPK: make(map[pmetric.Metric]map[dataPointKey]pmetric.HistogramDataPoint), summaryDataPointsByMDPK: make(map[pmetric.Metric]map[dataPointKey]pmetric.SummaryDataPoint), - logger: c.logger, + logger: c.logger, + nameSeparator: c.nameSeparator, } } @@ -44,7 +59,8 @@ type MetricsBatch struct { histogramDataPointsByMDPK map[pmetric.Metric]map[dataPointKey]pmetric.HistogramDataPoint summaryDataPointsByMDPK map[pmetric.Metric]map[dataPointKey]pmetric.SummaryDataPoint - logger common.Logger + logger common.Logger + nameSeparator string } // measurement - metric name @@ -235,7 +251,7 @@ func (b *MetricsBatch) addPointWithUnknownSchema(measurement string, tags map[st continue } - metricName := fmt.Sprintf("%s_%s", measurement, k) + metricName := fmt.Sprintf("%s%s%s", measurement, b.nameSeparator, k) metric, attributes, err := b.lookupMetric(metricName, tags, common.InfluxMetricValueTypeGauge) if err != nil { return err diff --git a/influx2otel/metrics_statsd_schema_test.go b/influx2otel/metrics_statsd_schema_test.go index d1ac979..279ea9b 100644 --- a/influx2otel/metrics_statsd_schema_test.go +++ b/influx2otel/metrics_statsd_schema_test.go @@ -14,7 +14,8 @@ import ( ) func TestStatsdTimingSchema(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -106,7 +107,8 @@ func TestStatsdTimingSchema(t *testing.T) { } func TestStatsCounter(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) // statsd metric: @@ -142,7 +144,8 @@ func TestStatsCounter(t *testing.T) { } func TestStatsDeltaCounter(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) // statsd metric: @@ -179,7 +182,8 @@ func TestStatsDeltaCounter(t *testing.T) { } func TestStatsGauge(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) // statsd metric: @@ -214,7 +218,8 @@ func TestStatsGauge(t *testing.T) { } func TestStatsdSetsSchema(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) // statsd metric: @@ -249,7 +254,8 @@ func TestStatsdSetsSchema(t *testing.T) { } func TestDeltaTemporalityStatsdCounter(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) // statsd metric: diff --git a/influx2otel/metrics_telegraf_prometheus_v1.go b/influx2otel/metrics_telegraf_prometheus_v1.go index 765796f..03618b8 100644 --- a/influx2otel/metrics_telegraf_prometheus_v1.go +++ b/influx2otel/metrics_telegraf_prometheus_v1.go @@ -130,7 +130,7 @@ func (b *MetricsBatch) convertGaugeV1(measurement string, tags map[string]string continue } - metricName := fmt.Sprintf("%s_%s", measurement, k) + metricName := fmt.Sprintf("%s%s%s", measurement, b.nameSeparator, k) metric, attributes, err := b.lookupMetric(metricName, tags, common.InfluxMetricValueTypeGauge) if err != nil { return err @@ -220,7 +220,7 @@ func (b *MetricsBatch) convertSumV1(measurement string, tags map[string]string, continue } - metricName := fmt.Sprintf("%s_%s", measurement, k) + metricName := fmt.Sprintf("%s%s%s", measurement, b.nameSeparator, k) metric, attributes, err := b.lookupMetric(metricName, tags, common.InfluxMetricValueTypeSum) if err != nil { return err diff --git a/influx2otel/metrics_telegraf_prometheus_v1_test.go b/influx2otel/metrics_telegraf_prometheus_v1_test.go index d883076..cc7ccd5 100644 --- a/influx2otel/metrics_telegraf_prometheus_v1_test.go +++ b/influx2otel/metrics_telegraf_prometheus_v1_test.go @@ -14,7 +14,8 @@ import ( ) func TestAddPoint_v1_gauge(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -68,7 +69,8 @@ func TestAddPoint_v1_gauge(t *testing.T) { } func TestAddPoint_v1_untypedGauge(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -122,7 +124,8 @@ func TestAddPoint_v1_untypedGauge(t *testing.T) { } func TestAddPoint_v1_untyped(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -163,7 +166,8 @@ func TestAddPoint_v1_untyped(t *testing.T) { } func TestAddPoint_v1_sum(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -223,7 +227,8 @@ func TestAddPoint_v1_sum(t *testing.T) { } func TestAddPoint_v1_untypedSum(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -283,7 +288,8 @@ func TestAddPoint_v1_untypedSum(t *testing.T) { } func TestAddPoint_v1_histogram(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -332,7 +338,8 @@ func TestAddPoint_v1_histogram(t *testing.T) { } func TestAddPoint_v1_histogram_missingInfinityBucket(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -380,7 +387,8 @@ func TestAddPoint_v1_histogram_missingInfinityBucket(t *testing.T) { } func TestAddPoint_v1_untypedHistogram(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -428,7 +436,8 @@ func TestAddPoint_v1_untypedHistogram(t *testing.T) { } func TestAddPoint_v1_summary(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -488,7 +497,8 @@ func TestAddPoint_v1_summary(t *testing.T) { } func TestAddPoint_v1_untypedSummary(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -534,3 +544,175 @@ func TestAddPoint_v1_untypedSummary(t *testing.T) { assertMetricsEqual(t, expect, b.GetMetrics()) } + +func TestAddPoint_v1_gauge_separator(t *testing.T) { + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + config.NameSeparator = "." + // Use a dot to separate name and fields + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) + require.NoError(t, err) + + b := c.NewBatch() + err = b.AddPoint("cache_age_seconds", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + "engine_id": "0", + }, + map[string]interface{}{ + "gauge": float64(23.9), + }, + time.Unix(0, 1395066363000000123).UTC(), + common.InfluxMetricValueTypeGauge) + require.NoError(t, err) + + err = b.AddPoint("cache_age_seconds", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + "engine_id": "1", + }, + map[string]interface{}{ + "custom_gauge": float64(11.9), + }, + time.Unix(0, 1395066363000000123).UTC(), + common.InfluxMetricValueTypeGauge) + require.NoError(t, err) + + expect := pmetric.NewMetrics() + rm := expect.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("container.name", "42") + isMetrics := rm.ScopeMetrics().AppendEmpty() + isMetrics.Scope().SetName("My Library") + isMetrics.Scope().SetVersion("latest") + m := isMetrics.Metrics().AppendEmpty() + m.SetName("cache_age_seconds") + m.SetEmptyGauge() + dp := m.Gauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("engine_id", "0") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetDoubleValue(23.9) + m = isMetrics.Metrics().AppendEmpty() + m.SetName("cache_age_seconds.custom_gauge") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp = m.Gauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("engine_id", "1") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetDoubleValue(11.9) + + assertMetricsEqual(t, expect, b.GetMetrics()) +} + +func TestAddPoint_v1_sum_separator(t *testing.T) { + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + config.NameSeparator = "." + // Use a dot to separate name and fields + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) + require.NoError(t, err) + + b := c.NewBatch() + err = b.AddPoint("http_requests_total", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + "method": "post", + "code": "200", + }, + map[string]interface{}{ + "counter": float64(1027), + }, + time.Unix(0, 1395066363000000123).UTC(), + common.InfluxMetricValueTypeSum) + require.NoError(t, err) + + err = b.AddPoint("http_requests_total", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + "method": "post", + "code": "400", + }, + map[string]interface{}{ + "custom_counter": float64(3), + }, + time.Unix(0, 1395066363000000123).UTC(), + common.InfluxMetricValueTypeSum) + require.NoError(t, err) + + expect := pmetric.NewMetrics() + rm := expect.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("container.name", "42") + isMetrics := rm.ScopeMetrics().AppendEmpty() + isMetrics.Scope().SetName("My Library") + isMetrics.Scope().SetVersion("latest") + m := isMetrics.Metrics().AppendEmpty() + m.SetName("http_requests_total") + m.SetEmptySum() + m.Sum().SetIsMonotonic(true) + m.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + dp := m.Sum().DataPoints().AppendEmpty() + dp.Attributes().PutStr("code", "200") + dp.Attributes().PutStr("method", "post") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetDoubleValue(1027) + m = isMetrics.Metrics().AppendEmpty() + m.SetName("http_requests_total.custom_counter") // Uses a dot to separate name and fields + m.SetEmptySum() + m.Sum().SetIsMonotonic(true) + m.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative) + dp = m.Sum().DataPoints().AppendEmpty() + dp.Attributes().PutStr("code", "400") + dp.Attributes().PutStr("method", "post") + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetDoubleValue(3) + + assertMetricsEqual(t, expect, b.GetMetrics()) +} + +func TestAddPoint_v1_untyped_separator(t *testing.T) { + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + config.NameSeparator = "." + // Use a dot to separate name and fields + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) + require.NoError(t, err) + + b := c.NewBatch() + err = b.AddPoint("some_custom_metric", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + }, + map[string]any{ + "count": int64(1), + "something_else": float64(2.3), + }, + time.Unix(0, 1395066363000000123).UTC(), + common.InfluxMetricValueTypeUntyped) + require.NoError(t, err) + + expect := pmetric.NewMetrics() + rm := expect.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("container.name", "42") + isMetrics := rm.ScopeMetrics().AppendEmpty() + isMetrics.Scope().SetName("My Library") + isMetrics.Scope().SetVersion("latest") + m := isMetrics.Metrics().AppendEmpty() + m.SetName("some_custom_metric.count") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp := m.Gauge().DataPoints().AppendEmpty() + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetIntValue(1) + m = isMetrics.Metrics().AppendEmpty() + m.SetName("some_custom_metric.something_else") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp = m.Gauge().DataPoints().AppendEmpty() + dp.SetTimestamp(pcommon.NewTimestampFromTime(time.Unix(0, 1395066363000000123))) + dp.SetDoubleValue(2.3) + + assertMetricsEqual(t, expect, b.GetMetrics()) +} diff --git a/influx2otel/metrics_telegraf_prometheus_v2_test.go b/influx2otel/metrics_telegraf_prometheus_v2_test.go index 6768d26..28a4571 100644 --- a/influx2otel/metrics_telegraf_prometheus_v2_test.go +++ b/influx2otel/metrics_telegraf_prometheus_v2_test.go @@ -14,7 +14,8 @@ import ( ) func TestAddPoint_v2_gauge(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -68,7 +69,8 @@ func TestAddPoint_v2_gauge(t *testing.T) { } func TestAddPoint_v2_untypedGauge(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -122,7 +124,8 @@ func TestAddPoint_v2_untypedGauge(t *testing.T) { } func TestAddPoint_v2_sum(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -182,7 +185,8 @@ func TestAddPoint_v2_sum(t *testing.T) { } func TestAddPoint_v2_untypedSum(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -240,7 +244,8 @@ func TestAddPoint_v2_untypedSum(t *testing.T) { } func TestAddPoint_v2_histogram(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -380,7 +385,8 @@ func TestAddPoint_v2_histogram(t *testing.T) { } func TestAddPoint_v2_histogram_missingInfinityBucket(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -504,7 +510,8 @@ func TestAddPoint_v2_histogram_missingInfinityBucket(t *testing.T) { } func TestAddPoint_v2_untypedHistogram(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -628,7 +635,8 @@ func TestAddPoint_v2_untypedHistogram(t *testing.T) { } func TestAddPoint_v2_summary(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -764,7 +772,8 @@ func TestAddPoint_v2_summary(t *testing.T) { } func TestAddPoint_v2_untypedSummary(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() diff --git a/influx2otel/metrics_unknown_schema_test.go b/influx2otel/metrics_unknown_schema_test.go index 9f5456d..1f91d32 100644 --- a/influx2otel/metrics_unknown_schema_test.go +++ b/influx2otel/metrics_unknown_schema_test.go @@ -14,7 +14,8 @@ import ( ) func TestUnknownSchema(t *testing.T) { - c, err := influx2otel.NewLineProtocolToOtelMetrics(new(common.NoopLogger)) + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) require.NoError(t, err) b := c.NewBatch() @@ -68,3 +69,62 @@ func TestUnknownSchema(t *testing.T) { assertMetricsEqual(t, expect, b.GetMetrics()) } + +func TestUnknownSchema_CustomSeparator(t *testing.T) { + config := influx2otel.DefaultLineProtocolToOtelMetricsConfig() + config.NameSeparator = "." + // Use a dot to separate name and fields + c, err := influx2otel.NewLineProtocolToOtelMetrics(config) + require.NoError(t, err) + + b := c.NewBatch() + err = b.AddPoint("cpu", + map[string]string{ + "container.name": "42", + "otel.library.name": "My Library", + "otel.library.version": "latest", + "cpu": "cpu4", + "host": "777348dc6343", + }, + map[string]interface{}{ + "usage_user": 0.10090817356207936, + "usage_system": 0.3027245206862381, + "some_int_key": int64(7), + }, + time.Unix(0, 1395066363000000123), + common.InfluxMetricValueTypeUntyped) + require.NoError(t, err) + + expect := pmetric.NewMetrics() + rm := expect.ResourceMetrics().AppendEmpty() + rm.Resource().Attributes().PutStr("container.name", "42") + isMetrics := rm.ScopeMetrics().AppendEmpty() + isMetrics.Scope().SetName("My Library") + isMetrics.Scope().SetVersion("latest") + m := isMetrics.Metrics().AppendEmpty() + m.SetName("cpu.usage_user") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp := m.Gauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("cpu", "cpu4") + dp.Attributes().PutStr("host", "777348dc6343") + dp.SetTimestamp(pcommon.Timestamp(1395066363000000123)) + dp.SetDoubleValue(0.10090817356207936) + m = isMetrics.Metrics().AppendEmpty() + m.SetName("cpu.usage_system") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp = m.Gauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("cpu", "cpu4") + dp.Attributes().PutStr("host", "777348dc6343") + dp.SetTimestamp(pcommon.Timestamp(1395066363000000123)) + dp.SetDoubleValue(0.3027245206862381) + m = isMetrics.Metrics().AppendEmpty() + m.SetName("cpu.some_int_key") // Uses a dot to separate name and fields + m.SetEmptyGauge() + dp = m.Gauge().DataPoints().AppendEmpty() + dp.Attributes().PutStr("cpu", "cpu4") + dp.Attributes().PutStr("host", "777348dc6343") + dp.SetTimestamp(pcommon.Timestamp(1395066363000000123)) + dp.SetIntValue(7) + + assertMetricsEqual(t, expect, b.GetMetrics()) +}