What changed in OpenTelemetry since you last looked
OpenTelemetry is three separately-versioned repositories, and none of them will tell you what moved since you last looked. This reads all three at every release: which attributes were renamed, which requirements appeared in a stable document, and which fields changed on the wire.
The conventions ship as one flat registry. These pull a single topic together — its attributes, its metrics, the spans that carry them, and the specification rules that bind them. Or search all four repositories at once.
new rulerequirementlogs/sdk.md#emit-a-logrecordMUST added: Enabled: If the Logger is not enabled (i.e. LoggerConfig.enabled is false), the log record MUST be dropped.
new rulerequirementresource/sdk.md#createMUST added: When both Entities and Attributes are provided in the create method, the system MUST behave as if a Resource is created with just Attributes and then merges with another Resource created with just Entities.
new rulerequirementresource/sdk.md#mergeMUST added: If either resource contains Entities then merge behavior with Entiites MUST be used, otherwise merge behavior without Entities MUST be used.
new rulerequirementresource/sdk.md#merge-behavior-with-entitiesMUST added: When either Resource contains entities, the merge operation MUST follow the resource data model's merge algorithm.
new rulerequirementresource/sdk.md#merge-behavior-with-entitiesMUST added: The resulting SchemaURL MUST match the behavior defined in the merge algorithm.
new rulerequirementresource/sdk.md#retrieve-attributesMUST added: When entities are enabled and present for the Resource, this list MUST include all attributes, including those associated with entities.
new rulerequirementdocs/specification.md#otlpgrpc-requestMUST added: The server MUST enforce a message size limit when receiving the request, including after decompression, to mitigate possible excessive memory usage caused by a misconfigured or malicious client sending an oversized requ...
new rulerequirementdocs/specification.md#otlpgrpc-requestMUST added: If the limit is exceeded, the gRPC server implementations MUST report a RESOURCE_EXHAUSTED code as a non-retryable error.
new rulerequirementdocs/specification.md#otlpgrpc-requestMUST NOT added: If the limit is exceeded, the client MUST NOT make the request and SHOULD record the fact that the request was discarded.
new rulerequirementdocs/specification.md#otlpgrpc-responseMUST added: The client MUST enforce a message size limit when receiving the response, including after decompression, to mitigate possible excessive memory usage caused by a misconfigured or malicious server. gRPC client implementat...
new rulerequirementdocs/specification.md#otlpgrpc-responseMUST added: If the limit is exceeded, the client MUST treat the response as a non-retryable error.
new rulerequirementdocs/specification.md#otlpgrpc-responseMUST added: The server MUST limit the size of the response message, including before compression, to avoid overwhelming the client.
rule droppedrequirementcontext/env-carriers.md#process-spawningMUST NOT removed: The language implementations MUST NOT handle spawning processes.
new rulerequirementcontext/env-carriers.md#propagator-mechanismsMUST NOT added: Language implementations MUST NOT spawn child processes as part of environment variable context propagation.
stabilitydocumentcontext/env-carriers.mdStatus changed from Beta to Release Candidate.
stabilitydocumentprofiles/data-format.mdStatus changed from Development to Alpha.
new rulerequirementcontext/env-carriers.md#propagator-mechanismsSHOULD added: Language implementations SHOULD document operational guidance, including initialization-time extraction, child process environment handling, and security considerations.
new rulerequirementtrace/sdk.md#getsamplingintentSHOULD added: The calling CompositeSampler SHOULD update the threshold of the outgoing TraceState, as described above.
new rulerequirementmetrics/api.md#bindMUST added: This API MUST accept the following parameter:
new rulerequirementmetrics/api.md#bindMUST added: Therefore, this API MUST be structured to accept a variable number of attributes, including none.
new rulerequirementmetrics/api.md#bindMUST added: This API MUST return a language-idiomatic type representing the instrument bound to those attributes.
new rulerequirementmetrics/api.md#bindMUST added: The returned bound instrument MUST support the instrument's core recording operation.
new rulerequirementmetrics/api.md#bindMUST added: If the existing instrument interface is reused, the Bind API MUST be documented to communicate to users that invoking attribute-bearing recording operations on the returned bound instrument negates the performance ben...
rule droppedrequirementcompatibility/prometheus_and_openmetrics.md#gauges-1MUST removed: Otherwise, it MUST be converted to a Prometheus Gauge.
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: The processor MUST bridge a LogRecord to a span event if and only if all of the following conditions are met:
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: If any of these conditions is not met, the processor MUST do nothing.
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: When a LogRecord is bridged, the processor MUST add exactly one span event with the following mapping:
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: the span event name MUST be the LogRecord's Event Name.
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: if the LogRecord has a Timestamp set, it MUST be used as the span event timestamp.
new rulerequirementlogs/sdk.md#event-to-span-event-bridgeMUST added: Otherwise, if the LogRecord has an ObservedTimestamp set, it MUST be used as the span event timestamp.
renumberedfieldopentelemetry.proto.profiles.v1development.Sample.attribute_indicesField number changed from 3 to 2. Every previously encoded message decodes wrongly.
renumberedfieldopentelemetry.proto.profiles.v1development.Sample.link_indexField number changed from 4 to 3. Every previously encoded message decodes wrongly.
renumberedfieldopentelemetry.proto.profiles.v1development.Sample.valuesField number changed from 2 to 4. Every previously encoded message decodes wrongly.
new rulerequirementconfiguration/data-model.md#environment-variable-substitutionMUST added: When PREFIX is absent or env, GENERIC-SUBSTITUTION MUST conform to ENV-SUBSTITUTION:
new rulerequirementtrace/api.md#concurrency-requirementsMUST added: TracerProvider - all methods MUST be documented that implementations need to be safe for concurrent use by default.
new rulerequirementtrace/api.md#concurrency-requirementsMUST added: Tracer - all methods MUST be documented that implementations need to be safe for concurrent use by default.
new rulerequirementtrace/api.md#concurrency-requirementsMUST added: Span - all methods MUST be documented that implementations need to be safe for concurrent use by default.
new rulerequirementtrace/api.md#concurrency-requirementsMUST added: Event - Events are immutable and MUST be safe for concurrent use by default.
new rulerequirementtrace/sdk.md#concurrency-requirementsMUST added: Tracer Provider - Tracer creation, ForceFlush and Shutdown MUST be safe to be called concurrently.
new rulerequirementlogs/api.md#concurrency-requirementsMUST added: LoggerProvider - all methods MUST be documented that implementations need to be safe for concurrent use by default.
new rulerequirementlogs/api.md#concurrency-requirementsMUST added: Logger - all methods MUST be documented that implementations need to be safe for concurrent use by default.
new rulerequirementlogs/sdk.md#concurrency-requirementsMUST added: LoggerProvider - Logger creation, ForceFlush and Shutdown MUST be safe to be called concurrently.
new rulerequirementlogs/sdk.md#concurrency-requirementsMUST added: Logger - all methods MUST be safe to be called concurrently.
new rulerequirementlogs/sdk.md#concurrency-requirementsMUST added: LogRecordExporter - ForceFlush and Shutdown MUST be safe to be called concurrently.
new rulerequirementlogs/sdk.md#emit-a-logrecordMUST added: Status: Development - If an Exception is provided, the SDK MUST by default set attributes from the exception on the LogRecord with the conventions outlined in the exception semantic conventions.
rule droppedrequirementlogs/data-model.md#type-mapstring-anyMUST removed: The implementation MUST by default ensure that the exported maps contain only unique keys.
rule droppedrequirementlogs/data-model.md#type-mapstring-anyMUST removed: If such option is provided, it MUST be documented that for many receivers, handling of maps with duplicate keys is unpredictable and it is the users' responsibility to ensure keys are not duplicate.
removedsectionlogs/data-model.md#definitions-used-in-this-documentSection "Definitions Used in this Document" removed.
rule droppedrequirementconfiguration/sdk-environment-variables.md#durationMUST removed: Any value that represents a duration MUST be an integer representing a number of milliseconds.
rule droppedrequirementconfiguration/sdk-environment-variables.md#durationMUST removed: The value is non-negative - if a negative value is provided, the implementation MUST generate a warning, gracefully ignore the setting and use the default value if it is defined.
rule droppedrequirementconfiguration/sdk-environment-variables.md#enumMUST removed: If a null object (empty, no-op) value is acceptable, then the enum value representing it MUST be "none".
rule droppedrequirementconfiguration/sdk-environment-variables.md#timeoutMUST removed: Any value that represents a timeout MUST be an integer representing a number of milliseconds.
rule droppedrequirementconfiguration/sdk-environment-variables.md#timeoutMUST removed: The value is non-negative - if a negative value is provided, the implementation MUST generate a warning, gracefully ignore the setting and use the default value if it is defined.
new rulerequirementconfiguration/common.md#durationMUST added: Any value that represents a duration MUST be an integer representing a number of milliseconds.
rule droppedrequirementcommon/README.md#attribute-collectionsMUST NOT removed: The keys in each such collection are unique, i.e. there MUST NOT exist more than one key-value pair with the same key.
rule droppedrequirementlogs/data-model.md#field-attributesMUST removed: The log attribute model MUST support any type, a superset of standard Attribute, to preserve the semantics of structured attributes emitted by the applications.
new rulerequirementcommon/README.md#attributeMUST added: The attribute value MUST be one of types defined in AnyValue.
new rulerequirementcommon/README.md#attribute-collectionsMUST added: Implementation MUST by default enforce that the exported attribute collections contain only unique keys.
new rulerequirementcommon/README.md#attribute-collectionsMUST added: If such option is provided, it MUST be documented that for many receivers, handling of maps with duplicate keys is unpredictable and it is the users' responsibility to ensure keys are not duplicate.
new rulerequirementcommon/README.md#attribute-limitsMUST added: Status: Development - if it is a byte array, if its length exceeds that limit (counting each byte as 1), SDKs MUST truncate that value, so that its length is at most equal to the limit,
removedmessageopentelemetry.proto.profiles.v1development.AggregationTemporalityenum removed from opentelemetry/proto/profiles/v1development/profiles.proto.
field removedfieldopentelemetry.proto.profiles.v1development.Profile.comment_strindicesField 7 (int32) removed.
field removedfieldopentelemetry.proto.profiles.v1development.ValueType.aggregation_temporalityField 3 (AggregationTemporality) removed.
renumberedfieldopentelemetry.proto.profiles.v1development.Profile.attribute_indicesField number changed from 12 to 11. Every previously encoded message decodes wrongly.
renumberedfieldopentelemetry.proto.profiles.v1development.Profile.dropped_attributes_countField number changed from 9 to 8. Every previously encoded message decodes wrongly.
renumberedfieldopentelemetry.proto.profiles.v1development.Profile.original_payloadField number changed from 11 to 10. Every previously encoded message decodes wrongly.
rule droppedrequirementlogs/sdk.md#loggerconfigMUST removed: The value of disabled MUST be used to resolve whether a Logger is Enabled.
new rulerequirementlogs/sdk.md#emit-a-logrecordMUST added: Status: Development Before processing a log record, the implementation MUST apply the filtering rules defined by the LoggerConfig (in case Enabled was not called prior to emitting the record):
new rulerequirementlogs/sdk.md#emit-a-logrecordMUST added: Minimum severity: If the log record's SeverityNumber is specified (i.e. not 0) and is less than the configured minimum_severity, the log record MUST be dropped.
new rulerequirementlogs/sdk.md#emit-a-logrecordMUST added: Trace-based: If trace_based is true, and if the log record has a SpanId and the TraceFlags SAMPLED flag is unset, the log record MUST be dropped.
new rulerequirementlogs/sdk.md#loggerconfigMUST added: If not explicitly set, the minimum_severity parameter MUST default to 0.
new rulerequirementlogs/sdk.md#loggerconfigMUST added: If a log record's SeverityNumber is specified (i.e. not 0) and is less than the configured minimum_severity, the log record MUST be dropped by the Logger.
new rulerequiremententities/entity-propagation.md#character-encodingMUST added: All attribute values MUST be considered strings and characters outside the baggage-octet range MUST be percent-encoded following the W3C Baggage specification.
new rulerequiremententities/entity-propagation.md#character-encodingMUST added: The reserved characters {}[]@;,= MUST be percent-encoded when they appear literally in attribute values:
new rulerequiremententities/entity-propagation.md#specifying-entity-information-via-an-environment-variableMUST added: The SDK that has access to environment variables MUST provide an EnvEntityDetector which will use the OTEL_ENTITIES environment variable to discover and associate defined entities with the resource.
new rulerequiremententities/entity-propagation.md#validation-requirementsMUST NOT added: Entity type MUST NOT be empty and MUST match the pattern [a-zA-Z][a-zA-Z0-9.-]
new rulerequiremententities/entity-propagation.md#validation-requirementsMUST added: At least one identifying attribute MUST be present in the {...} block
new rulerequiremententities/entity-propagation.md#validation-requirementsMUST NOT added: Attribute keys MUST NOT be empty and SHOULD follow OpenTelemetry semantic conventions
rule droppedrequirementsdk_exporters/prometheus.md#configurationMUST removed: The option MAY be named without_units, and MUST be false by default.
rule droppedrequirementsdk_exporters/prometheus.md#configurationMUST removed: The option MAY be named withouttypesuffix, and MUST be false by default.
strengthrequirementcompatibility/prometheus_and_openmetrics.md#metric-attributesMUST relaxed to SHOULD: Discouraged characters SHOULD be replace with the `` character.
strengthrequirementcompatibility/prometheus_and_openmetrics.md#metric-attributesMUST relaxed to SHOULD: Multiple consecutive ` characters SHOULD be replaced with a single ` character.
strengthrequirementcompatibility/prometheus_and_openmetrics.md#metric-metadata-1MUST relaxed to SHOULD: Discouraged characters in the metric name SHOULD be replaced with the `` character by default, aiming for compatibility with Prometheus conventions.
strengthrequirementcompatibility/prometheus_and_openmetrics.md#metric-metadata-1MUST relaxed to SHOULD: Multiple consecutive ` characters SHOULD be replaced with a single _` character.
new rulerequirementtrace/sdk.md#enabledMUST added: Enabled MUST return false when either:
new rulerequirementtrace/sdk.md#getsamplingintentMUST NOT added: Note: ComposableSamplers MUST NOT modify the parameters passed to delegate GetSamplingIntent methods, as they are considered read-only state.
new rulerequirementtrace/sdk.md#getsamplingintentMUST NOT added: ComposableSamplers MUST NOT modify the OpenTelemetry TraceState (i.e., the ot sub-key of TraceState).
new rulerequirementtrace/sdk.md#getsamplingintentMUST added: The calling CompositeSampler SHOULD update the threshold of the outgoing TraceState (unless !threshold_reliable) and that the explicit randomness values MUST not be modified.
rule droppedrequirementtrace/tracestate-probability-sampling.md#consistent-sampling-decision-approachMUST removed: If the current sampling stage applies a greater threshold value than any stage before, it MUST update (increase) the threshold correspondingly by re-encoding the OpenTelemetry TraceState value.
rule droppedrequirementtrace/tracestate-probability-sampling.md#downstream-samplersMUST NOT removed: If the chosen sampling probability is 1, the sampler MUST NOT modify an existing th sub-key value, nor set a th sub-key value.
rule droppedrequirementcompatibility/prometheus_and_openmetrics.md#instrumentation-scopeMUST removed: Labels on otelscopeinfo metric points other than otelscopename and otelscopeversion, MUST be added as scope attributes to the scope with the matching name and version.
rule droppedrequirementcompatibility/prometheus_and_openmetrics.md#instrumentation-scope-1MUST removed: Scope attributes MUST also be added as labels following the rules described in the Metric Attributes section below.
rule droppedrequirementcompatibility/prometheus_and_openmetrics.md#instrumentation-scope-1MUST removed: Prometheus exporters MUST add the scope name as the otelscopename label and the scope version as the otelscopeversion label on all metric points by default, based on the scope the original data point was nested in.
strengthrequirementcompatibility/prometheus_and_openmetrics.md#instrumentation-scopeSHOULD strengthened to MUST: Labels with otelscope prefix MUST be dropped from all metric points and used as the Instrumentation Scope name (otelscopename), version (otelscopeversion), schema URL (otelscopeschemaurl), at...
new rulerequirementcommon/instrumentation-scope.md#instrumentation-scopeSHOULD added: This tuple SHOULD uniquely identify the logical unit of software that emits the telemetry.
new rulerequirementcommon/instrumentation-scope.md#instrumentation-scopeSHOULD added: The instrumentation scope's name SHOULD be specified to identify the InstrumentationScope name.
new rulerequirementlogs/sdk.md#emit-a-logrecordSHOULD added: If Observed Timestamp is unspecified, the implementation SHOULD set it equal to the current time.
new rulerequirementresource/sdk.md#resource-detector-nameSHOULD added: Resource detectors SHOULD have a unique name for reference in configuration.
new rulerequirementresource/sdk.md#resource-detector-nameSHOULD added: Names SHOULD be snake case and consist of lowercase alphanumeric and _ characters, which ensures they conform to declarative configuration property name requirements.
new rulerequirementresource/sdk.md#resource-detector-nameSHOULD added: Resource detector names SHOULD reflect the root namespace of attributes they populate.
new rulerequirementresource/sdk.md#resource-detector-nameSHOULD added: Resource detectors which populate attributes from multiple root namespaces SHOULD choose a name which appropriately conveys their purpose.
new rulerequirementresource/sdk.md#resource-detector-nameSHOULD added: An SDK which identifies multiple resource detectors with the same name SHOULD report an error.
rule droppedrequirementtrace/sdk.md#requirements-for-traceidratiobased-sampler-algorithmMUST removed: The sampling algorithm MUST be deterministic.
rule droppedrequirementtrace/sdk.md#requirements-for-traceidratiobased-sampler-algorithmMUST removed: A trace identified by a given TraceId is sampled or not independent of language, time, etc. To achieve this, implementations MUST use a deterministic hash of the TraceId when computing the sampling decision.
rule droppedrequirementtrace/sdk.md#requirements-for-traceidratiobased-sampler-algorithmMUST removed: A TraceIdRatioBased sampler with a given sampling rate MUST also sample all traces that any TraceIdRatioBased sampler with a lower sampling rate would sample.
new rulerequirementlogs/sdk.md#enabled-1MUST NOT added: Any modifications to parameters inside Enabled MUST NOT be propagated to the caller.
History starts at semantic conventions v1.30.0, specification v1.42.0, otlp v1.4.0. Going further back would mean diffing across schema and layout changes that would report churn the projects never made. The GenAI conventions have never cut a release, so they are tracked from their default branch and dated rather than versioned.