diff --git a/processor/go.mod b/processor/go.mod index e03d3a706f2..61d1b2d9f9d 100644 --- a/processor/go.mod +++ b/processor/go.mod @@ -15,7 +15,6 @@ require ( go.opentelemetry.io/otel/metric v1.26.0 go.opentelemetry.io/otel/trace v1.26.0 go.uber.org/goleak v1.3.0 - go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 ) @@ -44,6 +43,7 @@ require ( go.opentelemetry.io/otel/exporters/prometheus v0.48.0 // indirect go.opentelemetry.io/otel/sdk v1.26.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.26.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/processor/processorhelper/package_test.go b/processor/processorhelper/generated_package_test.go similarity index 62% rename from processor/processorhelper/package_test.go rename to processor/processorhelper/generated_package_test.go index e9823cee56e..2f76dc96200 100644 --- a/processor/processorhelper/package_test.go +++ b/processor/processorhelper/generated_package_test.go @@ -1,5 +1,4 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 +// Code generated by mdatagen. DO NOT EDIT. package processorhelper diff --git a/processor/processorhelper/internal/metadata/generated_telemetry.go b/processor/processorhelper/internal/metadata/generated_telemetry.go new file mode 100644 index 00000000000..cf496bb3504 --- /dev/null +++ b/processor/processorhelper/internal/metadata/generated_telemetry.go @@ -0,0 +1,100 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "errors" + + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" +) + +func Meter(settings component.TelemetrySettings) metric.Meter { + return settings.MeterProvider.Meter("go.opentelemetry.io/collector/processor/processorhelper") +} + +func Tracer(settings component.TelemetrySettings) trace.Tracer { + return settings.TracerProvider.Tracer("go.opentelemetry.io/collector/processor/processorhelper") +} + +// TelemetryBuilder provides an interface for components to report telemetry +// as defined in metadata and user config. +type TelemetryBuilder struct { + ProcessorAcceptedLogRecords metric.Int64Counter + ProcessorAcceptedMetricPoints metric.Int64Counter + ProcessorAcceptedSpans metric.Int64Counter + ProcessorDroppedLogRecords metric.Int64Counter + ProcessorDroppedMetricPoints metric.Int64Counter + ProcessorDroppedSpans metric.Int64Counter + ProcessorRefusedLogRecords metric.Int64Counter + ProcessorRefusedMetricPoints metric.Int64Counter + ProcessorRefusedSpans metric.Int64Counter +} + +// telemetryBuilderOption applies changes to default builder. +type telemetryBuilderOption func(*TelemetryBuilder) + +// NewTelemetryBuilder provides a struct with methods to update all internal telemetry +// for a component +func NewTelemetryBuilder(settings component.TelemetrySettings, options ...telemetryBuilderOption) (*TelemetryBuilder, error) { + builder := TelemetryBuilder{} + var err, errs error + meter := Meter(settings) + builder.ProcessorAcceptedLogRecords, err = meter.Int64Counter( + "processor_accepted_log_records", + metric.WithDescription("Number of log records successfully pushed into the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorAcceptedMetricPoints, err = meter.Int64Counter( + "processor_accepted_metric_points", + metric.WithDescription("Number of metric points successfully pushed into the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorAcceptedSpans, err = meter.Int64Counter( + "processor_accepted_spans", + metric.WithDescription("Number of spans successfully pushed into the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorDroppedLogRecords, err = meter.Int64Counter( + "processor_dropped_log_records", + metric.WithDescription("Number of log records that were dropped."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorDroppedMetricPoints, err = meter.Int64Counter( + "processor_dropped_metric_points", + metric.WithDescription("Number of metric points that were dropped."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorDroppedSpans, err = meter.Int64Counter( + "processor_dropped_spans", + metric.WithDescription("Number of spans that were dropped."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorRefusedLogRecords, err = meter.Int64Counter( + "processor_refused_log_records", + metric.WithDescription("Number of log records that were rejected by the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorRefusedMetricPoints, err = meter.Int64Counter( + "processor_refused_metric_points", + metric.WithDescription("Number of metric points that were rejected by the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + builder.ProcessorRefusedSpans, err = meter.Int64Counter( + "processor_refused_spans", + metric.WithDescription("Number of spans that were rejected by the next component in the pipeline."), + metric.WithUnit("1"), + ) + errs = errors.Join(errs, err) + return &builder, errs +} diff --git a/processor/processorhelper/internal/metadata/generated_telemetry_test.go b/processor/processorhelper/internal/metadata/generated_telemetry_test.go new file mode 100644 index 00000000000..8f0846b7663 --- /dev/null +++ b/processor/processorhelper/internal/metadata/generated_telemetry_test.go @@ -0,0 +1,63 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.opentelemetry.io/otel/metric" + embeddedmetric "go.opentelemetry.io/otel/metric/embedded" + noopmetric "go.opentelemetry.io/otel/metric/noop" + "go.opentelemetry.io/otel/trace" + embeddedtrace "go.opentelemetry.io/otel/trace/embedded" + nooptrace "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/collector/component" +) + +type mockMeter struct { + noopmetric.Meter + name string +} +type mockMeterProvider struct { + embeddedmetric.MeterProvider +} + +func (m mockMeterProvider) Meter(name string, opts ...metric.MeterOption) metric.Meter { + return mockMeter{name: name} +} + +type mockTracer struct { + nooptrace.Tracer + name string +} + +type mockTracerProvider struct { + embeddedtrace.TracerProvider +} + +func (m mockTracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + return mockTracer{name: name} +} + +func TestProviders(t *testing.T) { + set := component.TelemetrySettings{ + MeterProvider: mockMeterProvider{}, + TracerProvider: mockTracerProvider{}, + } + + meter := Meter(set) + if m, ok := meter.(mockMeter); ok { + require.Equal(t, "go.opentelemetry.io/collector/processor/processorhelper", m.name) + } else { + require.Fail(t, "returned Meter not mockMeter") + } + + tracer := Tracer(set) + if m, ok := tracer.(mockTracer); ok { + require.Equal(t, "go.opentelemetry.io/collector/processor/processorhelper", m.name) + } else { + require.Fail(t, "returned Meter not mockTracer") + } +} diff --git a/processor/processorhelper/metadata.yaml b/processor/processorhelper/metadata.yaml new file mode 100644 index 00000000000..75d66636d15 --- /dev/null +++ b/processor/processorhelper/metadata.yaml @@ -0,0 +1,81 @@ +type: processorhelper + +status: + class: pkg + stability: + beta: [traces, metrics, logs] + distributions: [core, contrib] + +telemetry: + metrics: + processor_accepted_spans: + enabled: true + description: Number of spans successfully pushed into the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_refused_spans: + enabled: true + description: Number of spans that were rejected by the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_dropped_spans: + enabled: true + description: Number of spans that were dropped. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_accepted_metric_points: + enabled: true + description: Number of metric points successfully pushed into the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_refused_metric_points: + enabled: true + description: Number of metric points that were rejected by the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_dropped_metric_points: + enabled: true + description: Number of metric points that were dropped. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_accepted_log_records: + enabled: true + description: Number of log records successfully pushed into the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_refused_log_records: + enabled: true + description: Number of log records that were rejected by the next component in the pipeline. + unit: 1 + sum: + value_type: int + monotonic: true + + processor_dropped_log_records: + enabled: true + description: Number of log records that were dropped. + unit: 1 + sum: + value_type: int + monotonic: true \ No newline at end of file diff --git a/processor/processorhelper/obsreport.go b/processor/processorhelper/obsreport.go index 17b20704f0d..2e074713f87 100644 --- a/processor/processorhelper/obsreport.go +++ b/processor/processorhelper/obsreport.go @@ -9,17 +9,13 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/metric" - "go.uber.org/multierr" "go.uber.org/zap" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/internal/obsreportconfig/obsmetrics" "go.opentelemetry.io/collector/processor" -) - -var ( - processorScope = obsmetrics.Scope + obsmetrics.SpanNameSep + obsmetrics.ProcessorKey + "go.opentelemetry.io/collector/processor/processorhelper/internal/metadata" ) // BuildCustomMetricName is used to be build a metric name following @@ -42,17 +38,8 @@ type ObsReport struct { logger *zap.Logger - otelAttrs []attribute.KeyValue - - acceptedSpansCounter metric.Int64Counter - refusedSpansCounter metric.Int64Counter - droppedSpansCounter metric.Int64Counter - acceptedMetricPointsCounter metric.Int64Counter - refusedMetricPointsCounter metric.Int64Counter - droppedMetricPointsCounter metric.Int64Counter - acceptedLogRecordsCounter metric.Int64Counter - refusedLogRecordsCounter metric.Int64Counter - droppedLogRecordsCounter metric.Int64Counter + otelAttrs []attribute.KeyValue + telemetryBuilder *metadata.TelemetryBuilder } // ObsReportSettings are settings for creating an ObsReport. @@ -67,106 +54,35 @@ func NewObsReport(cfg ObsReportSettings) (*ObsReport, error) { } func newObsReport(cfg ObsReportSettings) (*ObsReport, error) { - report := &ObsReport{ + telemetryBuilder, err := metadata.NewTelemetryBuilder(cfg.ProcessorCreateSettings.TelemetrySettings) + if err != nil { + return nil, err + } + return &ObsReport{ level: cfg.ProcessorCreateSettings.MetricsLevel, logger: cfg.ProcessorCreateSettings.Logger, otelAttrs: []attribute.KeyValue{ attribute.String(obsmetrics.ProcessorKey, cfg.ProcessorID.String()), }, - } - - if err := report.createOtelMetrics(cfg); err != nil { - return nil, err - } - - return report, nil -} - -func (or *ObsReport) createOtelMetrics(cfg ObsReportSettings) error { - meter := cfg.ProcessorCreateSettings.MeterProvider.Meter(processorScope) - var errors, err error - - or.acceptedSpansCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.AcceptedSpansKey, - metric.WithDescription("Number of spans successfully pushed into the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.refusedSpansCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.RefusedSpansKey, - metric.WithDescription("Number of spans that were rejected by the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.droppedSpansCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.DroppedSpansKey, - metric.WithDescription("Number of spans that were dropped."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.acceptedMetricPointsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.AcceptedMetricPointsKey, - metric.WithDescription("Number of metric points successfully pushed into the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.refusedMetricPointsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.RefusedMetricPointsKey, - metric.WithDescription("Number of metric points that were rejected by the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.droppedMetricPointsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.DroppedMetricPointsKey, - metric.WithDescription("Number of metric points that were dropped."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.acceptedLogRecordsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.AcceptedLogRecordsKey, - metric.WithDescription("Number of log records successfully pushed into the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.refusedLogRecordsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.RefusedLogRecordsKey, - metric.WithDescription("Number of log records that were rejected by the next component in the pipeline."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - or.droppedLogRecordsCounter, err = meter.Int64Counter( - obsmetrics.ProcessorMetricPrefix+obsmetrics.DroppedLogRecordsKey, - metric.WithDescription("Number of log records that were dropped."), - metric.WithUnit("1"), - ) - errors = multierr.Append(errors, err) - - return errors + telemetryBuilder: telemetryBuilder, + }, nil } func (or *ObsReport) recordData(ctx context.Context, dataType component.DataType, accepted, refused, dropped int64) { var acceptedCount, refusedCount, droppedCount metric.Int64Counter switch dataType { case component.DataTypeTraces: - acceptedCount = or.acceptedSpansCounter - refusedCount = or.refusedSpansCounter - droppedCount = or.droppedSpansCounter + acceptedCount = or.telemetryBuilder.ProcessorAcceptedSpans + refusedCount = or.telemetryBuilder.ProcessorRefusedSpans + droppedCount = or.telemetryBuilder.ProcessorDroppedSpans case component.DataTypeMetrics: - acceptedCount = or.acceptedMetricPointsCounter - refusedCount = or.refusedMetricPointsCounter - droppedCount = or.droppedMetricPointsCounter + acceptedCount = or.telemetryBuilder.ProcessorAcceptedMetricPoints + refusedCount = or.telemetryBuilder.ProcessorRefusedMetricPoints + droppedCount = or.telemetryBuilder.ProcessorDroppedMetricPoints case component.DataTypeLogs: - acceptedCount = or.acceptedLogRecordsCounter - refusedCount = or.refusedLogRecordsCounter - droppedCount = or.droppedLogRecordsCounter + acceptedCount = or.telemetryBuilder.ProcessorAcceptedLogRecords + refusedCount = or.telemetryBuilder.ProcessorRefusedLogRecords + droppedCount = or.telemetryBuilder.ProcessorDroppedLogRecords } acceptedCount.Add(ctx, accepted, metric.WithAttributes(or.otelAttrs...)) diff --git a/processor/processorhelper/processor.go b/processor/processorhelper/processor.go index 3aeb70a4126..8bdaa4fbf73 100644 --- a/processor/processorhelper/processor.go +++ b/processor/processorhelper/processor.go @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +//go:generate mdatagen metadata.yaml + package processorhelper // import "go.opentelemetry.io/collector/processor/processorhelper" import (