diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f826d6abb2..caa7b924c00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,8 @@ release. ([#4560](https://github.com/open-telemetry/opentelemetry-specification/pull/4560)) - ⚠️ **IMPORTANT**: Extending the set of standard attribute value types is no longer a breaking change. ([#4614](https://github.com/open-telemetry/opentelemetry-specification/pull/4614)) +- Extend the set of attribute value types to support more complex data structures. + ([#4651](https://github.com/open-telemetry/opentelemetry-specification/pull/4651)) ### OTEPs diff --git a/oteps/4485-extending-attributes-to-support-complex-values.md b/oteps/4485-extending-attributes-to-support-complex-values.md index 737c03732d4..d19b94a5f4e 100644 --- a/oteps/4485-extending-attributes-to-support-complex-values.md +++ b/oteps/4485-extending-attributes-to-support-complex-values.md @@ -94,7 +94,7 @@ extending the standard attributes provides a more seamless and user-friendly API Currently, the SDK specification has a clause that says extending the set of standard attribute would be -[considered a breaking change](/specification/common/README.md#standard-attribute). +[considered a breaking change](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.44.0/specification/common/README.md#standard-attribute). We believe that removing this clause and extending standard attributes can be done gracefully across the OpenTelemetry ecosystem @@ -123,24 +123,7 @@ Existing APIs that create or add attributes will be extended to support It's RECOMMENDED to expose an `AnyValue` type - the API representing complex or simple attribute value for type checking, ergonomics, and performance reasons. -Exposing multiple types of attribute sets is NOT RECOMMENDED, such as having "ExtendedAttributes" in addition to "Attributes". - -OTel API MUST support setting complex attributes on spans, logs, profiles, -span links, and as descriptive entity attributes. - -OTel API MAY support setting complex attributes on metrics, resources, -instrumentation scope, span events, and as identifying entity attributes. - -> [!NOTE] -> "MAY" is used here instead of "MUST" to give flexibility to dynamically -> typed language APIs since there are no concrete use cases at this time -> requiring complex attributes in these areas. -> -> Most likely statically typed languages will choose to support -> setting complex attributes uniformly everywhere. -> -> This requirement level could change from "MAY" to "MUST" in the future -> if we uncover use cases for complex attributes in these areas. +OTel API MUST support setting complex attributes. API documentation and spec language around complex attributes SHOULD include language similar to this: @@ -152,22 +135,7 @@ language similar to this: ### SDK -OTel SDK MUST support setting complex attributes on spans, logs, profiles, -span links, and as descriptive entity attributes. - -OTel SDK MAY support setting complex attributes on metrics, exemplars, resources, -instrumentation scope, span events, and as identifying entity attributes. - -> [!NOTE] -> "MAY" is used here instead of "MUST" to give flexibility to dynamically -> typed language SDKs since there are no concrete use cases at this time -> requiring complex attributes in these areas. -> -> Most likely statically typed languages will choose to support -> setting complex attributes uniformly everywhere. -> -> This requirement level could change from "MAY" to "MUST" in the future -> if we uncover use cases for complex attributes in these areas. +OTel SDK MUST support setting complex attributes. The SDK MUST support reading and modifying complex attributes during processing whenever they are allowed on the API surface. diff --git a/oteps/entities/0256-entities-data-model.md b/oteps/entities/0256-entities-data-model.md index 51d5a00faae..70d0fde0b5f 100644 --- a/oteps/entities/0256-entities-data-model.md +++ b/oteps/entities/0256-entities-data-model.md @@ -139,7 +139,7 @@ MAY change over the lifetime of the entity. MAY be empty. These attributes are not part of entity's identity.
Follows any
+href="https://github.com/open-telemetry/opentelemetry-specification/blob/v1.44.0/specification/logs/data-model.md#type-any">any
value definition in the OpenTelemetry spec - it can be a scalar value,
byte array, an array or map of values. Arbitrary deep nesting of values
for arrays and maps is allowed.
@@ -682,7 +682,7 @@ There are a couple of reasons:
### Attribute Data Type
The data model requires the Attributes field to use the extended
-[any](../../specification/logs/data-model.md#type-any)
+[any](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.44.0/specification/logs/data-model.md#type-any)
attribute values, that allows more complex data types. This is different from the data
type used by the Id field, which is more restricted in the shape.
diff --git a/spec-compliance-matrix.md b/spec-compliance-matrix.md
index 16dfda4c378..7c55ce696a1 100644
--- a/spec-compliance-matrix.md
+++ b/spec-compliance-matrix.md
@@ -199,7 +199,6 @@ Disclaimer: this list of features is still a work in progress, please refer to t
| LoggerProvider.Shutdown | | | + | | + | + | | + | | + | - | |
| LoggerProvider.ForceFlush | | | + | | + | + | | + | | + | - | |
| Logger.Emit(LogRecord) | | | + | | + | + | | + | | + | - | |
-| Reuse Standard Attributes | X | + | | | | | | | | | | |
| LogRecord.Set EventName | | + | | | | | | | + | + | | |
| Logger.Enabled | X | + | | | | | | + | + | + | | |
| SimpleLogRecordProcessor | | | + | | + | + | | + | | + | | |
diff --git a/spec-compliance-matrix/cpp.yaml b/spec-compliance-matrix/cpp.yaml
index 14e20252911..bbb91260975 100644
--- a/spec-compliance-matrix/cpp.yaml
+++ b/spec-compliance-matrix/cpp.yaml
@@ -357,8 +357,6 @@ sections:
status: '+'
- name: Logger.Emit(LogRecord)
status: '+'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '+'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/dotnet.yaml b/spec-compliance-matrix/dotnet.yaml
index 7e5004b911a..c250553d05b 100644
--- a/spec-compliance-matrix/dotnet.yaml
+++ b/spec-compliance-matrix/dotnet.yaml
@@ -357,8 +357,6 @@ sections:
status: '-'
- name: Logger.Emit(LogRecord)
status: '-'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/erlang.yaml b/spec-compliance-matrix/erlang.yaml
index 2ff35d5dc18..483278379cc 100644
--- a/spec-compliance-matrix/erlang.yaml
+++ b/spec-compliance-matrix/erlang.yaml
@@ -357,8 +357,6 @@ sections:
status: '?'
- name: Logger.Emit(LogRecord)
status: '?'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/go.yaml b/spec-compliance-matrix/go.yaml
index 9fb04a6c5a8..86ebb1bfe17 100644
--- a/spec-compliance-matrix/go.yaml
+++ b/spec-compliance-matrix/go.yaml
@@ -357,8 +357,6 @@ sections:
status: '?'
- name: Logger.Emit(LogRecord)
status: '?'
- - name: Reuse Standard Attributes
- status: '+'
- name: LogRecord.Set EventName
status: '+'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/java.yaml b/spec-compliance-matrix/java.yaml
index 0e0c2b8e8d7..aa896871a54 100644
--- a/spec-compliance-matrix/java.yaml
+++ b/spec-compliance-matrix/java.yaml
@@ -357,8 +357,6 @@ sections:
status: '+'
- name: Logger.Emit(LogRecord)
status: '+'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/js.yaml b/spec-compliance-matrix/js.yaml
index 55e2d0152d7..a522a69f438 100644
--- a/spec-compliance-matrix/js.yaml
+++ b/spec-compliance-matrix/js.yaml
@@ -357,8 +357,6 @@ sections:
status: '?'
- name: Logger.Emit(LogRecord)
status: '?'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/php.yaml b/spec-compliance-matrix/php.yaml
index 2cd9a7aad6c..564f33216ba 100644
--- a/spec-compliance-matrix/php.yaml
+++ b/spec-compliance-matrix/php.yaml
@@ -357,8 +357,6 @@ sections:
status: '+'
- name: Logger.Emit(LogRecord)
status: '+'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/python.yaml b/spec-compliance-matrix/python.yaml
index 11a70239ed0..4c26ef34258 100644
--- a/spec-compliance-matrix/python.yaml
+++ b/spec-compliance-matrix/python.yaml
@@ -357,8 +357,6 @@ sections:
status: '+'
- name: Logger.Emit(LogRecord)
status: '+'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/ruby.yaml b/spec-compliance-matrix/ruby.yaml
index 5bcb784c831..908140e2064 100644
--- a/spec-compliance-matrix/ruby.yaml
+++ b/spec-compliance-matrix/ruby.yaml
@@ -357,8 +357,6 @@ sections:
status: '+'
- name: Logger.Emit(LogRecord)
status: '+'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/rust.yaml b/spec-compliance-matrix/rust.yaml
index 41ed148b9d7..7c2203ab5af 100644
--- a/spec-compliance-matrix/rust.yaml
+++ b/spec-compliance-matrix/rust.yaml
@@ -357,8 +357,6 @@ sections:
status: '?'
- name: Logger.Emit(LogRecord)
status: '?'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '+'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/swift.yaml b/spec-compliance-matrix/swift.yaml
index 73e78097f45..9bca50a7242 100644
--- a/spec-compliance-matrix/swift.yaml
+++ b/spec-compliance-matrix/swift.yaml
@@ -357,8 +357,6 @@ sections:
status: '?'
- name: Logger.Emit(LogRecord)
status: '?'
- - name: Reuse Standard Attributes
- status: '?'
- name: LogRecord.Set EventName
status: '?'
- name: Logger.Enabled
diff --git a/spec-compliance-matrix/template.yaml b/spec-compliance-matrix/template.yaml
index 26240de7d26..6b1a464dee4 100644
--- a/spec-compliance-matrix/template.yaml
+++ b/spec-compliance-matrix/template.yaml
@@ -234,8 +234,6 @@ sections:
- name: LoggerProvider.Shutdown
- name: LoggerProvider.ForceFlush
- name: Logger.Emit(LogRecord)
- - name: Reuse Standard Attributes
- optional: true
- name: LogRecord.Set EventName
- name: Logger.Enabled
optional: true
diff --git a/specification/common/README.md b/specification/common/README.md
index 82f634d5dc9..b92155f552a 100644
--- a/specification/common/README.md
+++ b/specification/common/README.md
@@ -8,50 +8,59 @@ path_base_for_github_subdir:
# Common specification concepts
-**Status**: [Stable](../document-status.md)
+**Status**: [Stable](../document-status.md), except where otherwise specified
MUST not change during the lifetime of the entity. The Id must contain at least one attribute. Follows OpenTelemetry [Standard attribute definition](../common/README.md#standard-attribute). SHOULD follow OpenTelemetry [semantic conventions](https://github.com/open-telemetry/semantic-conventions) for attributes. |
-| Description | map MAY change over the lifetime of the entity. MAY be empty. These attributes are not part of entity's identity. Follows [any](../logs/data-model.md#type-any) value definition in the OpenTelemetry spec. Arbitrary deep nesting of values for arrays and maps is allowed. SHOULD follow OpenTelemetry [semantic conventions](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/README.md) for attributes. |
+| Id | map MUST not change during the lifetime of the entity. The Id must contain at least one attribute. Follows OpenTelemetry [attribute definition](../common/README.md#attribute). SHOULD follow OpenTelemetry [semantic conventions](https://github.com/open-telemetry/semantic-conventions) for attributes. |
+| Description | map MAY change over the lifetime of the entity. MAY be empty. These attributes are not part of entity's identity. Follows OpenTelemetry [attribute definition](../common/README.md#attribute). SHOULD follow OpenTelemetry [semantic conventions](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/README.md) for attributes. |
## Minimally Sufficient Identity
diff --git a/specification/logs/api.md b/specification/logs/api.md
index 977770be6fb..66eb9c6b995 100644
--- a/specification/logs/api.md
+++ b/specification/logs/api.md
@@ -6,7 +6,7 @@ aliases: [bridge-api]
# Logs API
-**Status**: [Stable](../document-status.md), except where otherwise specified
+**Status**: [Stable](../document-status.md)
[Entity is defined here](../entities/data-model.md) |
-| Attributes | map\ MUST not change during the lifetime of the resource. Follows OpenTelemetry [Standard attribute definition](../common/README.md#standard-attribute). |
+| Attributes | map\ MUST not change during the lifetime of the resource. Follows OpenTelemetry [attribute definition](../common/README.md#attribute). |
## Identity
diff --git a/specification/resource/sdk.md b/specification/resource/sdk.md
index b7cb8cfa976..8a9a08b4cb0 100644
--- a/specification/resource/sdk.md
+++ b/specification/resource/sdk.md
@@ -13,7 +13,8 @@ For example, a process producing telemetry that is running in a
container on Kubernetes has a Pod name, it is in a namespace and possibly is
part of a Deployment which also has a name. All three of these attributes can be
included in the `Resource`. Note that there are certain
-["standard attributes"](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/resource/README.md) that have prescribed meanings.
+[attributes](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/resource/README.md)
+that have prescribed meanings.
The primary purpose of resources as a first-class concept in the SDK is
decoupling of discovery of resource information from exporters. This allows for
Table of Contents
+- [AnyValue](#anyvalue)
+ * [map](#mapstring-anyvalue)
- [Attribute](#attribute)
- * [Standard Attribute](#standard-attribute)
- * [Attribute Limits](#attribute-limits)
- + [Configurable Parameters](#configurable-parameters)
- + [Exempt Entities](#exempt-entities)
-- [Attribute Collections](#attribute-collections)
+ * [Attribute Collections](#attribute-collections)
+- [Attribute Limits](#attribute-limits)
+ * [Configurable Parameters](#configurable-parameters)
+ * [Exempt Entities](#exempt-entities)
Table of Contents
@@ -124,14 +124,6 @@ The API MUST accept the following parameters:
- [Attributes](./data-model.md#field-attributes) (optional)
- [Event Name](./data-model.md#field-eventname) (optional)
-**Status**: [Development](../document-status.md)
-
-The API SHOULD provide functionality for users to convert
-[Standard Attributes](../common/README.md#standard-attribute)
-so they can be used, or directly accept them, in the log signal.
-This allows the reuse of [Standard Attributes](../common/README.md#standard-attribute)
-across signals.
-
### Enabled
To help users avoid performing computationally expensive operations when
diff --git a/specification/logs/data-model.md b/specification/logs/data-model.md
index 807e5899aa1..6893df5c1cb 100644
--- a/specification/logs/data-model.md
+++ b/specification/logs/data-model.md
@@ -430,14 +430,15 @@ when it is used to represent an unspecified severity.
### Field: `Body`
-Type: [`any`](#type-any).
+Type: [`any`](#type-any) or [AnyValue](../common/README.md#anyvalue).
Description: A value containing the body of the log record. Can be for example
a human-readable string message (including multi-line) describing the event in
a free form or it can be a structured data composed of arrays and maps of other
-values. Body MUST support [`any` type](#type-any) to preserve the semantics of
-structured logs emitted by the applications. Can vary for each occurrence of the
-event coming from the same source. This field is optional.
+values. Body MUST support [AnyValue](../common/README.md#anyvalue)
+to preserve the semantics of structured logs emitted by the applications.
+Can vary for each occurrence of the event coming from the same source.
+This field is optional.
### Field: `Resource`
@@ -464,15 +465,12 @@ they all have the same value of `InstrumentationScope`. This field is optional.
### Field: `Attributes`
-Type: [`map