diff --git a/.chloggen/fix_47543.yaml b/.chloggen/fix_47543.yaml new file mode 100644 index 0000000000000..08942ef76dd28 --- /dev/null +++ b/.chloggen/fix_47543.yaml @@ -0,0 +1,27 @@ +# 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. receiver/filelog) +component: extension/azure_encoding + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Migrate semantic conventions to v1.40.0 + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [47543] + +# (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: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# 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: [] \ No newline at end of file diff --git a/extension/encoding/azureencodingextension/README.md b/extension/encoding/azureencodingextension/README.md index 2ede7e6b7d994..558fd11570d42 100644 --- a/extension/encoding/azureencodingextension/README.md +++ b/extension/encoding/azureencodingextension/README.md @@ -179,6 +179,24 @@ receivers: encoding: azure_encoding ``` +### Semantic Conventions Compatibility + +This extension follows Collector-native semconv migration gates for log attribute key migrations. + +The following feature gates control migration of legacy log keys (v0) to stable keys (v1): + +- `extension.azureencoding.EmitV1LogConventions` +- `extension.azureencoding.DontEmitV0LogConventions` + +Behavior matrix: + +| EmitV1 | DontEmitV0 | Behavior | +| --- | --- | --- | +| false | false | Emit v0 conventions only (default) | +| true | false | Emit both v0 and v1 conventions | +| true | true | Emit v1 conventions only | +| false | true | Invalid configuration (startup error) | + ### Log format identification All logs processed by this extension are automatically tagged with an `encoding.format` attribute at the scope level to identify the log family. This allows you to filter and route logs by Azure service while keeping the data model consistent at the family level. diff --git a/extension/encoding/azureencodingextension/documentation.md b/extension/encoding/azureencodingextension/documentation.md new file mode 100644 index 0000000000000..e6d6b43f00bb5 --- /dev/null +++ b/extension/encoding/azureencodingextension/documentation.md @@ -0,0 +1,14 @@ +[comment]: <> (Code generated by mdatagen. DO NOT EDIT.) + +# azure_encoding + +## Feature Gates + +This component has the following feature gates: + +| Feature Gate | Stage | Description | From Version | To Version | Reference | +| ------------ | ----- | ----------- | ------------ | ---------- | --------- | +| `extension.azureencoding.DontEmitV0LogConventions` | alpha | When enabled, v0 semconv log attribute names are not emitted. | v0.149.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543) | +| `extension.azureencoding.EmitV1LogConventions` | alpha | When enabled, v1 semconv log attribute names are emitted. | v0.149.0 | N/A | [Link](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543) | + +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/extension/encoding/azureencodingextension/extension.go b/extension/encoding/azureencodingextension/extension.go index d1991fefae70a..3599277a5b832 100644 --- a/extension/encoding/azureencodingextension/extension.go +++ b/extension/encoding/azureencodingextension/extension.go @@ -5,13 +5,16 @@ package azureencodingextension // import "github.com/open-telemetry/opentelemetr import ( "context" + "errors" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/pdata/ptrace" + "go.uber.org/zap" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/azureencodingextension/internal/metadata" ) var ( @@ -22,6 +25,7 @@ var ( type azureExtension struct { config *Config + logger *zap.Logger logUnmarshaler plog.Unmarshaler traceUnmarshaler ptrace.Unmarshaler metricUnmarshaler pmetric.Unmarshaler @@ -39,7 +43,22 @@ func (ex *azureExtension) UnmarshalMetrics(buf []byte) (pmetric.Metrics, error) return ex.metricUnmarshaler.UnmarshalMetrics(buf) } -func (*azureExtension) Start(context.Context, component.Host) error { +func (ex *azureExtension) Start(_ context.Context, _ component.Host) error { + if metadata.ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate.IsEnabled() && + !metadata.ExtensionAzureencodingEmitV1LogConventionsFeatureGate.IsEnabled() { + err := errors.New("extension.azureencoding.DontEmitV0LogConventions cannot be enabled without enabling extension.azureencoding.EmitV1LogConventions") + ex.logger.Error("Invalid feature gate combination", zap.Error(err)) + return err + } + + if !metadata.ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate.IsEnabled() { + ex.logger.Warn( + "[WARNING] Azure encoding logs currently emit legacy semconv attributes. " + + "To opt in to v1 semconv attributes, enable extension.azureencoding.EmitV1LogConventions and " + + "extension.azureencoding.DontEmitV0LogConventions feature gates.", + ) + } + return nil } diff --git a/extension/encoding/azureencodingextension/factory.go b/extension/encoding/azureencodingextension/factory.go index 432f9f22d2276..bc2e64f2d3271 100644 --- a/extension/encoding/azureencodingextension/factory.go +++ b/extension/encoding/azureencodingextension/factory.go @@ -29,6 +29,7 @@ func createExtension(_ context.Context, settings extension.Settings, cfg compone return &azureExtension{ config: config, + logger: settings.Logger, logUnmarshaler: logs.NewAzureResourceLogsUnmarshaler( settings.BuildInfo, settings.Logger, diff --git a/extension/encoding/azureencodingextension/go.mod b/extension/encoding/azureencodingextension/go.mod index 9cb05fe69ee8f..941c08e41cae8 100644 --- a/extension/encoding/azureencodingextension/go.mod +++ b/extension/encoding/azureencodingextension/go.mod @@ -16,6 +16,7 @@ require ( go.opentelemetry.io/collector/confmap/xconfmap v0.150.0 go.opentelemetry.io/collector/extension v1.56.0 go.opentelemetry.io/collector/extension/extensiontest v0.150.0 + go.opentelemetry.io/collector/featuregate v1.56.0 go.opentelemetry.io/collector/pdata v1.56.0 go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/trace v1.43.0 @@ -42,7 +43,6 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.150.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/collector/featuregate v1.56.0 // indirect go.opentelemetry.io/collector/internal/componentalias v0.150.0 // indirect go.opentelemetry.io/collector/pdata/pprofile v0.150.0 // indirect go.opentelemetry.io/collector/pdata/xpdata v0.150.0 // indirect diff --git a/extension/encoding/azureencodingextension/internal/metadata/generated_feature_gates.go b/extension/encoding/azureencodingextension/internal/metadata/generated_feature_gates.go new file mode 100644 index 0000000000000..54a373cbdfa45 --- /dev/null +++ b/extension/encoding/azureencodingextension/internal/metadata/generated_feature_gates.go @@ -0,0 +1,23 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/featuregate" +) + +var ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate = featuregate.GlobalRegistry().MustRegister( + "extension.azureencoding.DontEmitV0LogConventions", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, v0 semconv log attribute names are not emitted."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543"), + featuregate.WithRegisterFromVersion("v0.149.0"), +) + +var ExtensionAzureencodingEmitV1LogConventionsFeatureGate = featuregate.GlobalRegistry().MustRegister( + "extension.azureencoding.EmitV1LogConventions", + featuregate.StageAlpha, + featuregate.WithRegisterDescription("When enabled, v1 semconv log attribute names are emitted."), + featuregate.WithRegisterReferenceURL("https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543"), + featuregate.WithRegisterFromVersion("v0.149.0"), +) diff --git a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/README.md b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/README.md index 8b85e95e69350..8cb3e7ad7c6a2 100644 --- a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/README.md +++ b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/README.md @@ -695,4 +695,4 @@ Activity Logs are a type of Azure platform log that provides insight into subscr | `currentHealthStatus` | `azure.resourcehealth.state` | Log Attribute | | `previousHealthStatus` | `azure.resourcehealth.previous_state` | Log Attribute | | `type` | `azure.resourcehealth.type` | Log Attribute | -| `cause` | `azure.resourcehealth.cause` | Log Attribute | +| `cause` | `azure.resourcehealth.cause` | Log Attribute | \ No newline at end of file diff --git a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_datafactory.go b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_datafactory.go index 09477861d302f..a176d3bef29b4 100644 --- a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_datafactory.go +++ b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_datafactory.go @@ -11,6 +11,7 @@ import ( conventionsv139 "go.opentelemetry.io/otel/semconv/v1.39.0" conventions "go.opentelemetry.io/otel/semconv/v1.40.0" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/azureencodingextension/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/azureencodingextension/internal/unmarshaler" ) @@ -150,8 +151,13 @@ func (r *azureDataFactoryBaseLog) PutProperties(attrs pcommon.Map, _ pcommon.Val unmarshaler.AttrPutMapIf(attrs, attributeDataFactorySystemParameters, r.Properties.SystemParameters) unmarshaler.AttrPutMapIf(attrs, attributeDataFactoryTags, r.Properties.Tags) // Errors + if !metadata.ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.Properties.Error.Message) + } + if metadata.ExtensionAzureencodingEmitV1LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventions.ExceptionMessageKey), r.Properties.Error.Message) + } unmarshaler.AttrPutStrIf(attrs, attributeErrorCode, r.Properties.Error.Code) - unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.Properties.Error.Message) unmarshaler.AttrPutStrIf(attrs, string(conventions.ErrorTypeKey), r.Properties.Error.FailureType) unmarshaler.AttrPutStrIf(attrs, attributeErrorTarget, r.Properties.Error.Target) diff --git a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_messaging.go b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_messaging.go index 81d2974f079dc..c339e441c02fe 100644 --- a/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_messaging.go +++ b/extension/encoding/azureencodingextension/internal/unmarshaler/logs/category_messaging.go @@ -15,6 +15,7 @@ import ( conventionsv139 "go.opentelemetry.io/otel/semconv/v1.39.0" conventions "go.opentelemetry.io/otel/semconv/v1.40.0" + "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/azureencodingextension/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/azureencodingextension/internal/unmarshaler" ) @@ -164,7 +165,12 @@ func (r *azureMSDiagnosticErrorLog) PutCommonAttributes(attrs pcommon.Map, body // Then put custom top-level attributes unmarshaler.AttrPutStrIf(attrs, attributeAzureMSTaskName, r.TaskName) - unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.ErrorMessage) + if !metadata.ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.ErrorMessage) + } + if metadata.ExtensionAzureencodingEmitV1LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventions.ExceptionMessageKey), r.ErrorMessage) + } unmarshaler.AttrPutIntNumberIf(attrs, attributeAzureMSErrorCount, r.ErrorCount) unmarshaler.AttrPutStrIf(attrs, string(conventions.ErrorTypeKey), r.OperationResult) } @@ -309,7 +315,12 @@ func (r *azureMSOperationalLog) PutProperties(attrs pcommon.Map, _ pcommon.Value unmarshaler.AttrPutURLParsed(attrs, r.Properties.ViaURL) unmarshaler.AttrPutStrIf(attrs, string(conventions.AzureServiceRequestIDKey), r.Properties.TrackingID) unmarshaler.AttrPutStrIf(attrs, attributeErrorCode, r.Properties.ErrorCode) - unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.Properties.ErrorMessage) + if !metadata.ExtensionAzureencodingDontEmitV0LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventionsv139.ErrorMessageKey), r.Properties.ErrorMessage) + } + if metadata.ExtensionAzureencodingEmitV1LogConventionsFeatureGate.IsEnabled() { + unmarshaler.AttrPutStrIf(attrs, string(conventions.ExceptionMessageKey), r.Properties.ErrorMessage) + } return nil } diff --git a/extension/encoding/azureencodingextension/metadata.yaml b/extension/encoding/azureencodingextension/metadata.yaml index 097fab8c7aff2..df116b25b5ea7 100644 --- a/extension/encoding/azureencodingextension/metadata.yaml +++ b/extension/encoding/azureencodingextension/metadata.yaml @@ -14,3 +14,15 @@ status: codeowners: active: [axw, constanca-m] distributions: [contrib] + +feature_gates: + - id: extension.azureencoding.DontEmitV0LogConventions + stage: alpha + description: When enabled, v0 semconv log attribute names are not emitted. + from_version: v0.149.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543 + - id: extension.azureencoding.EmitV1LogConventions + stage: alpha + description: When enabled, v1 semconv log attribute names are emitted. + from_version: v0.149.0 + reference_url: https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/47543