From 0bd144c2446004defec786d8aa7d5ec33340842c Mon Sep 17 00:00:00 2001 From: kbauer Date: Mon, 11 May 2026 15:29:07 -0700 Subject: [PATCH 1/2] chore(connector/spanmetrics): migrate fgs to metadata --- .golangci.yml | 3 -- connector/spanmetricsconnector/config.go | 3 +- connector/spanmetricsconnector/config_test.go | 2 +- connector/spanmetricsconnector/connector.go | 11 ++-- .../spanmetricsconnector/connector_test.go | 33 ++++++------ .../spanmetricsconnector/documentation.md | 17 +++++++ connector/spanmetricsconnector/factory.go | 50 +------------------ .../metadata/generated_feature_gates.go | 47 +++++++++++++++++ connector/spanmetricsconnector/metadata.yaml | 33 ++++++++++++ 9 files changed, 125 insertions(+), 74 deletions(-) create mode 100644 connector/spanmetricsconnector/documentation.md create mode 100644 connector/spanmetricsconnector/internal/metadata/generated_feature_gates.go diff --git a/.golangci.yml b/.golangci.yml index ca2fe28bedb60..971c19c0b0b94 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -125,9 +125,6 @@ linters: - linters: - forbidigo path: connector/servicegraphconnector/ - - linters: - - forbidigo - path: connector/spanmetricsconnector/ - linters: - forbidigo path: exporter/awsemfexporter/ diff --git a/connector/spanmetricsconnector/config.go b/connector/spanmetricsconnector/config.go index 8c01677d97bf4..7241eb06356f1 100644 --- a/connector/spanmetricsconnector/config.go +++ b/connector/spanmetricsconnector/config.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/confmap/xconfmap" "go.opentelemetry.io/collector/pdata/pmetric" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metrics" ) @@ -205,7 +206,7 @@ func (c Config) GetDeltaTimestampCacheSize() int { func validateDimensions(dimensions []Dimension) error { labelNames := make(map[string]struct{}) intervalLabels := []string{serviceNameKey, spanKindKey, statusCodeKey, spanNameKey} - if includeCollectorInstanceID.IsEnabled() { + if metadata.ConnectorSpanmetricsIncludeCollectorInstanceIDFeatureGate.IsEnabled() { intervalLabels = append(intervalLabels, collectorInstanceKey) } diff --git a/connector/spanmetricsconnector/config_test.go b/connector/spanmetricsconnector/config_test.go index 75bc73f323ed6..0c048bd3c2dcb 100644 --- a/connector/spanmetricsconnector/config_test.go +++ b/connector/spanmetricsconnector/config_test.go @@ -26,7 +26,7 @@ import ( func TestLoadConfig(t *testing.T) { t.Parallel() - require.NoError(t, featuregate.GlobalRegistry().Set(useSecondAsDefaultMetricsUnit.ID(), true)) + require.NoError(t, featuregate.GlobalRegistry().Set(metadata.ConnectorSpanmetricsUseSecondAsDefaultMetricsUnitFeatureGate.ID(), true)) cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml")) require.NoError(t, err) diff --git a/connector/spanmetricsconnector/connector.go b/connector/spanmetricsconnector/connector.go index 33b42d34ca1e0..1e9d37b97ff95 100644 --- a/connector/spanmetricsconnector/connector.go +++ b/connector/spanmetricsconnector/connector.go @@ -22,6 +22,7 @@ import ( "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/cache" + "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metrics" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/traceutil" utilattri "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" @@ -282,7 +283,7 @@ func (p *connectorImp) buildMetrics() pmetric.Metrics { p.resourceMetrics.ForEach(func(_ resourceKey, rawMetrics *resourceMetrics) { rm := m.ResourceMetrics().AppendEmpty() - if !excludeResourceMetrics.IsEnabled() || p.config.AddResourceAttributes { + if !metadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.IsEnabled() || p.config.AddResourceAttributes { rawMetrics.attributes.CopyTo(rm.Resource().Attributes()) } @@ -307,7 +308,7 @@ func (p *connectorImp) buildMetrics() pmetric.Metrics { } metricsNamespace := p.config.Namespace - if legacyMetricNamesFeatureGate.IsEnabled() && metricsNamespace == DefaultNamespace { + if metadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.IsEnabled() && metricsNamespace == DefaultNamespace { metricsNamespace = "" } @@ -550,7 +551,7 @@ func (p *connectorImp) buildAttributes( if !slices.Contains(p.config.ExcludeDimensions, spanKindKey) { attr.PutStr(spanKindKey, traceutil.SpanKindStr(span.Kind())) } - if useOtelStatusCodeAttribute.IsEnabled() { + if metadata.SpanmetricsStatusCodeConventionUseOtelPrefixFeatureGate.IsEnabled() { if !slices.Contains(p.config.ExcludeDimensions, otelStatusCodeKey) { if span.Status().Code() == ptrace.StatusCodeError { attr.PutStr(otelStatusCodeKey, "ERROR") @@ -563,7 +564,7 @@ func (p *connectorImp) buildAttributes( attr.PutStr(statusCodeKey, traceutil.StatusCodeStr(span.Status().Code())) } } - if includeCollectorInstanceID.IsEnabled() { + if metadata.ConnectorSpanmetricsIncludeCollectorInstanceIDFeatureGate.IsEnabled() { if !slices.Contains(p.config.ExcludeDimensions, collectorInstanceKey) { attr.PutStr(collectorInstanceKey, p.instanceID) } @@ -624,7 +625,7 @@ func (p *connectorImp) buildKey(serviceName string, span ptrace.Span, optionalDi if !slices.Contains(p.config.ExcludeDimensions, spanKindKey) { concatDimensionValue(p.keyBuf, traceutil.SpanKindStr(span.Kind()), true) } - if useOtelStatusCodeAttribute.IsEnabled() { + if metadata.SpanmetricsStatusCodeConventionUseOtelPrefixFeatureGate.IsEnabled() { if !slices.Contains(p.config.ExcludeDimensions, otelStatusCodeKey) { concatDimensionValue(p.keyBuf, traceutil.StatusCodeStr(span.Status().Code()), true) } diff --git a/connector/spanmetricsconnector/connector_test.go b/connector/spanmetricsconnector/connector_test.go index 6f22f45033fa9..fa82677edb393 100644 --- a/connector/spanmetricsconnector/connector_test.go +++ b/connector/spanmetricsconnector/connector_test.go @@ -30,6 +30,7 @@ import ( "go.uber.org/zap/zaptest/observer" "google.golang.org/grpc/metadata" + spanmetricsmetadata "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metrics" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil" ) @@ -868,9 +869,9 @@ func TestConsumeMetricsErrors(t *testing.T) { func TestConsumeTraces(t *testing.T) { // enable it - require.NoError(t, featuregate.GlobalRegistry().Set(excludeResourceMetrics.ID(), true)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.ID(), true)) defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), false)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID(), false)) }() t.Parallel() @@ -1014,9 +1015,9 @@ func TestConsumeTraces(t *testing.T) { // Override the default no-op consumer with metrics sink for testing. p.metricsConsumer = mcon if tc.statusCodeFeatureGate { - require.NoError(t, featuregate.GlobalRegistry().Set(useOtelStatusCodeAttribute.ID(), true)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.SpanmetricsStatusCodeConventionUseOtelPrefixFeatureGate.ID(), true)) defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(useOtelStatusCodeAttribute.ID(), false)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.SpanmetricsStatusCodeConventionUseOtelPrefixFeatureGate.ID(), false)) }() } @@ -1214,10 +1215,10 @@ func TestAddResourceAttributesConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Save and restore the feature gate state - previousValue := excludeResourceMetrics.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(excludeResourceMetrics.ID(), tt.featureGateEnabled)) + previousValue := spanmetricsmetadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.IsEnabled() + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.ID(), tt.featureGateEnabled)) defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(excludeResourceMetrics.ID(), previousValue)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.ID(), previousValue)) }() // Create a custom config with AddResourceAttributes @@ -1302,11 +1303,11 @@ func TestExcludeDimensionsConsumeTraces(t *testing.T) { featureGateEnabled bool }{ { - dsc: fmt.Sprintf("%s enabled", legacyMetricNamesFeatureGateID), + dsc: fmt.Sprintf("%s enabled", spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID()), featureGateEnabled: true, }, { - dsc: fmt.Sprintf("%s disabled", legacyMetricNamesFeatureGateID), + dsc: fmt.Sprintf("%s disabled", spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID()), featureGateEnabled: false, }, } @@ -1315,10 +1316,10 @@ func TestExcludeDimensionsConsumeTraces(t *testing.T) { for _, tc := range testcases { t.Run(tc.dsc, func(t *testing.T) { // Set feature gate value - previousValue := legacyMetricNamesFeatureGate.IsEnabled() - require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), tc.featureGateEnabled)) + previousValue := spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.IsEnabled() + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID(), tc.featureGateEnabled)) defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), previousValue)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID(), previousValue)) }() p, err := newConnectorImp(stringp("defaultNullValue"), explicitHistogramsConfig, disabledExemplarsConfig, disabledEventsConfig, cumulative, 0, []string{}, 1000, clockwork.NewFakeClock(), false, excludeDimensions...) @@ -1910,9 +1911,9 @@ func assertDataPointsHaveExactlyOneExemplarForTrace(t *testing.T, metrics pmetri func TestTimestampsForUninterruptedStream(t *testing.T) { // enable it - require.NoError(t, featuregate.GlobalRegistry().Set(excludeResourceMetrics.ID(), true)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsExcludeResourceMetricsFeatureGate.ID(), true)) defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(legacyMetricNamesFeatureGate.ID(), false)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsLegacyMetricNamesFeatureGate.ID(), false)) }() tests := []struct { @@ -2562,10 +2563,10 @@ func TestBuildAttributesWithFeatureGate(t *testing.T) { t.Run(tt.name, func(t *testing.T) { p := &connectorImp{config: tt.config, instanceID: instanceID} if !tt.includeCollectorInstanceID { - require.NoError(t, featuregate.GlobalRegistry().Set(includeCollectorInstanceID.ID(), false)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsIncludeCollectorInstanceIDFeatureGate.ID(), false)) } defer func() { - require.NoError(t, featuregate.GlobalRegistry().Set(includeCollectorInstanceID.ID(), true)) + require.NoError(t, featuregate.GlobalRegistry().Set(spanmetricsmetadata.ConnectorSpanmetricsIncludeCollectorInstanceIDFeatureGate.ID(), true)) }() span := ptrace.NewSpan() diff --git a/connector/spanmetricsconnector/documentation.md b/connector/spanmetricsconnector/documentation.md new file mode 100644 index 0000000000000..d430db3700255 --- /dev/null +++ b/connector/spanmetricsconnector/documentation.md @@ -0,0 +1,17 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# span_metrics + +## Feature Gates + +This component has the following feature gates: + +| Feature Gate | Stage | Description | From Version | To Version | Reference | +| ------------ | ----- | ----------- | ------------ | ---------- | --------- | +| `connector.spanmetrics.excludeResourceMetrics` | alpha | When enabled, connector will exclude all resource attributes. | v0.137.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42103) | +| `connector.spanmetrics.includeCollectorInstanceID` | beta | When enabled, connector add collector.instance.id to default dimensions. | v0.136.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/40400) | +| `connector.spanmetrics.legacyMetricNames` | alpha | When enabled, connector uses legacy metric names. | v0.109.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33227) | +| `connector.spanmetrics.useSecondAsDefaultMetricsUnit` | alpha | When enabled, connector use second as default unit for duration metrics. | v0.137.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42462) | +| `spanmetrics.statusCodeConvention.useOtelPrefix` | alpha | When enabled, generated metrics will use `otel.status_code=ERROR` instead of `status.code=STATUS_CODE_ERROR` | v0.141.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/43000) | + +For more information about feature gates, see the [Feature Gates](https://github.com/open-telemetry/opentelemetry-collector/blob/main/featuregate/README.md) documentation. diff --git a/connector/spanmetricsconnector/factory.go b/connector/spanmetricsconnector/factory.go index 860a0826e9fee..1ca2668890d62 100644 --- a/connector/spanmetricsconnector/factory.go +++ b/connector/spanmetricsconnector/factory.go @@ -15,7 +15,6 @@ import ( "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/xconnector" "go.opentelemetry.io/collector/consumer" - "go.opentelemetry.io/collector/featuregate" "go.opentelemetry.io/collector/pdata/pcommon" "github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector/internal/metadata" @@ -23,54 +22,9 @@ import ( ) const ( - DefaultNamespace = "traces.span.metrics" - legacyMetricNamesFeatureGateID = "connector.spanmetrics.legacyMetricNames" - includeCollectorInstanceIDFeatureGateID = "connector.spanmetrics.includeCollectorInstanceID" - useSecondAsDefaultMetricsUnitFeatureGateID = "connector.spanmetrics.useSecondAsDefaultMetricsUnit" - excludeResourceMetricsFeatureGate = "connector.spanmetrics.excludeResourceMetrics" + DefaultNamespace = "traces.span.metrics" ) -var ( - legacyMetricNamesFeatureGate *featuregate.Gate - includeCollectorInstanceID *featuregate.Gate - useSecondAsDefaultMetricsUnit *featuregate.Gate - excludeResourceMetrics *featuregate.Gate - useOtelStatusCodeAttribute *featuregate.Gate -) - -func init() { - // TODO: Remove this feature gate when the legacy metric names are removed. - legacyMetricNamesFeatureGate = featuregate.GlobalRegistry().MustRegister( - legacyMetricNamesFeatureGateID, - featuregate.StageAlpha, // Alpha because we want it disabled by default. - featuregate.WithRegisterDescription("When enabled, connector uses legacy metric names."), - featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33227"), - ) - includeCollectorInstanceID = featuregate.GlobalRegistry().MustRegister( - includeCollectorInstanceIDFeatureGateID, - featuregate.StageBeta, - featuregate.WithRegisterDescription("When enabled, connector add collector.instance.id to default dimensions."), - featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/40400"), - ) - useSecondAsDefaultMetricsUnit = featuregate.GlobalRegistry().MustRegister( - useSecondAsDefaultMetricsUnitFeatureGateID, - featuregate.StageAlpha, - featuregate.WithRegisterDescription("When enabled, connector use second as default unit for duration metrics."), - featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42462"), - ) - excludeResourceMetrics = featuregate.GlobalRegistry().MustRegister( - excludeResourceMetricsFeatureGate, - featuregate.StageAlpha, - featuregate.WithRegisterDescription("When enabled, connector will exclude all resource attributes."), - featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42103"), - ) - useOtelStatusCodeAttribute = featuregate.GlobalRegistry().MustRegister( - "spanmetrics.statusCodeConvention.useOtelPrefix", - featuregate.StageAlpha, - featuregate.WithRegisterDescription("When enabled, generated metrics will use `otel.status_code=ERROR` instead of `status.code=STATUS_CODE_ERROR`"), - ) -} - // NewFactory creates a factory for the spanmetrics connector. func NewFactory() connector.Factory { return xconnector.NewFactory( @@ -87,7 +41,7 @@ func createDefaultConfig() component.Config { ResourceMetricsCacheSize: defaultResourceMetricsCacheSize, MetricsFlushInterval: 60 * time.Second, Histogram: HistogramConfig{Disable: false, Unit: func() metrics.Unit { - if useSecondAsDefaultMetricsUnit.IsEnabled() { + if metadata.ConnectorSpanmetricsUseSecondAsDefaultMetricsUnitFeatureGate.IsEnabled() { return metrics.Seconds } diff --git a/connector/spanmetricsconnector/internal/metadata/generated_feature_gates.go b/connector/spanmetricsconnector/internal/metadata/generated_feature_gates.go new file mode 100644 index 0000000000000..49fcd2cf23e4f --- /dev/null +++ b/connector/spanmetricsconnector/internal/metadata/generated_feature_gates.go @@ -0,0 +1,47 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/featuregate" +) + +var ConnectorSpanmetricsExcludeResourceMetricsFeatureGate = featuregate.GlobalRegistry().MustRegister( + "connector.spanmetrics.excludeResourceMetrics", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, connector will exclude all resource attributes."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42103"), + featuregate.WithRegisterFromVersion("v0.137.0"), +) + +var ConnectorSpanmetricsIncludeCollectorInstanceIDFeatureGate = featuregate.GlobalRegistry().MustRegister( + "connector.spanmetrics.includeCollectorInstanceID", + featuregate.StageBeta, + featuregate.WithRegisterDescription("When enabled, connector add collector.instance.id to default dimensions."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/40400"), + featuregate.WithRegisterFromVersion("v0.136.0"), +) + +var ConnectorSpanmetricsLegacyMetricNamesFeatureGate = featuregate.GlobalRegistry().MustRegister( + "connector.spanmetrics.legacyMetricNames", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, connector uses legacy metric names."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33227"), + featuregate.WithRegisterFromVersion("v0.109.0"), +) + +var ConnectorSpanmetricsUseSecondAsDefaultMetricsUnitFeatureGate = featuregate.GlobalRegistry().MustRegister( + "connector.spanmetrics.useSecondAsDefaultMetricsUnit", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, connector use second as default unit for duration metrics."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42462"), + featuregate.WithRegisterFromVersion("v0.137.0"), +) + +var SpanmetricsStatusCodeConventionUseOtelPrefixFeatureGate = featuregate.GlobalRegistry().MustRegister( + "spanmetrics.statusCodeConvention.useOtelPrefix", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, generated metrics will use `otel.status_code=ERROR` instead of `status.code=STATUS_CODE_ERROR`"), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/43000"), + featuregate.WithRegisterFromVersion("v0.141.0"), +) diff --git a/connector/spanmetricsconnector/metadata.yaml b/connector/spanmetricsconnector/metadata.yaml index e3e708bcb2e31..8426ef52a0d46 100644 --- a/connector/spanmetricsconnector/metadata.yaml +++ b/connector/spanmetricsconnector/metadata.yaml @@ -12,5 +12,38 @@ status: emeritus: [albertteoh] seeking_new: true +feature_gates: + - id: connector.spanmetrics.excludeResourceMetrics + description: When enabled, connector will exclude all resource attributes. + stage: alpha + from_version: v0.137.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42103 + + - id: connector.spanmetrics.includeCollectorInstanceID + description: When enabled, connector add collector.instance.id to default dimensions. + stage: beta + from_version: v0.136.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/40400 + + # TODO: Remove this feature gate when the legacy metric names are removed. + - id: connector.spanmetrics.legacyMetricNames + description: When enabled, connector uses legacy metric names. + # Alpha because we want it disabled by default. + stage: alpha + from_version: v0.109.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/33227 + + - id: connector.spanmetrics.useSecondAsDefaultMetricsUnit + description: When enabled, connector use second as default unit for duration metrics. + stage: alpha + from_version: v0.137.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/42462 + + - id: spanmetrics.statusCodeConvention.useOtelPrefix + description: When enabled, generated metrics will use `otel.status_code=ERROR` instead of `status.code=STATUS_CODE_ERROR` + stage: alpha + from_version: v0.141.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/43000 + tests: config: From d8938afe3241a63cf3174c340f920b25e09d6855 Mon Sep 17 00:00:00 2001 From: kbauer Date: Tue, 12 May 2026 08:52:04 -0700 Subject: [PATCH 2/2] chore: remove TODO --- connector/spanmetricsconnector/metadata.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/connector/spanmetricsconnector/metadata.yaml b/connector/spanmetricsconnector/metadata.yaml index 8426ef52a0d46..a6e59c4f1f90d 100644 --- a/connector/spanmetricsconnector/metadata.yaml +++ b/connector/spanmetricsconnector/metadata.yaml @@ -25,7 +25,6 @@ feature_gates: from_version: v0.136.0 reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/40400 - # TODO: Remove this feature gate when the legacy metric names are removed. - id: connector.spanmetrics.legacyMetricNames description: When enabled, connector uses legacy metric names. # Alpha because we want it disabled by default.