From 9ea40072040b533afdd4fbf2372c0dbdd3af438a Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 May 2024 12:31:40 -0700 Subject: [PATCH 1/4] mdatagen: support setting telemetry level in telemetry builder This allows components to set the minimum level needed for them to produce telemetry. By default, this is set to configtelemetryLevelBasic. If the telemetry level is below that minimum level, then the noop meter is used for metrics. Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- cmd/mdatagen/loader.go | 2 ++ cmd/mdatagen/main_test.go | 10 +++++-- cmd/mdatagen/templates/telemetry.go.tmpl | 27 ++++++++++++++++--- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- processor/batchprocessor/metadata.yaml | 1 + processor/batchprocessor/metrics.go | 2 +- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- .../internal/metadata/generated_telemetry.go | 23 +++++++++++++--- 11 files changed, 155 insertions(+), 25 deletions(-) diff --git a/cmd/mdatagen/internal/samplereceiver/internal/metadata/generated_telemetry.go b/cmd/mdatagen/internal/samplereceiver/internal/metadata/generated_telemetry.go index 86a50251b2d..8f28f56ed21 100644 --- a/cmd/mdatagen/internal/samplereceiver/internal/metadata/generated_telemetry.go +++ b/cmd/mdatagen/internal/samplereceiver/internal/metadata/generated_telemetry.go @@ -7,9 +7,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -27,11 +29,19 @@ type TelemetryBuilder struct { ProcessRuntimeTotalAllocBytes metric.Int64ObservableCounter observeProcessRuntimeTotalAllocBytes func() int64 RequestDuration metric.Float64Histogram + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // WithProcessRuntimeTotalAllocBytesCallback sets callback for observable ProcessRuntimeTotalAllocBytes metric. func WithProcessRuntimeTotalAllocBytesCallback(cb func() int64) telemetryBuilderOption { return func(builder *TelemetryBuilder) { @@ -42,12 +52,19 @@ func WithProcessRuntimeTotalAllocBytesCallback(cb func() int64) 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelBasic { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.BatchSizeTriggerSend, err = meter.Int64Counter( "batch_size_trigger_send", metric.WithDescription("Number of times the batch was sent due to a size trigger"), diff --git a/cmd/mdatagen/loader.go b/cmd/mdatagen/loader.go index 4ed517c6613..a2f1de68419 100644 --- a/cmd/mdatagen/loader.go +++ b/cmd/mdatagen/loader.go @@ -11,6 +11,7 @@ import ( "path/filepath" "strings" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/confmap" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/confmap/provider/fileprovider" @@ -227,6 +228,7 @@ type tests struct { } type telemetry struct { + Level configtelemetry.Level `mapstructure:"level"` Metrics map[metricName]metric `mapstructure:"metrics"` } diff --git a/cmd/mdatagen/main_test.go b/cmd/mdatagen/main_test.go index c2ece4eb099..7136b9b8f80 100644 --- a/cmd/mdatagen/main_test.go +++ b/cmd/mdatagen/main_test.go @@ -538,9 +538,12 @@ func TestGenerateTelemetryMetadata(t *testing.T) { package metadata import ( - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -569,9 +572,12 @@ func Tracer(settings component.TelemetrySettings) trace.Tracer { package metadata import ( - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { diff --git a/cmd/mdatagen/templates/telemetry.go.tmpl b/cmd/mdatagen/templates/telemetry.go.tmpl index 5643b66967f..59342c995bf 100644 --- a/cmd/mdatagen/templates/telemetry.go.tmpl +++ b/cmd/mdatagen/templates/telemetry.go.tmpl @@ -8,9 +8,12 @@ import ( "errors" {{- end }} - "go.opentelemetry.io/collector/component" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -31,11 +34,19 @@ type TelemetryBuilder struct { observe{{ $name.Render }} func() {{ $metric.Data.BasicType }} {{- end }} {{- end }} + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + {{- range $name, $metric := .Telemetry.Metrics }} {{ if $metric.Data.Async -}} // With{{ $name.Render }}Callback sets callback for observable {{ $name.Render }} metric. @@ -50,12 +61,20 @@ func With{{ $name.Render }}Callback(cb func() {{ $metric.Data.BasicType }}) tele // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.Level{{ casesTitle .Telemetry.Level.String }} { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } + {{- range $name, $metric := .Telemetry.Metrics }} builder.{{ $name.Render }}, err = meter.{{ $metric.Data.Instrument }}( "{{ $name }}", diff --git a/exporter/exporterhelper/internal/metadata/generated_telemetry.go b/exporter/exporterhelper/internal/metadata/generated_telemetry.go index d2d0339d776..481cc2b27ec 100644 --- a/exporter/exporterhelper/internal/metadata/generated_telemetry.go +++ b/exporter/exporterhelper/internal/metadata/generated_telemetry.go @@ -6,9 +6,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -31,20 +33,35 @@ type TelemetryBuilder struct { ExporterSentLogRecords metric.Int64Counter ExporterSentMetricPoints metric.Int64Counter ExporterSentSpans metric.Int64Counter + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelBasic { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.ExporterEnqueueFailedLogRecords, err = meter.Int64Counter( "exporter_enqueue_failed_log_records", metric.WithDescription("Number of log records failed to be added to the sending queue."), diff --git a/processor/batchprocessor/internal/metadata/generated_telemetry.go b/processor/batchprocessor/internal/metadata/generated_telemetry.go index b0394550566..6fbb2b83b94 100644 --- a/processor/batchprocessor/internal/metadata/generated_telemetry.go +++ b/processor/batchprocessor/internal/metadata/generated_telemetry.go @@ -6,9 +6,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -26,20 +28,35 @@ type TelemetryBuilder struct { ProcessorBatchBatchSendSizeBytes metric.Int64Histogram ProcessorBatchBatchSizeTriggerSend metric.Int64Counter ProcessorBatchTimeoutTriggerSend metric.Int64Counter + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelNormal { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.ProcessorBatchBatchSendSize, err = meter.Int64Histogram( "processor_batch_batch_send_size", metric.WithDescription("Number of units in the batch"), diff --git a/processor/batchprocessor/metadata.yaml b/processor/batchprocessor/metadata.yaml index 986ada2ae27..c90e03120e0 100644 --- a/processor/batchprocessor/metadata.yaml +++ b/processor/batchprocessor/metadata.yaml @@ -9,6 +9,7 @@ status: tests: telemetry: + level: normal metrics: processor_batch_batch_size_trigger_send: enabled: true diff --git a/processor/batchprocessor/metrics.go b/processor/batchprocessor/metrics.go index 08d3d9749f3..90635e88149 100644 --- a/processor/batchprocessor/metrics.go +++ b/processor/batchprocessor/metrics.go @@ -66,7 +66,7 @@ func (bpt *batchProcessorTelemetry) createOtelMetrics(set component.TelemetrySet meter = noopmetric.Meter{} } - bpt.telemetryBuilder, err = metadata.NewTelemetryBuilder(set) + bpt.telemetryBuilder, err = metadata.NewTelemetryBuilder(set, metadata.WithLevel(bpt.level)) errors = multierr.Append(errors, err) bpt.batchMetadataCardinality, err = meter.Int64ObservableUpDownCounter( diff --git a/processor/processorhelper/internal/metadata/generated_telemetry.go b/processor/processorhelper/internal/metadata/generated_telemetry.go index e32610d463d..568b689edd5 100644 --- a/processor/processorhelper/internal/metadata/generated_telemetry.go +++ b/processor/processorhelper/internal/metadata/generated_telemetry.go @@ -6,9 +6,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -31,20 +33,35 @@ type TelemetryBuilder struct { ProcessorRefusedLogRecords metric.Int64Counter ProcessorRefusedMetricPoints metric.Int64Counter ProcessorRefusedSpans metric.Int64Counter + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelBasic { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.ProcessorAcceptedLogRecords, err = meter.Int64Counter( "processor_accepted_log_records", metric.WithDescription("Number of log records successfully pushed into the next component in the pipeline."), diff --git a/receiver/receiverhelper/internal/metadata/generated_telemetry.go b/receiver/receiverhelper/internal/metadata/generated_telemetry.go index 96b5b5b5fe6..ee70b2e498f 100644 --- a/receiver/receiverhelper/internal/metadata/generated_telemetry.go +++ b/receiver/receiverhelper/internal/metadata/generated_telemetry.go @@ -6,9 +6,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -28,20 +30,35 @@ type TelemetryBuilder struct { ReceiverRefusedLogRecords metric.Int64Counter ReceiverRefusedMetricPoints metric.Int64Counter ReceiverRefusedSpans metric.Int64Counter + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelBasic { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.ReceiverAcceptedLogRecords, err = meter.Int64Counter( "receiver_accepted_log_records", metric.WithDescription("Number of log records successfully pushed into the pipeline."), diff --git a/receiver/scraperhelper/internal/metadata/generated_telemetry.go b/receiver/scraperhelper/internal/metadata/generated_telemetry.go index 4aa060e9c33..e8835809d4b 100644 --- a/receiver/scraperhelper/internal/metadata/generated_telemetry.go +++ b/receiver/scraperhelper/internal/metadata/generated_telemetry.go @@ -6,9 +6,11 @@ import ( "errors" "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/metric/noop" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configtelemetry" ) func Meter(settings component.TelemetrySettings) metric.Meter { @@ -24,20 +26,35 @@ func Tracer(settings component.TelemetrySettings) trace.Tracer { type TelemetryBuilder struct { ScraperErroredMetricPoints metric.Int64Counter ScraperScrapedMetricPoints metric.Int64Counter + level configtelemetry.Level } // telemetryBuilderOption applies changes to default builder. type telemetryBuilderOption func(*TelemetryBuilder) +// WithLevel sets the current telemetry level for the component. +func WithLevel(lvl configtelemetry.Level) telemetryBuilderOption { + return func(builder *TelemetryBuilder) { + builder.level = lvl + } +} + // 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{} + builder := TelemetryBuilder{level: configtelemetry.LevelBasic} for _, op := range options { op(&builder) } - var err, errs error - meter := Meter(settings) + var ( + err, errs error + meter metric.Meter + ) + if builder.level >= configtelemetry.LevelBasic { + meter = Meter(settings) + } else { + meter = noop.Meter{} + } builder.ScraperErroredMetricPoints, err = meter.Int64Counter( "scraper_errored_metric_points", metric.WithDescription("Number of metric points that were unable to be scraped."), From 18fd2de13df4db6ea233bb94b6e432c9ecc5517d Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 May 2024 12:37:23 -0700 Subject: [PATCH 2/4] changelog + schema update Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- .../codeboten_mdatagen-telemetrylevel.yaml | 25 +++++++++++++++++++ .../codeboten_mdatagen-telemetrylevel2.yaml | 25 +++++++++++++++++++ cmd/mdatagen/metadata-schema.yaml | 2 ++ 3 files changed, 52 insertions(+) create mode 100644 .chloggen/codeboten_mdatagen-telemetrylevel.yaml create mode 100644 .chloggen/codeboten_mdatagen-telemetrylevel2.yaml diff --git a/.chloggen/codeboten_mdatagen-telemetrylevel.yaml b/.chloggen/codeboten_mdatagen-telemetrylevel.yaml new file mode 100644 index 00000000000..239fed8b0b4 --- /dev/null +++ b/.chloggen/codeboten_mdatagen-telemetrylevel.yaml @@ -0,0 +1,25 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: mdatagen + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: support using telemetry level in telemetry builder + +# One or more tracking issues or pull requests related to the change +issues: [10234] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: This allows components to set the minimum level needed for them to produce telemetry. By default, this is set to configtelemetry.LevelBasic. If the telemetry level is below that minimum level, then the noop meter is used for metrics. + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/.chloggen/codeboten_mdatagen-telemetrylevel2.yaml b/.chloggen/codeboten_mdatagen-telemetrylevel2.yaml new file mode 100644 index 00000000000..34a55fb964b --- /dev/null +++ b/.chloggen/codeboten_mdatagen-telemetrylevel2.yaml @@ -0,0 +1,25 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: bug_fix + +# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver) +component: batchprocessor + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: respect telemetry level for all metrics + +# One or more tracking issues or pull requests related to the change +issues: [10234] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/cmd/mdatagen/metadata-schema.yaml b/cmd/mdatagen/metadata-schema.yaml index a4c3af67b05..89198ff6b69 100644 --- a/cmd/mdatagen/metadata-schema.yaml +++ b/cmd/mdatagen/metadata-schema.yaml @@ -130,6 +130,8 @@ tests: # Optional: map of metric names with the key being the metric name and value # being described below. telemetry: + # Optional: level allows components to specify the minimum telemetry level for metrics to be produced. defaults to basic if not set. + level: string metrics: : # Required: whether the metric is collected by default. From 34c10ff8013c5c3bc086d2e7a3f80127ab324469 Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 May 2024 12:40:42 -0700 Subject: [PATCH 3/4] tidy Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- cmd/mdatagen/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/mdatagen/go.mod b/cmd/mdatagen/go.mod index 4348233d0bc..d160c2790a1 100644 --- a/cmd/mdatagen/go.mod +++ b/cmd/mdatagen/go.mod @@ -6,6 +6,7 @@ require ( github.com/google/go-cmp v0.6.0 github.com/stretchr/testify v1.9.0 go.opentelemetry.io/collector/component v0.101.0 + go.opentelemetry.io/collector/config/configtelemetry v0.101.0 go.opentelemetry.io/collector/confmap v0.101.0 go.opentelemetry.io/collector/confmap/provider/fileprovider v0.101.0 go.opentelemetry.io/collector/consumer v0.101.0 @@ -43,7 +44,6 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.53.0 // indirect github.com/prometheus/procfs v0.15.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.101.0 // indirect go.opentelemetry.io/otel v1.27.0 // indirect go.opentelemetry.io/otel/exporters/prometheus v0.49.0 // indirect go.opentelemetry.io/otel/sdk v1.27.0 // indirect From 32ed17c3fdd6b6f33eee662d849afe3c41989224 Mon Sep 17 00:00:00 2001 From: Alex Boten <223565+codeboten@users.noreply.github.com> Date: Mon, 27 May 2024 12:41:57 -0700 Subject: [PATCH 4/4] [processorhelper] use mdatagen level and noop meter This cleans up the need to have a level in the ObsReport struct. Added test to validate the change as none existed before Signed-off-by: Alex Boten <223565+codeboten@users.noreply.github.com> --- processor/processorhelper/obsreport.go | 42 ++++---------- processor/processorhelper/obsreport_test.go | 62 +++++++++++++++++++++ 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/processor/processorhelper/obsreport.go b/processor/processorhelper/obsreport.go index 2e074713f87..51aa26a9a88 100644 --- a/processor/processorhelper/obsreport.go +++ b/processor/processorhelper/obsreport.go @@ -12,7 +12,6 @@ import ( "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" "go.opentelemetry.io/collector/processor/processorhelper/internal/metadata" @@ -34,8 +33,6 @@ func BuildCustomMetricName(configType, metric string) string { // ObsReport is a helper to add observability to a processor. type ObsReport struct { - level configtelemetry.Level - logger *zap.Logger otelAttrs []attribute.KeyValue @@ -54,12 +51,11 @@ func NewObsReport(cfg ObsReportSettings) (*ObsReport, error) { } func newObsReport(cfg ObsReportSettings) (*ObsReport, error) { - telemetryBuilder, err := metadata.NewTelemetryBuilder(cfg.ProcessorCreateSettings.TelemetrySettings) + telemetryBuilder, err := metadata.NewTelemetryBuilder(cfg.ProcessorCreateSettings.TelemetrySettings, metadata.WithLevel(cfg.ProcessorCreateSettings.MetricsLevel)) 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()), @@ -92,63 +88,45 @@ func (or *ObsReport) recordData(ctx context.Context, dataType component.DataType // TracesAccepted reports that the trace data was accepted. func (or *ObsReport) TracesAccepted(ctx context.Context, numSpans int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeTraces, int64(numSpans), int64(0), int64(0)) - } + or.recordData(ctx, component.DataTypeTraces, int64(numSpans), int64(0), int64(0)) } // TracesRefused reports that the trace data was refused. func (or *ObsReport) TracesRefused(ctx context.Context, numSpans int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeTraces, int64(0), int64(numSpans), int64(0)) - } + or.recordData(ctx, component.DataTypeTraces, int64(0), int64(numSpans), int64(0)) } // TracesDropped reports that the trace data was dropped. func (or *ObsReport) TracesDropped(ctx context.Context, numSpans int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeTraces, int64(0), int64(0), int64(numSpans)) - } + or.recordData(ctx, component.DataTypeTraces, int64(0), int64(0), int64(numSpans)) } // MetricsAccepted reports that the metrics were accepted. func (or *ObsReport) MetricsAccepted(ctx context.Context, numPoints int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeMetrics, int64(numPoints), int64(0), int64(0)) - } + or.recordData(ctx, component.DataTypeMetrics, int64(numPoints), int64(0), int64(0)) } // MetricsRefused reports that the metrics were refused. func (or *ObsReport) MetricsRefused(ctx context.Context, numPoints int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(numPoints), int64(0)) - } + or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(numPoints), int64(0)) } // MetricsDropped reports that the metrics were dropped. func (or *ObsReport) MetricsDropped(ctx context.Context, numPoints int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(0), int64(numPoints)) - } + or.recordData(ctx, component.DataTypeMetrics, int64(0), int64(0), int64(numPoints)) } // LogsAccepted reports that the logs were accepted. func (or *ObsReport) LogsAccepted(ctx context.Context, numRecords int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeLogs, int64(numRecords), int64(0), int64(0)) - } + or.recordData(ctx, component.DataTypeLogs, int64(numRecords), int64(0), int64(0)) } // LogsRefused reports that the logs were refused. func (or *ObsReport) LogsRefused(ctx context.Context, numRecords int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeLogs, int64(0), int64(numRecords), int64(0)) - } + or.recordData(ctx, component.DataTypeLogs, int64(0), int64(numRecords), int64(0)) } // LogsDropped reports that the logs were dropped. func (or *ObsReport) LogsDropped(ctx context.Context, numRecords int) { - if or.level != configtelemetry.LevelNone { - or.recordData(ctx, component.DataTypeLogs, int64(0), int64(0), int64(numRecords)) - } + or.recordData(ctx, component.DataTypeLogs, int64(0), int64(0), int64(numRecords)) } diff --git a/processor/processorhelper/obsreport_test.go b/processor/processorhelper/obsreport_test.go index d80c1c180f6..e3b7b506063 100644 --- a/processor/processorhelper/obsreport_test.go +++ b/processor/processorhelper/obsreport_test.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/configtelemetry" "go.opentelemetry.io/collector/processor" ) @@ -172,6 +173,67 @@ func TestCheckProcessorLogViews(t *testing.T) { assert.Error(t, tt.CheckProcessorLogs(0, 0, 9)) } +func TestNoMetrics(t *testing.T) { + // ensure if LevelNone is configured, no metrics are emitted by the component + testTelemetry(t, processorID, func(t *testing.T, tt componenttest.TestTelemetry) { + const accepted = 29 + const refused = 11 + const dropped = 17 + set := tt.TelemetrySettings() + set.MetricsLevel = configtelemetry.LevelNone + + por, err := NewObsReport(ObsReportSettings{ + ProcessorID: processorID, + ProcessorCreateSettings: processor.CreateSettings{ID: processorID, TelemetrySettings: set, BuildInfo: component.NewDefaultBuildInfo()}, + }) + assert.NoError(t, err) + + por.TracesAccepted(context.Background(), accepted) + por.TracesRefused(context.Background(), refused) + por.TracesDropped(context.Background(), dropped) + + require.Error(t, tt.CheckProcessorTraces(accepted, refused, dropped)) + }) + testTelemetry(t, processorID, func(t *testing.T, tt componenttest.TestTelemetry) { + const accepted = 29 + const refused = 11 + const dropped = 17 + set := tt.TelemetrySettings() + set.MetricsLevel = configtelemetry.LevelNone + + por, err := NewObsReport(ObsReportSettings{ + ProcessorID: processorID, + ProcessorCreateSettings: processor.CreateSettings{ID: processorID, TelemetrySettings: set, BuildInfo: component.NewDefaultBuildInfo()}, + }) + assert.NoError(t, err) + + por.MetricsAccepted(context.Background(), accepted) + por.MetricsRefused(context.Background(), refused) + por.MetricsDropped(context.Background(), dropped) + + require.Error(t, tt.CheckProcessorMetrics(accepted, refused, dropped)) + }) + testTelemetry(t, processorID, func(t *testing.T, tt componenttest.TestTelemetry) { + const accepted = 29 + const refused = 11 + const dropped = 17 + set := tt.TelemetrySettings() + set.MetricsLevel = configtelemetry.LevelNone + + por, err := NewObsReport(ObsReportSettings{ + ProcessorID: processorID, + ProcessorCreateSettings: processor.CreateSettings{ID: processorID, TelemetrySettings: set, BuildInfo: component.NewDefaultBuildInfo()}, + }) + assert.NoError(t, err) + + por.LogsAccepted(context.Background(), accepted) + por.LogsRefused(context.Background(), refused) + por.LogsDropped(context.Background(), dropped) + + require.Error(t, tt.CheckProcessorLogs(accepted, refused, dropped)) + }) +} + func testTelemetry(t *testing.T, id component.ID, testFunc func(t *testing.T, tt componenttest.TestTelemetry)) { t.Run("WithOTel", func(t *testing.T) { tt, err := componenttest.SetupTelemetry(id)