v1.0.0-beta.10
Pre-releaseChanged
-
*Createclasses are now@internaland hidden from the public library.
They were internal by doc-comment convention only; the barrel exported them,
soAttributesCreate.create()etc. were callable by any consumer — an open
factory-bypass door, contradicting the beta.8/9 removal of factory cheat
paths. The analyzer now rejects outside-package use
(invalid_use_of_internal_member). Factories and same-package code are
unaffected. Consumers constructing objects must go throughOTelAPIor the
installedOTelFactory. Covers all 29*Createclasses, including the
newCompositePropagatorCreate. -
Breaking: the semantic-convention enums are now generated from the
OpenTelemetry registry with OTel Weaver, one file per registry
namespace (#50, #51). The hand-writtensemantics.dart,
semantic_values.dart,semantic_metrics.dart,semantic_events.dart,
gen_ai_semantics.dart, andui_semantics.dartare gone; generated
files live underlib/src/api/semantics/semconv/(90 attribute
namespaces, 931 attributes, 167 value enums, 29 metric namespaces with
533 metrics, 14 event namespaces with 32 events, and 24 entity
namespaces with 64 entities). Generated from
semantic-conventions
v1.43.0-21-g436fa257(commit436fa257, schema1.44.0-unreleased).
Regenerate withtool/semconv/generate.sh; verify freshness with
tool/semconv/generate.sh --check. There is no compatibility layer —
the tables below are the migration guide. -
Breaking: file restructure. Every old semantics file is replaced:
Old file Replacement semantics/semantics.dartsemantics/semantics_base.dart(interfaces) +semantics/semconv/<ns>.dartper namespace +semantics/http_header_attribute.dartsemantics/semantic_values.dartvalue enums live beside their attribute in semconv/<ns>.dartsemantics/semantic_metrics.dartsemconv/metrics/<ns>_metrics.dartper namespacesemantics/semantic_events.dartsemconv/events/<ns>_events.dartper namespacesemantics/gen_ai_semantics.dartsemconv/gen_ai.dart(wholly deprecated, see below)semantics/ui_semantics.dartsemantics/rum.dart(wholly deprecated, see below)semantics/navigation_action.dartsemantics/rum.dartsemantics/lifecycle_state.dartsemantics/rum.dart -
Breaking: attribute-key enums are named after their registry
namespace, with anAttributessuffix only where the bare name
collides withdart:core/dart:io/Flutter-widgets types. Renames
(everything not listed keeps its name and is regenerated in place):Old enum New enum DatabaseDbKubernetesK8sHardwareHw(all keys change too — see Fixed)OperatingSystemOsRPCRpcGraphQLGraphqlCloudEventsCloudeventsComputeUnitContainerAttributesErrorResourceErrorAttributesEventResourceEventAttributesExceptionResourceExceptionAttributesFileResourceFileAttributesProcessResourceProcessAttributesServerResourceServerTelemetrySDK,TelemetryDistroTelemetry(merged)ComputeInstancemerged into Host(same member names)SourceCodemerged into Code(same member names)GenAI,GenAiGenAi(merged, deprecated — see below)EnvironmentDeployment.deploymentEnvironment(@Deprecated)Generalsplit: Service.serviceName/serviceVersion,Telemetry.telemetrySdk*Versionremoved (see Removed) -
Breaking: member identifiers are the camelCase of the full attribute
id (tokens split on./_; single registry tokens keep their
casing, e.g.replicaset,cloudevents,launchtype). Key strings
are unchanged unless listed under Fixed. Renamed members:Http:Old New requestMethodhttpRequestMethodrequestMethodOriginalhttpRequestMethodOriginalrequestResendCounthttpRequestResendCountresponseStatusCodehttpResponseStatusCoderequestSizehttpRequestSizerequestBodySizehttpRequestBodySizeresponseSizehttpResponseSizeresponseBodySizehttpResponseBodySizeGenAi(every member also@Deprecated, see below):Old New systemgenAiSystemoperationNamegenAiOperationNamerequestModelgenAiRequestModelrequestMaxTokensgenAiRequestMaxTokensrequestTemperaturegenAiRequestTemperaturerequestTopPgenAiRequestTopPrequestTopKgenAiRequestTopKrequestFrequencyPenaltygenAiRequestFrequencyPenaltyrequestPresencePenaltygenAiRequestPresencePenaltyrequestStopSequencesgenAiRequestStopSequencesresponseIdgenAiResponseIdresponseModelgenAiResponseModelresponseFinishReasonsgenAiResponseFinishReasonsusageInputTokensgenAiUsageInputTokensusageOutputTokensgenAiUsageOutputTokensKubernetes→K8s(single-token registry words):Old New k8sReplicaSetUid/k8sReplicaSetNamek8sReplicasetUid/k8sReplicasetNamek8sStatefulSetUid/k8sStatefulSetNamek8sStatefulsetUid/k8sStatefulsetNamek8sDaemonSetUid/k8sDaemonSetNamek8sDaemonsetUid/k8sDaemonsetNamek8sCronJobUid/k8sCronJobNamek8sCronjobUid/k8sCronjobNameHardware→Hw:hardwareId→hwId,hardwareName→hwName,
hardwareParent→hwParent,hardwareSerialNumber→
hwSerialNumber,hardwareType→hwType,hardwareVendor→
hwVendor,hardwareModel→hwModel(key strings change too — see
Fixed).CloudEvents→Cloudevents:cloudEventsEventId→
cloudeventsEventId,cloudEventsEventSource→
cloudeventsEventSource,cloudEventsEventSpecVersion→
cloudeventsEventSpecVersion,cloudEventsEventSubject→
cloudeventsEventSubject,cloudEventsEventType→
cloudeventsEventType.TelemetrySDK/TelemetryDistro→Telemetry:sdkName→
telemetrySdkName,sdkLanguage→telemetrySdkLanguage,
sdkVersion→telemetrySdkVersion,distroName→
telemetryDistroName,distroVersion→telemetryDistroVersion.Aws:awsEcsLaunchType→awsEcsLaunchtype.All other attribute-key enums already followed the rule — their
members are unchanged. -
Breaking: metric enum members follow the same rule — camelCase of
the full metric name instead of the old namespace-stripped short form.
Every member of the 15 pre-existing metric enums gains its namespace
prefix; the old name was exactly the new name minus that prefix (e.g.
CicdMetric.pipelineRunActive→CicdMetric.cicdPipelineRunActive,
HttpMetric.serverRequestDuration→
HttpMetric.httpServerRequestDuration,K8sMetric.podCpuUsage→
K8sMetric.k8sPodCpuUsage). -
Breaking:
SemanticEventsplit into per-namespace event enums
implementing the unchangedOTelEventinterface:Old SemanticEventmemberNew exceptionExceptionEvent.exceptionfeatureFlagEvaluationFeatureFlagEvent.featureFlagEvaluationbrowserWebVitalBrowserEvent.browserWebVitalazureResourceLogAzureEvent.azureResourceLoggenAiEvaluationResultGenAiEvent.genAiEvaluationResultfaasInvocationExceptionFaasEvent.faasInvocationExceptionhttpClientRequestExceptionHttpEvent.httpClientRequestExceptionhttpServerRequestExceptionHttpEvent.httpServerRequestExceptionrpcClientCallExceptionRpcEvent.rpcClientCallExceptionrpcServerCallExceptionRpcEvent.rpcServerCallExceptiongenAiClientInferenceOperationDetailsGenAiEvent.genAiClientInferenceOperationDetailsmessagingCreateExceptionMessagingEvent.messagingCreateExceptionmessagingSendExceptionMessagingEvent.messagingSendExceptionmessagingProcessExceptionMessagingEvent.messagingProcessExceptionmessagingReceiveExceptionMessagingEvent.messagingReceiveExceptionmessagingSettleExceptionMessagingEvent.messagingSettleException -
Breaking: value-enum renames (name = PascalCase of the full
attribute id):AwsEcsLaunchType→AwsEcsLaunchtype,HardwareType
→HwType,MessagingOperation→MessagingOperationType.DbSystem
still exists for the deprecateddb.system(now@Deprecated); the
current attributedb.system.namegets the newDbSystemName.
Value-enum member ids follow the registry member ids with Dart
reserved words$-escaped, which renames two members:
SystemPagingDirection.pageIn→in$,SystemPagingDirection.pageOut
→out(emitted values unchanged). The deprecated barestate
attribute's value enum is namedStateValueto avoid colliding with
Flutter'sState. -
Breaking: legacy
az.*keys moved out ofAzure— the registry
files deprecated ids by their real prefix, soAzure.azNamespaceand
Azure.azServiceRequestIdare nowAz.azNamespaceand
Az.azServiceRequestId(both@Deprecated) insemconv/az.dart.
Deprecated-only legacy roots each get their own file the same way:
az.dart,net.dart,message.dart,pool.dart, andother.dart
(the dotless legacystatekey). -
HttpHeaderAttributenow extendsOTelSemantic, so request/response
header template attributes can be used directly as keys in
attributesFromSemanticMap/attributesOf.
Added
-
Full attribute-registry coverage (#51): 24 namespaces that were never
modeled, including theapp.*namespace andappentity from the
issue —App,Aspnetcore,Cpu,Cpython,Disk,Dotnet,
Go,Jsonrpc,Jvm,Linux,Mainframe,Mcp,Nfs,
Nodejs,OncRpc,Openai,Openshift,Oracle(oracle.db.*,
release candidate),OracleCloud,Pprof,SecurityRule,Signalr,
V8js,Zos— plus complete member sets for every previously
partial namespace. -
Entity enums (#51):
<Ns>Entityenums for all 64 registry
entities (24 namespaces), each member carrying the entity type string
plusidentifying/descriptivelists wired to the attribute-key
enums — e.g.AppEntity.appidentifies byApp.appBuildId. New
OTelEntityinterface insemantics_base.dart. -
14 new metric namespaces (
aspnetcore,azure,cpu,cpython,
dotnet,go,hw,jvm,kestrel,nfs,nodejs,openshift,
signalr,v8js) alongside the regenerated 15. -
OTelSemanticIntValuefor int-valued registry value enums
(cpython.gc.generation,rpc.grpc.status_code). -
SemconvRegistry— a generated index of every semconv enum
(allAttributeEnums,allValueEnums,allIntValueEnums,
allMetricEnums,allEventEnums,allEntityEnums) plus the pinned
registry version/commit. Powers package-wide invariant tests
(duplicate-key detection, key-format checks). -
Every non-stable enum member now carries a
Stability:doc line
(development,release_candidate,alpha,experimental), and
every registry-deprecated attribute carries@Deprecatedwith the
registry's replacement guidance. -
tool/semconv/generate.sh+ checked-in Weaver templates
(tool/semconv/templates/registry/dart[_test]/), pinned to the same
otel/weaver:v0.24.2container digest the semantic-conventions repo
pins. Also generates audit tests asserting every key, value, metric,
event, and entity against the registry, plus source audits for
@Deprecated/Stability:annotations. -
NonRecordingSpanandOTelAPI.nonRecordingSpan(SpanContext)— the
spec's "Wrapping a SpanContext in a Span" operation: the wrapped
context is returned unchanged,isRecordingisfalse, and all other
operations are no-ops (#40). -
Global
TextMapPropagator—OTelAPI.textMapPropagatorgetter/setter,
implementing the spec's Global Propagators requirement: "The OpenTelemetry
API MUST provide a way to obtain a propagator for each supported Propagator
type" (TextMapPropagatorbeing the single supported type today). The
global is non-generic (TextMapPropagator<dynamic, dynamic>) and, like
every other API object, routed throughOTelFactory, so a replacement
factory can substitute its own implementation. Isolate-local;
OTelAPI.reset()restores the no-op default (#42). -
OTelAPI.compositePropagator/OTelFactory.compositePropagator—
factory-routed construction forCompositePropagator, previously the
only instantiable API object built by direct construction; its public
constructor is now private (Breaking, construct via the factory)
(#42). -
NoopTextMapPropagator— the default value of the global, satisfying
"The OpenTelemetry API MUST use no-op propagators unless explicitly
configured otherwise":injectwrites nothing andextractreturns the
passedContextunchanged (#42).
Deprecated
- All vendor/RUM enums — they are not OpenTelemetry semantic
conventions and will be removed from this package (future home: the
Flutter RUM layer). Moved tosemantics/rum.dart, names/keys/members
unchanged:AppLifecycleStates,AppLifecycleSemantics,
AppStartType,AppInfoSemantics,DeviceSemantics,
BatterySemantics,NavigationSemantics,InteractionType,
InteractionSemantics,PerformanceSemantics,ErrorSemantics,
NetworkSemantics,RumSessionView,NavigationAction,
LifecycleState. - All of
GenAi— thegen_ai.*conventions moved upstream to
semantic-conventions-genai
and are deprecated in the core registry; every member is annotated
accordingly. - Registry-deprecated attributes that previously looked current are now
@Deprecated, e.g.Db.dbSystem/dbConnectionString/dbUser/
dbName/dbStatement/dbOperation,Deployment.deploymentEnvironment,
Otel.otelLibraryName/otelLibraryVersion,Enduser.*,
EventAttributes.eventName,Code.codeNamespace,
FeatureFlag.featureFlagVariant, the legacynet.*/az.*/http.*
keys, and the deprecatedDbSystemvalue enum — plus every other
deprecated:entry in the registry.
Removed
-
Members that do not exist in the attribute registry (not even as
deprecated):Removed Use instead Http.connectionStateHttp.httpConnectionState(was a duplicate key)Database.dbClientConnectionUsedStateDb.dbClientConnectionStateMessaging.messagingDestinationMessaging.messagingDestinationNameMessaging.messagingDestinationKindremoved from the spec, no replacement Messaging.messagingTempDestinationMessaging.messagingDestinationTemporaryMessaging.messagingProtocolNetwork.networkProtocolNameMessaging.messagingProtocolVersionNetwork.networkProtocolVersionElasticsearch.elasticsearchClusterNameDb.dbNamespaceElasticsearch.elasticsearchNodeVersionremoved, no replacement User.userSessionSession.sessionIdComputeUnit.containerImageTagContainerAttributes.containerImageTagsGeneral.telemetryAutoVersionTelemetry.telemetryDistroVersionSystem.systemDiskIoDirectionDisk.diskIoDirectionAppInfoSemanticsvendor keys as semconvofficial identity is App.appBuildId/Artifact.* -
Value-enum members that do not exist in the registry:
TelemetrySdkLanguage.dart(note:dartis missing from the
registry'stelemetry.sdk.languagewell-known values — an upstream
semconv gap; SDKs should keep emitting the literaldart),
CloudPlatform.herokuDyno,NetworkConnectionType.mobile,
ProfileFrameType.java/nodejs/python, and
SystemMemoryState.slabReclaimable/slabUnreclaimable(slab states
moved upstream tosystem.memory.linux.slab.state). -
Versionenum —schema.urlis not a registry attribute; schema URLs
belong on providers/InstrumentationScope. -
General,SemanticEvent, and the duplicateGenAIenum (see the
rename/split tables above). -
genAiSpanName()— not a convention; compose
'<operation> <model>'directly.
Fixed
-
Wire format — emitted attribute keys change (#50, #51). These fix
the strings actually emitted, so backends keying on the spec names
will now match:Member (old) Old emitted key Correct key Kubernetes.k8sResourcepaceNamek8s.Resourcepace.nameK8s.k8sNamespaceName→k8s.namespace.name(#50)SourceCode.codeResourcepacecode.ResourcepaceCode.codeNamespace→code.namespace(#50; itself deprecated →code.function.name)Hardware.*(7 members)hardware.*Hw.*→hw.*FeatureFlag.featureFlagProviderNamefeature_flag.provider_namesame identifier, now feature_flag.provider.nameCloudPlatform.azureVm/azureAks/azureFunctions/azureAppService/azureOpenshift/azureContainerApps/azureContainerInstancesazure_vmetc.same identifiers, now the registry's dotted values azure.vm,azure.aks,azure.functions,azure.app_service,azure.openshift,azure.container_apps,azure.container_instancesGenAiTokenType.completioncompletionsame identifier ( @Deprecated), now emitsoutput; new memberGenAiTokenType.output -
Breaking: With only the API installed (no SDK),
startSpan/createSpan
now follow trace/api.md's "Behavior of the API in the absence of an
installed SDK": the returned span is non-recording (isRecordingis
falseand every mutating operation is a no-op) and carries the
SpanContextfrom the parentContext— explicit or implicit —
unchanged; when the context has no span, it carries an empty
SpanContext(all-zero trace/span IDs, unsampled flags). Previously
the API minted random valid IDs and returned recording spans (#40).
SDK span creation is unaffected: the no-op behavior applies only when
the installed factoryisAPIFactory. -
Baggagenow follows the spec for values, names, and no-SDK use.
Per the Baggage API spec, values are any valid UTF-8 string — the empty
string is accepted (previouslyArgumentError) and survivesSet/Get
and bothfromJsonpaths (previously dropped). Invalid (empty) names are
ignored with a warning instead of throwing.copyWith/copyWithout/
copyWithBaggagework without an installed SDK (previouslyStateError),
per "The Baggage API MUST be fully functional in the absence of an
installed SDK." -
TraceState.put/removenever throw. Per the trace API spec,
mutating operations validate input and "MUST NOT returnTraceState
containing invalid data" while following the error-handling guidelines —
invalid keys/values are now ignored with a warning (previously
ArgumentError), and both operations work without an installed SDK
(previouslyStateError). -
Provider accessors use safe defaults instead of throwing. Per the
trace API spec, an invalid name must return "a working Tracer
implementation... as a fallback rather than returning null or throwing an
exception":OTelAPI.tracerProvider('')/meterProvider('')/
loggerProvider('')now warn and return the global default (previously
ArgumentError), andgetTracer/getMeter/getLoggerafter
provider shutdown warn and return a no-op instance (previously
StateError).