From 2d63c17b6addbf4da967f5c01d2df15fdbb625ed Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Fri, 30 Aug 2024 08:42:02 -0700 Subject: [PATCH] [chore] refactor filter processor test to use generated test harness (#34940) The code in telemetry_test.go was mostly doing something the code generated by mdatagen was doing. Updated the tests to use that instead. Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- processor/filterprocessor/logs_test.go | 40 +++-- processor/filterprocessor/metrics_test.go | 159 +++++++++++++------- processor/filterprocessor/telemetry_test.go | 134 ----------------- processor/filterprocessor/traces_test.go | 47 ++++-- 4 files changed, 164 insertions(+), 216 deletions(-) delete mode 100644 processor/filterprocessor/telemetry_test.go diff --git a/processor/filterprocessor/logs_test.go b/processor/filterprocessor/logs_test.go index fe7405a6845c..23c118566f84 100644 --- a/processor/filterprocessor/logs_test.go +++ b/processor/filterprocessor/logs_test.go @@ -15,6 +15,8 @@ import ( "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl" @@ -764,19 +766,35 @@ func TestFilterLogProcessorWithOTTL(t *testing.T) { } func TestFilterLogProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterLogProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - processor, err := newFilterLogsProcessor(tel.NewProcessorCreateSettings(), &Config{ - Logs: LogFilters{LogConditions: []string{`IsMatch(body, "operationA")`}}, - }) - assert.NoError(t, err) + tel := setupTestTelemetry() + processor, err := newFilterLogsProcessor(tel.NewSettings(), &Config{ + Logs: LogFilters{LogConditions: []string{`IsMatch(body, "operationA")`}}, + }) + assert.NoError(t, err) - _, err = processor.processLogs(context.Background(), constructLogs()) - assert.NoError(t, err) + _, err = processor.processLogs(context.Background(), constructLogs()) + assert.NoError(t, err) + + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_logs.filtered", + Description: "Number of logs dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 2, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, + }, + }, + }, + } + + tel.assertMetrics(t, want) - tel.assertMetrics(t, expectedMetrics{ - logsFiltered: 2, - }) - }) } func constructLogs() plog.Logs { diff --git a/processor/filterprocessor/metrics_test.go b/processor/filterprocessor/metrics_test.go index 3cb8c077bb81..90fc45384ac0 100644 --- a/processor/filterprocessor/metrics_test.go +++ b/processor/filterprocessor/metrics_test.go @@ -16,6 +16,8 @@ import ( "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/goldendataset" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" @@ -366,74 +368,119 @@ func TestFilterMetricProcessor(t *testing.T) { } func TestFilterMetricProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterMetricProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - next := new(consumertest.MetricsSink) - cfg := &Config{ - Metrics: MetricFilters{ - MetricConditions: []string{ - "name==\"metric1\"", - }, + tel := setupTestTelemetry() + next := new(consumertest.MetricsSink) + cfg := &Config{ + Metrics: MetricFilters{ + MetricConditions: []string{ + "name==\"metric1\"", }, - } - factory := NewFactory() - fmp, err := factory.CreateMetricsProcessor( - context.Background(), - tel.NewProcessorCreateSettings(), - cfg, - next, - ) - assert.NotNil(t, fmp) - assert.NoError(t, err) - - caps := fmp.Capabilities() - assert.True(t, caps.MutatesData) - ctx := context.Background() - assert.NoError(t, fmp.Start(ctx, nil)) - - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"foo", "bar"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", + }, + } + factory := NewFactory() + fmp, err := factory.CreateMetricsProcessor( + context.Background(), + tel.NewSettings(), + cfg, + next, + ) + assert.NotNil(t, fmp) + assert.NoError(t, err) + + caps := fmp.Capabilities() + assert.True(t, caps.MutatesData) + ctx := context.Background() + assert.NoError(t, fmp.Start(ctx, nil)) + + err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ + { + metricNames: []string{"foo", "bar"}, + resourceAttributes: map[string]any{ + "attr1": "attr1/val1", + }, + }, + })) + assert.NoError(t, err) + + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_datapoints.filtered", + Description: "Number of metric data points dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 0, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, }, }, - })) - assert.NoError(t, err) + }, + } - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 0, - }) + tel.assertMetrics(t, want) + + err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ + { + metricNames: []string{"metric1", "metric2"}, + resourceAttributes: map[string]any{ + "attr1": "attr1/val1", + }, + }, + })) + assert.NoError(t, err) - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"metric1", "metric2"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", + want = []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_datapoints.filtered", + Description: "Number of metric data points dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 1, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, }, }, - })) - assert.NoError(t, err) + }, + } + tel.assertMetrics(t, want) - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 1, - }) + err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ + { + metricNames: []string{"metric1"}, + resourceAttributes: map[string]any{ + "attr1": "attr1/val1", + }, + }, + })) + assert.NoError(t, err) - err = fmp.ConsumeMetrics(context.Background(), testResourceMetrics([]metricWithResource{ - { - metricNames: []string{"metric1"}, - resourceAttributes: map[string]any{ - "attr1": "attr1/val1", + want = []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_datapoints.filtered", + Description: "Number of metric data points dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 2, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, }, }, - })) - assert.NoError(t, err) - - tel.assertMetrics(t, expectedMetrics{ - metricDataPointsFiltered: 2, - }) + }, + } + tel.assertMetrics(t, want) - assert.NoError(t, fmp.Shutdown(ctx)) - }) + assert.NoError(t, fmp.Shutdown(ctx)) } func testResourceMetrics(mwrs []metricWithResource) pmetric.Metrics { diff --git a/processor/filterprocessor/telemetry_test.go b/processor/filterprocessor/telemetry_test.go deleted file mode 100644 index 36ea0e4d805a..000000000000 --- a/processor/filterprocessor/telemetry_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package filterprocessor - -import ( - "context" - "testing" - - "github.com/stretchr/testify/require" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/processor" - "go.opentelemetry.io/collector/processor/processortest" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/sdk/metric/metricdata" - "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" - - "github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor/internal/metadata" -) - -type testTelemetry struct { - reader *metric.ManualReader - meterProvider *metric.MeterProvider -} - -type expectedMetrics struct { - // processor_filter_metrics_filtered - metricDataPointsFiltered int64 - // processor_filter_logs_filtered - logsFiltered int64 - // processor_filter_spans_filtered - spansFiltered int64 -} - -func telemetryTest(t *testing.T, name string, testFunc func(t *testing.T, tel testTelemetry)) { - t.Run(name, func(t *testing.T) { - testFunc(t, setupTelemetry()) - }) -} - -func setupTelemetry() testTelemetry { - reader := metric.NewManualReader() - return testTelemetry{ - reader: reader, - meterProvider: metric.NewMeterProvider(metric.WithReader(reader)), - } -} - -func (tt *testTelemetry) NewProcessorCreateSettings() processor.Settings { - settings := processortest.NewNopSettings() - settings.MeterProvider = tt.meterProvider - settings.ID = component.NewID(metadata.Type) - - return settings -} - -func (tt *testTelemetry) assertMetrics(t *testing.T, expected expectedMetrics) { - var md metricdata.ResourceMetrics - require.NoError(t, tt.reader.Collect(context.Background(), &md)) - - if expected.metricDataPointsFiltered > 0 { - name := "otelcol_processor_filter_datapoints.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of metric data points dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.metricDataPointsFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.logsFiltered > 0 { - name := "otelcol_processor_filter_logs.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of logs dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.logsFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } - if expected.spansFiltered > 0 { - name := "otelcol_processor_filter_spans.filtered" - got := tt.getMetric(name, md) - want := metricdata.Metrics{ - Name: name, - Description: "Number of spans dropped by the filter processor", - Unit: "1", - Data: metricdata.Sum[int64]{ - Temporality: metricdata.CumulativeTemporality, - IsMonotonic: true, - DataPoints: []metricdata.DataPoint[int64]{ - { - Value: expected.spansFiltered, - Attributes: attribute.NewSet(attribute.String("filter", "filter")), - }, - }, - }, - } - metricdatatest.AssertEqual(t, want, got, metricdatatest.IgnoreTimestamp()) - } -} - -func (tt *testTelemetry) getMetric(name string, got metricdata.ResourceMetrics) metricdata.Metrics { - for _, sm := range got.ScopeMetrics { - for _, m := range sm.Metrics { - if m.Name == name { - return m - } - } - } - - return metricdata.Metrics{} -} diff --git a/processor/filterprocessor/traces_test.go b/processor/filterprocessor/traces_test.go index b37dbfafc67b..37802c92f250 100644 --- a/processor/filterprocessor/traces_test.go +++ b/processor/filterprocessor/traces_test.go @@ -15,6 +15,8 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor/processorhelper" "go.opentelemetry.io/collector/processor/processortest" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/metricdata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterconfig" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter/filterset" @@ -281,23 +283,38 @@ func TestFilterTraceProcessorWithOTTL(t *testing.T) { } func TestFilterTraceProcessorTelemetry(t *testing.T) { - telemetryTest(t, "FilterTraceProcessorTelemetry", func(t *testing.T, tel testTelemetry) { - processor, err := newFilterSpansProcessor(tel.NewProcessorCreateSettings(), &Config{ - Traces: TraceFilters{ - SpanConditions: []string{ - `name == "operationA"`, - }, - }, ErrorMode: ottl.IgnoreError, - }) - assert.NoError(t, err) + tel := setupTestTelemetry() + processor, err := newFilterSpansProcessor(tel.NewSettings(), &Config{ + Traces: TraceFilters{ + SpanConditions: []string{ + `name == "operationA"`, + }, + }, ErrorMode: ottl.IgnoreError, + }) + assert.NoError(t, err) - _, err = processor.processTraces(context.Background(), constructTraces()) - assert.NoError(t, err) + _, err = processor.processTraces(context.Background(), constructTraces()) + assert.NoError(t, err) - tel.assertMetrics(t, expectedMetrics{ - spansFiltered: 2, - }) - }) + want := []metricdata.Metrics{ + { + Name: "otelcol_processor_filter_spans.filtered", + Description: "Number of spans dropped by the filter processor", + Unit: "1", + Data: metricdata.Sum[int64]{ + Temporality: metricdata.CumulativeTemporality, + IsMonotonic: true, + DataPoints: []metricdata.DataPoint[int64]{ + { + Value: 2, + Attributes: attribute.NewSet(attribute.String("filter", "filter")), + }, + }, + }, + }, + } + + tel.assertMetrics(t, want) } func constructTraces() ptrace.Traces {