dartastic_opentelemetry_api
Dartastic.io's OpenTelemetry API for Dart following the OpenTelemetry specification. Supports all platforms including web.
0.10.0
74K downloads/mo
#1253 most downloaded on pub.dev
MindfulSoftwareLLC/dartastic_opentelemetry_api
What this package is like to depend on
Last release today
23 Aug 2026
Release timing varies
gaps range from 1 weeks to 5 months
Nearly every release is documented
notes for 12 of 12 stable releases
1 version withdrawn
withdrawn after publishing
1 years old
27 releases · first in 2025
21 releases in the last 12 months
see the full history below
Release timeline
27 releases · May 2025 to Aug 2026Releases
latest 27-
1.0.0-rc.223 Aug 2026 pre-releaseRelease notes
Open source →Added
OTelAPI.setErrorHandler— a user-configurable global error handler
(api#94). Internal misuse reports route through it instead of throwing;
the default handler logs viaOTelLogand never throws. A user-installed
handler that throws propagates deliberately (strict mode), per
error-handling.md. The handler is factory-held state:OTelFactory
carries the installed handler and an overridabledefaultErrorHandler
for SDK factories, and a handler installed before any factory exists
is buffered and adopted at factory installation.Context.runIsolate
re-installs the parent's handler inside the child isolate (handlers
are copied; capture aSendPortto aggregate reports across isolates
— an unsendable handler degrades to the child default and is
reported).
Fixed (spec compliance)
Span.end()no longer promotes status from Unset to Ok (api#60).
UnsetstaysUnset; analysis tools can no longer be misled by
fabricated Ok statuses. The deprecatedspanStatusparameter still
flows through thesetStatusrules when passed.CompositePropagator.extractwalks propagators in the order they were
specified (api#76), matching inject and every other OpenTelemetry SDK
(was reversed, so the last-registered propagator no longer wins extract).Context.withSpanContextreturns a derived Context instead of throwing
ArgumentErrorwhen the context already holds a span from a different
trace (api#77) — a routine situation during extraction.
Added
-
Semantic conventions regenerated from registry v1.44.0 (previously
v1.43.0-21-g436fa257). Additive only, per the VERSIONING.md policy: 47
new identifiers, no renames and no removals.The substantial addition is the complete
browser.web_vital.*set —
name,value,delta,id,ratingandnavigation_type— together
with their value enums:cls,lcp,fcp,inp,ttfband the
obsoletedfid;good/needs-improvement/poor; and the six
navigation types (navigate,reload,back-forward,
back-forward-cache,prerender,restore). Web-vitals instrumentation
now has registry names to emit against instead of inventing its own.Also new:
browser.platform,hw.errorsandhw.status,
k8s.node.filesystem.inode.count/.free, and thescaleway_cloud
andscaleway_cloud_computemembers. -
lib/src/api/semantics/candidates/— a home for attribute keys that are
not yet in the registry, staged for upstream contribution, exported from
the package barrel and marked@experimental.This revisits the rc.1 position that "the API package now contains only
registry conventions". That rule was right about the problem — a private
dialect masquerading as OpenTelemetry — but it left no path for the
conventions we want to propose, which the semantic-conventions CONTRIBUTING
guide asks be "prototyped in the corresponding instrumentation(s)" first.
Candidates are kept in a separate directory, under a separate stability
promise, so a consumer can always tell a published convention from a
proposal.Candidates are unstable in identity but deprecation-cycled: a renamed,
reshaped or rejected candidate is@Deprecated, pointing at its
replacement, for a release before it is removed — the same cycle the
vendor/RUM enums completed. When one is accepted upstream it reappears in
generatedsemconv/output and the candidate is deprecated in its favor.Staged:
app.start.type(cold/warm/hot),app.launch.id,
app.screen.previous_id,app.screen.previous_name,
app.gesture.direction,app.gesture.delta.x,app.gesture.delta.y,
device.battery.level,device.battery.state,device.battery.save_mode,
device.emulator, andbrowser.languages. -
doc/SEMCONV_CANDIDATES.md— the disposition of all 116 identifiers
removed in rc.1. Most should return as registry conventions rather than
candidates: the registry has since gainedapp.crash,app.jank,
app.screen.click,app.widget.click,device.app.lifecycle,
session.start/session.endandbrowser.web_vital.*, which cover the
bulk of the removed RUM surface. The document maps each removal to its
registry replacement, to a candidate, or to a recorded reason for dropping
it.
Release notes
Open source →Added
OTelAPI.setErrorHandler— a user-configurable global error handler (api#94). Internal misuse reports route through it instead of throwing; the default handler logs viaOTelLogand never throws. A user-installed handler that throws propagates deliberately (strict mode), per error-handling.md. The handler is factory-held state:OTelFactorycarries the installed handler and an overridabledefaultErrorHandlerfor SDK factories, and a handler installed before any factory exists is buffered and adopted at factory installation.Context.runIsolatere-installs the parent's handler inside the child isolate (handlers are copied; capture aSendPortto aggregate reports across isolates — an unsendable handler degrades to the child default and is reported).
Fixed (spec compliance)
Span.end()no longer promotes status from Unset to Ok (api#60).UnsetstaysUnset; analysis tools can no longer be misled by fabricated Ok statuses. The deprecatedspanStatusparameter still flows through thesetStatusrules when passed.CompositePropagator.extractwalks propagators in the order they were specified (api#76), matching inject and every other OpenTelemetry SDK (was reversed, so the last-registered propagator no longer wins extract).Context.withSpanContextreturns a derived Context instead of throwingArgumentErrorwhen the context already holds a span from a different trace (api#77) — a routine situation during extraction.
Added
-
Semantic conventions regenerated from registry v1.44.0 (previously v1.43.0-21-g436fa257). Additive only, per the VERSIONING.md policy: 47 new identifiers, no renames and no removals.
The substantial addition is the complete
browser.web_vital.*set —name,value,delta,id,ratingandnavigation_type— together with their value enums:cls,lcp,fcp,inp,ttfband the obsoletedfid;good/needs-improvement/poor; and the six navigation types (navigate,reload,back-forward,back-forward-cache,prerender,restore). Web-vitals instrumentation now has registry names to emit against instead of inventing its own.Also new:
browser.platform,hw.errorsandhw.status,k8s.node.filesystem.inode.count/.free, and thescaleway_cloudandscaleway_cloud_computemembers. -
lib/src/api/semantics/candidates/— a home for attribute keys that are not yet in the registry, staged for upstream contribution, exported from the package barrel and marked@experimental.This revisits the rc.1 position that "the API package now contains only registry conventions". That rule was right about the problem — a private dialect masquerading as OpenTelemetry — but it left no path for the conventions we want to propose, which the semantic-conventions CONTRIBUTING guide asks be "prototyped in the corresponding instrumentation(s)" first. Candidates are kept in a separate directory, under a separate stability promise, so a consumer can always tell a published convention from a proposal.
Candidates are unstable in identity but deprecation-cycled: a renamed, reshaped or rejected candidate is
@Deprecated, pointing at its replacement, for a release before it is removed — the same cycle the vendor/RUM enums completed. When one is accepted upstream it reappears in generatedsemconv/output and the candidate is deprecated in its favor.Staged:
app.start.type(cold/warm/hot),app.launch.id,app.screen.previous_id,app.screen.previous_name,app.gesture.direction,app.gesture.delta.x,app.gesture.delta.y,device.battery.level,device.battery.state,device.battery.save_mode,device.emulator, andbrowser.languages. -
doc/SEMCONV_CANDIDATES.md— the disposition of all 116 identifiers removed in rc.1. Most should return as registry conventions rather than candidates: the registry has since gainedapp.crash,app.jank,app.screen.click,app.widget.click,device.app.lifecycle,session.start/session.endandbrowser.web_vital.*, which cover the bulk of the removed RUM surface. The document maps each removal to its registry replacement, to a candidate, or to a recorded reason for dropping it.
-
1.0.0-rc.118 Jul 2026 pre-releaseRelease notes
Open source →Removed
- Breaking: the deprecated vendor/RUM enums are removed (deprecated
with notice in 1.0.0-beta.10):AppLifecycleStates,
AppLifecycleSemantics,AppStartType,AppInfoSemantics,
DeviceSemantics,BatterySemantics,NavigationSemantics,
InteractionType,InteractionSemantics,PerformanceSemantics,
ErrorSemantics,NetworkSemantics,RumSessionView,
NavigationAction, andLifecycleState(semantics/rum.dartis
gone). They are not OpenTelemetry semantic conventions and so do not
belong in this package;flutterrific_opentelemetrydefines its own
Flutter conventions for what the registry does not yet cover. The API
package now contains only registry conventions.
Added
- Semantic-conventions versioning policy in VERSIONING.md: within a
major version, registry regenerations are additive and deprecating
only; identifier- or wire-affecting registry changes batch into the
next major; spec-fidelity string corrections are bug fixes with a
CHANGELOG wire-format table.
Changed
- Breaking:
APIObservableResultis now an abstract interface. The
API-side implementation was unconstructible (private constructor, no
factory) so nothing could have used it; SDKs implement the interface,
asdartastic_opentelemetryalready does.
Fixed
Attributes.ofno longer throws aTypeErrorwhen a map value is an
untyped list (List<Object>/List<dynamic>). Lists are now
element-checked likeAttributes.fromJson: homogeneous
string/bool/int/double lists convert, mixed numeric lists promote to
List<double>, and unsupported element types are warned and ignored
per the OTel specification.
Release notes
Open source →Removed
- Breaking: the deprecated vendor/RUM enums are removed (deprecated
with notice in 1.0.0-beta.10):
AppLifecycleStates,AppLifecycleSemantics,AppStartType,AppInfoSemantics,DeviceSemantics,BatterySemantics,NavigationSemantics,InteractionType,InteractionSemantics,PerformanceSemantics,ErrorSemantics,NetworkSemantics,RumSessionView,NavigationAction, andLifecycleState(semantics/rum.dartis gone). They are not OpenTelemetry semantic conventions and so do not belong in this package;flutterrific_opentelemetrydefines its own Flutter conventions for what the registry does not yet cover. The API package now contains only registry conventions.
Added
- Semantic-conventions versioning policy in VERSIONING.md: within a major version, registry regenerations are additive and deprecating only; identifier- or wire-affecting registry changes batch into the next major; spec-fidelity string corrections are bug fixes with a CHANGELOG wire-format table.
Changed
- Breaking:
APIObservableResultis now an abstract interface. The API-side implementation was unconstructible (private constructor, no factory) so nothing could have used it; SDKs implement the interface, asdartastic_opentelemetryalready does.
Fixed
Attributes.ofno longer throws aTypeErrorwhen a map value is an untyped list (List<Object>/List<dynamic>). Lists are now element-checked likeAttributes.fromJson: homogeneous string/bool/int/double lists convert, mixed numeric lists promote toList<double>, and unsupported element types are warned and ignored per the OTel specification.
- Breaking: the deprecated vendor/RUM enums are removed (deprecated
-
1.0.0-beta.4-wip09 May 2026 pre-release withdrawnNothing published for this version
-
1.0.0-beta.1018 Jul 2026 pre-releaseRelease notes
Open source →Changed
-
*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).
Release notes
Open source →Changed
-
*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-written
semantics.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-conventionsv1.43.0-21-g436fa257(commit436fa257, schema1.44.0-unreleased). Regenerate withtool/semconv/generate.sh; verify freshness withtool/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 an
Attributessuffix 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.DbSystemstill 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 barestateattribute'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.azNamespaceandAzure.azServiceRequestIdare nowAz.azNamespaceandAz.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 inattributesFromSemanticMap/attributesOf.
Added
-
Full attribute-registry coverage (#51): 24 namespaces that were never modeled, including the
app.*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. NewOTelEntityinterface 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 sameotel/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 to
semantics/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 otherdeprecated: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, andSystemMemoryState.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/createSpannow follow trace/api.md's "Behavior of the API in the absence of an installed SDK": the returned span is non-recording (isRecordingisfalseand every mutating operation is a no-op) and carries theSpanContextfrom the parentContext— explicit or implicit — unchanged; when the context has no span, it carries an emptySpanContext(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/Getand 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 returnTraceStatecontaining invalid data" while following the error-handling guidelines — invalid keys/values are now ignored with a warning (previouslyArgumentError), 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 (previouslyArgumentError), andgetTracer/getMeter/getLoggerafter provider shutdown warn and return a no-op instance (previouslyStateError).
Release notes
Open source →AppLifecycleSemantics , AppStartType , AppInfoSemantics , DeviceSemantics , BatterySemantics , NavigationSemantics , InteractionType , InteractionSemantics , PerformanceSemantics , ErrorSemantics , NetworkSemantics , RumSessionView , NavigationAction , and LifecycleState ( semantics/rum.dart is gone). They are not OpenTelemetry semantic conventions and so do not belong in this package; flutterrific_opentelemetry defines its own Flutter conventions for what the registry does not yet cover. The API package now contains only registry conventions.
Added
- Semantic-conventions versioning policy in VERSIONING.md: within a major version, registry regenerations are additive and deprecating only; identifier- or wire-affecting registry changes batch into the next major; spec-fidelity string corrections are bug fixes with a CHANGELOG wire-format table.
Changed
- Breaking: APIObservableResult is now an abstract interface. The API-side implementation was unconstructible (private constructor, no factory) so nothing could have used it; SDKs implement the interface, as dartastic_opentelemetry already does.
Fixed
- Attributes.of no longer throws a TypeError when a map value is an untyped list ( List<Object> / List<dynamic> ). Lists are now element-checked like Attributes.fromJson : homogeneous string/bool/int/double lists convert, mixed numeric lists promote to List<double> , and unsupported element types are warned and ignored per the OTel specification.
-
-
1.0.0-beta.911 Jul 2026 pre-releaseRelease notes
Open source →Fixed
OTelAPI.instrumentationScope()recursed into itself when called before
initialization, causing an immediateStackOverflowError; it now lazily
installs the no-op API factory like the other accessors (#27). Thanks
@kevmoo.OTelAPI.tracer()andOTelAPI.logger()threw a null-check error before
initialization instead of lazily installing the no-op API factory (#27).TraceState.fromString/fromMap/empty,SpanContext.fromJson, and
Baggage.fromJsonthrewStateError('Call initialize() first.')instead
of lazily installing the no-op API factory —fromStringparses the W3C
tracestateheader (a propagator path) and thefromJsons run in fresh
isolates during deserialization, both classic pre-init calls (#33).OTelAPI.tracerProviders()/meterProviders()/loggerProviders()
read OTelAPI's private factory cache instead of the global factory, so
providers of a factory installed by an SDK were invisible until some
OTelAPI accessor ran (#33).OTelAPI.attributesFromMap,Attributes.of, andMap.toAttributes()no
longer bypass the factory via the staticattrsFromMap"cheat" (obsolete
since the beta.8 lazy-install lifecycle); a factory that overrides
attributesFromMapis now respected on all three paths (#33).TraceStatemulti-tenanttracestatekeys (tenant-id@system-id) now
match the W3C Trace Context key grammar: atenant-idmay start with a
digit, andtenant-id/system-idare length-capped (241/14 chars).
Previously a digit-leading tenant was rejected and over-long ids
accepted (#38).
Release notes
Open source →Fixed
OTelAPI.instrumentationScope()recursed into itself when called before initialization, causing an immediateStackOverflowError; it now lazily installs the no-op API factory like the other accessors (#27). Thanks @kevmoo.OTelAPI.tracer()andOTelAPI.logger()threw a null-check error before initialization instead of lazily installing the no-op API factory (#27).TraceState.fromString/fromMap/empty,SpanContext.fromJson, andBaggage.fromJsonthrewStateError('Call initialize() first.')instead of lazily installing the no-op API factory —fromStringparses the W3Ctracestateheader (a propagator path) and thefromJsons run in fresh isolates during deserialization, both classic pre-init calls (#33).OTelAPI.tracerProviders()/meterProviders()/loggerProviders()read OTelAPI's private factory cache instead of the global factory, so providers of a factory installed by an SDK were invisible until some OTelAPI accessor ran (#33).OTelAPI.attributesFromMap,Attributes.of, andMap.toAttributes()no longer bypass the factory via the staticattrsFromMap"cheat" (obsolete since the beta.8 lazy-install lifecycle); a factory that overridesattributesFromMapis now respected on all three paths (#33).TraceStatemulti-tenanttracestatekeys (tenant-id@system-id) now match the W3C Trace Context key grammar: atenant-idmay start with a digit, andtenant-id/system-idare length-capped (241/14 chars). Previously a digit-leading tenant was rejected and over-long ids accepted (#38).
-
1.0.0-beta.811 Jul 2026 pre-releaseRelease notes
Open source →Added
OTelFactory.isAPIFactory— identifies the API's auto-installed no-op
factory. Defaults tofalseonOTelFactory;OTelAPIFactoryoverrides it
totrue. SDK factories (which extendOTelAPIFactory) must override it to
returnfalse. Lets SDK initialization replace the spec-mandated no-op API
factory installed when API code runs first, instead of relying on
runtimeTypechecks (see dartastic_opentelemetry #50 / PR #53).
Fixed
Context.root/Context.current(and other Context APIs) threw
StateError('Call initialize() first.')when accessed before
OTelAPI.initialize(), violating the OTel spec requirement that the API
operate as a no-op without an SDK installed. They now lazily install the
No-Op API factory, matchingOTelAPI's existing behavior. Thanks
@benjaben.Contextre-reads the global factory on every access instead of keeping
the first one it saw, so a factory installed later (e.g. by an SDK's
initialize()) replaces a no-op cached before initialization.OTelAPI.initialize()now replaces an installed no-op API factory
(isAPIFactory == true) instead of throwing, so API use before
initialization (e.g.Context.current) no longer blocks explicit
initialization. Behavior change: re-initializing over a no-op API
factory replaces it and applies the new configuration; only a real
(non-API) factory still triggers the initialize-onceStateError.
Release notes
Open source →Added
OTelFactory.isAPIFactory— identifies the API's auto-installed no-op factory. Defaults tofalseonOTelFactory;OTelAPIFactoryoverrides it totrue. SDK factories (which extendOTelAPIFactory) must override it to returnfalse. Lets SDK initialization replace the spec-mandated no-op API factory installed when API code runs first, instead of relying onruntimeTypechecks (see dartastic_opentelemetry #50 / PR #53).
Fixed
Context.root/Context.current(and other Context APIs) threwStateError('Call initialize() first.')when accessed beforeOTelAPI.initialize(), violating the OTel spec requirement that the API operate as a no-op without an SDK installed. They now lazily install the No-Op API factory, matchingOTelAPI's existing behavior. Thanks @benjaben.Contextre-reads the global factory on every access instead of keeping the first one it saw, so a factory installed later (e.g. by an SDK'sinitialize()) replaces a no-op cached before initialization.OTelAPI.initialize()now replaces an installed no-op API factory (isAPIFactory == true) instead of throwing, so API use before initialization (e.g.Context.current) no longer blocks explicit initialization. Behavior change: re-initializing over a no-op API factory replaces it and applies the new configuration; only a real (non-API) factory still triggers the initialize-onceStateError.
-
1.0.0-beta.718 May 2026 pre-releaseNothing published for this version
-
1.0.0-beta.611 May 2026 pre-releaseRelease notes
Open source →Added
-
OTelAPI.attributesOf<E extends OTelSemantic>(Map<E, Object>)— a
shorthand-friendly counterpart toattributesFromSemanticMap.
Parameterized on a single concrete semconv enum [E], so Dart 3.10
static dot-shorthand can drop the prefix at the call site:// Today and forever: OTelAPI.attributesOf<Http>({ Http.requestMethod: 'GET', Http.responseStatusCode: 200, }); // With Dart 3.10+ static dot-shorthand enabled: OTelAPI.attributesOf<Http>({ .requestMethod: 'GET', .responseStatusCode: 200, });
attributesFromSemanticMapstays the right call site when you need to
mix multiple semconv enums or your ownOTelSemantic-implementing
enums in one map. -
New top-level
Userenum insemantics.dartcovering the OTel-spec
user.*keys:userId,userEmail,userFullName,userName,
userRoles,userSession. Replaces the previousUserSemantics
enum inui_semantics.dart. -
New top-level
Sessionenum insemantics.dartcovering the OTel-spec
session.*keys:sessionId,sessionPreviousId. Spec-only subset
of the previousSessionViewSemantics. -
Spec-derived metric-name enums in new
semantic_metrics.dart.
Covers every metric in the OTel attribute registry except the
language-runtime namespaces (jvm.*,go.*,nodejs.*,
cpython.*,v8js.*,kestrel.*,aspnetcore.*,signalr.*,
openshift.*,nfs.*— Dart apps don't emit those). Generated by
parsing the OTelmodel/*/metrics.yamlfiles, so name / instrument
kind / unit string travel together:final metric = HttpMetric.serverRequestDuration; metric.name; // 'http.server.request.duration' metric.instrument; // SemanticInstrument.histogram metric.unit; // 's'
Enums (15):
CicdMetric,ContainerMetric,DbMetric,
DnsMetric,FaasMetric,GenAiMetric,HttpMetric,K8sMetric,
McpMetric,MessagingMetric,OtelMetric,ProcessMetric,
RpcMetric,SystemMetric,VcsMetric. NewOTelMetricinterface
unifies them; newSemanticInstrumentenum names the four OTel
instrument kinds. -
Spec event-name enum in new
semantic_events.dart— all 16
spec-defined event names (exception,feature_flag.evaluation,
browser.web_vital,gen_ai.client.inference.operation.details,
the per-protocol*.exceptionevents for HTTP/RPC/messaging/FaaS,
plusazure.resource.log).SemanticEventexposes aname
getter;OTelEventinterface for switching.
Changed
-
Breaking: Dropped the
Resourcesuffix from semconv-enum names where
it didn't conflict with a built-in Dart / Flutter / common-package type.
HttpResource.requestMethodis nowHttp.requestMethod,
UrlResource.urlFullis nowUrl.urlFull, etc. — a straight find-and-
replace migration for ~60 enums. Migration: replaceXResource→
Xfor every enum below.Kept the
Resourcesuffix on five enums to avoid name clashes with
common types:Enum Conflicts with ErrorResourcedart:coreErrorExceptionResourcedart:coreExceptionFileResourcedart:ioFileProcessResourcedart:ioProcessServerResourcepackage:grpcServerEventResourcepackage:webEventAll other 60+ enums dropped the suffix:
Client,Cloud,
ComputeUnit,ComputeInstance,Database,Deployment,Device,
Environment,FeatureFlag,GenAI,General,GraphQL,Host,
Http,Kubernetes,Messaging,Network,OperatingSystem,
RPC,Url,Service,SourceCode,TelemetryDistro,
TelemetrySDK,UserAgent,Version, plus all 33 new enums in this
release (Android,Artifact,Aws,Azure,Browser,Cassandra,
Cicd,CloudEvents,Cloudfoundry,Code,Destination,Dns,
Elasticsearch,Enduser,Faas,Gcp,Geo,Hardware,
Heroku,Ios,Log,Oci,Opentracing,Otel,Peer,
Profile,Source,System,Test,Thread,Tls,Vcs,
Webengine). -
Breaking — file restructure.
lib/src/api/semantics/resource_semantics.dart
→lib/src/api/semantics/semantics.dart(the new consolidated home
for theOTelSemanticinterface and every attribute-key enum);
lib/src/api/semantics/resource_values.dart→
lib/src/api/semantics/semantic_values.dart. The previous standalone
semantics.dart(interface only) is deleted; its content moved to
the top of the renamed file. Consumers using the package barrel
(package:dartastic_opentelemetry_api/dartastic_opentelemetry_api.dart)
are unaffected. Directsrc/api/semantics/...imports need the
new paths. -
Breaking —
UserSemanticsremoved. Use the newUserenum in
semantics.dartinstead. Migration:UserSemantics.userId→
User.userId, etc. -
Breaking —
SessionViewSemanticssplit. OTel-spec keys
(session.id,session.previous_id) →Sessioninsemantics.dart.
Datadog/Dynatrace-style non-spec RUM keys (session_idunderscored,
session.start,session.duration,view.*,action.count,
user_satisfaction_score) → newRumSessionViewenum in
ui_semantics.dart.ui_semantics.dartis now strictly the home
for Flutter / RUM non-spec conventions.
Added
-
Typed value-set enums — a new
semantic_values.dartfile exposes
enums for the 35+ OTel attributes whose spec entry defines a closed
set of valid string values. Each value enum exposes its on-wire
string via a.valuegetter and implementsOTelSemanticValuefor
future polymorphic helpers. Highlights:CloudProvider,CloudPlatform,FaasInvokedProvider,
FaasTriggerHostArch,OsTypeHttpRequestMethod,HttpConnectionStateNetworkType,NetworkTransport,NetworkConnectionType,
NetworkIoDirectionDbSystem,DbClientConnectionState,CassandraConsistencyLevel,
AzureCosmosdbConnectionMode,AzureCosmosdbConsistencyLevelMessagingSystem,MessagingOperationRpcSystem,RpcMessageType,GraphqlOperationTypeOpentracingRefType,OtelStatusCode,OtelSpanSamplingResult,
TelemetrySdkLanguageSystemCpuState,SystemMemoryState,SystemFilesystemState,
SystemFilesystemType,SystemPagingDirection,
SystemPagingState,SystemPagingType,SystemProcessStatus,
DiskIoDirection,LogIostreamIosAppState,AndroidAppStateAwsEcsLaunchTypeCicdPipelineRunState,CicdPipelineTaskType,CicdWorkerStateHardwareType,TlsProtocolNameVcsChangeState,VcsLineChangeType,VcsRefTypeTestCaseResultStatus,TestSuiteRunStatusProfileFrameTypeGenAiOperationName,GenAiSystem,GenAiTokenTypeContainerCpuState,ProcessContextSwitchType,
ProcessPagingFaultType
Usage:
OTelAPI.attributesFromSemanticMap({ Database.dbSystemName: DbSystem.postgresql.value, Cloud.cloudProvider: CloudProvider.gcp.value, Network.networkTransport: NetworkTransport.quic.value, });
-
Comprehensive semconv-enum coverage of the OTel
attribute registry.
Every top-level registry namespace that wasn't already represented
now has a typed enum. Consumers can keep using raw strings for
app-specific keys, but for spec-defined attributes there is now a
typed-enum entry, making typos at the call site a compile error.New enums (33):
AndroidResource—android.os.api_level,android.app.state,
android.stateArtifactResource— software-artifact / supply-chain
(artifact.attestation.*,artifact.hash,artifact.purl,
artifact.version, etc.)AwsResource— ECS / EKS / Lambda / S3 / CloudWatch Logs /
DynamoDB attributes (aws.ecs.*,aws.eks.cluster.arn,
aws.lambda.invoked_arn,aws.s3.*,aws.dynamodb.*,
aws.log.*,aws.request_id)AzureResource—azure.client.id,azure.cosmosdb.*, plus the
legacyaz.namespace/az.service_request_idkeys still emitted
by some SDKsBrowserResource—browser.brands,browser.language,
browser.mobile,browser.platform(matches what the SDK web
detector emits)CassandraResource—cassandra.consistency.level,
cassandra.coordinator.dc, etc.CicdResource— pipeline / task / worker attributes
(cicd.pipeline.*,cicd.worker.*,cicd.system.component)CloudEventsResource—cloudevents.event_id,
cloudevents.event_source,cloudevents.event_spec_version,
cloudevents.event_subject,cloudevents.event_typeCloudfoundryResource— Cloud Foundry platform attrs
(cloudfoundry.app.*,cloudfoundry.org.*,
cloudfoundry.process.*,cloudfoundry.space.*,
cloudfoundry.system.*)CodeResource— source-link attrs (code.function.name,
code.file.path,code.line.number,code.column.number,
code.namespace,code.stacktrace)DestinationResource—destination.address,
destination.port(mirror ofServerResourcefor outbound non-HTTP)DnsResource—dns.question.name,dns.answersElasticsearchResource—elasticsearch.cluster.name,
elasticsearch.node.name,elasticsearch.node.versionEnduserResource—enduser.id,enduser.role,enduser.scope
(separate fromuser.*;enduser.*is what services set about
the end user they're serving)EventResource—event.name(used by the logs signal)FaasResource— Function-as-a-Service attrs (faas.coldstart,
faas.invoked_*,faas.trigger, etc.)GcpResource—gcp.client.service,gcp.cloud_run.job.*,
gcp.gce.instance.*GeoResource—geo.continent.code,geo.country.iso_code,
geo.locality.name,geo.location.lat,geo.location.lon,
geo.postal_code,geo.region.iso_codeHardwareResource—hardware.id,hardware.name,
hardware.parent,hardware.type,hardware.serial_number,
hardware.vendor,hardware.modelHerokuResource—heroku.app.id,heroku.release.commit,
heroku.release.creation_timestampIosResource—ios.app.state,ios.stateLogResource—log.iostream,log.file.*,log.record.original,
log.record.uidNetworkResource— addednetworkProtocolName
(network.protocol.name),networkProtocolVersion
(network.protocol.version), andnetworkTransport
(network.transport) — current OTel semconv keys for the wire
protocol an HTTP client / server is speaking overOciResource—oci.manifest.digestOpentracingResource—opentracing.ref_typeOtelResource—otel.scope.name,otel.scope.version,
otel.status_code,otel.status_description,
otel.span.sampling_result, plus the deprecated-but-still-emitted
otel.library.name/otel.library.versionPeerResource—peer.serviceProfileResource—profile.frame.type(experimental profiling
signal)SourceResource—source.address,source.port(mirror of
ClientResourcefor inbound non-HTTP)SystemResource— system-level metric attrs for CPU / memory /
disk / network / filesystem / paging / process (used by the SDK's
auto-collected runtime metrics)TestResource—test.case.name,test.case.result.status,
test.suite.name,test.suite.run.statusThreadResource—thread.id,thread.nameTlsResource— full TLS connection attribute set
(tls.cipher,tls.protocol.*,tls.client.*,tls.server.*)UserAgentResource—user_agent.original,user_agent.name,
user_agent.version— the OTel semconv user-agent attributes set
by HTTP-client instrumentation (e.g.dartastic_dio_otel) on
each outbound requestVcsResource— version-control attrs
(vcs.repository.url.full,vcs.ref.head.*,vcs.change.*,
vcs.owner.name,vcs.provider.name, etc.)WebengineResource—webengine.description,webengine.name,
webengine.version
-
Backfilled current-spec keys on
DatabaseResource— the older
db.system/db.name/db.statement/db.operationentries
are retained for back-compat, with the newer formalized keys added
alongside them:dbSystemName(db.system.name),dbNamespace
(db.namespace),dbOperationName(db.operation.name),
dbOperationBatchSize(db.operation.batch.size),dbQueryText
(db.query.text),dbQuerySummary(db.query.summary),
dbResponseStatusCode(db.response.status_code),
dbStoredProcedureName(db.stored_procedure.name),
dbClientConnectionState(db.client.connection.state),
dbClientConnectionPoolName(db.client.connection.pool.name),
dbClientConnectionUsedState(db.client.connection.used.state). -
Backfilled current-spec keys on
ComputeUnitResource(which
holds thecontainer.*registry):containerImageTags
(container.image.tags, the pluralized form that replaces the
legacycontainer.image.tag),containerImageId
(container.image.id),containerImageRepoDigests
(container.image.repo_digests),containerCommand
(container.command),containerCommandArgs
(container.command_args),containerCommandLine
(container.command_line),containerCsiPluginName
(container.csi.plugin.name),containerCsiVolumeId
(container.csi.volume.id),containerLabels
(container.labels).
Release notes
Open source →Added
-
OTelAPI.attributesOf<E extends OTelSemantic>(Map<E, Object>)— a shorthand-friendly counterpart toattributesFromSemanticMap. Parameterized on a single concrete semconv enum [E], so Dart 3.10 static dot-shorthand can drop the prefix at the call site:// Today and forever: OTelAPI.attributesOf<Http>({ Http.requestMethod: 'GET', Http.responseStatusCode: 200, }); // With Dart 3.10+ static dot-shorthand enabled: OTelAPI.attributesOf<Http>({ .requestMethod: 'GET', .responseStatusCode: 200, });attributesFromSemanticMapstays the right call site when you need to mix multiple semconv enums or your ownOTelSemantic-implementing enums in one map. -
New top-level
Userenum insemantics.dartcovering the OTel-specuser.*keys:userId,userEmail,userFullName,userName,userRoles,userSession. Replaces the previousUserSemanticsenum inui_semantics.dart. -
New top-level
Sessionenum insemantics.dartcovering the OTel-specsession.*keys:sessionId,sessionPreviousId. Spec-only subset of the previousSessionViewSemantics. -
Spec-derived metric-name enums in new
semantic_metrics.dart. Covers every metric in the OTel attribute registry except the language-runtime namespaces (jvm.*,go.*,nodejs.*,cpython.*,v8js.*,kestrel.*,aspnetcore.*,signalr.*,openshift.*,nfs.*— Dart apps don't emit those). Generated by parsing the OTelmodel/*/metrics.yamlfiles, so name / instrument kind / unit string travel together:final metric = HttpMetric.serverRequestDuration; metric.name; // 'http.server.request.duration' metric.instrument; // SemanticInstrument.histogram metric.unit; // 's'Enums (15):
CicdMetric,ContainerMetric,DbMetric,DnsMetric,FaasMetric,GenAiMetric,HttpMetric,K8sMetric,McpMetric,MessagingMetric,OtelMetric,ProcessMetric,RpcMetric,SystemMetric,VcsMetric. NewOTelMetricinterface unifies them; newSemanticInstrumentenum names the four OTel instrument kinds. -
Spec event-name enum in new
semantic_events.dart— all 16 spec-defined event names (exception,feature_flag.evaluation,browser.web_vital,gen_ai.client.inference.operation.details, the per-protocol*.exceptionevents for HTTP/RPC/messaging/FaaS, plusazure.resource.log).SemanticEventexposes anamegetter;OTelEventinterface for switching.
Changed
-
Breaking: Dropped the
Resourcesuffix from semconv-enum names where it didn't conflict with a built-in Dart / Flutter / common-package type.HttpResource.requestMethodis nowHttp.requestMethod,UrlResource.urlFullis nowUrl.urlFull, etc. — a straight find-and- replace migration for ~60 enums. Migration: replaceXResource→Xfor every enum below.Kept the
Resourcesuffix on five enums to avoid name clashes with common types:Enum Conflicts with ErrorResourcedart:coreErrorExceptionResourcedart:coreExceptionFileResourcedart:ioFileProcessResourcedart:ioProcessServerResourcepackage:grpcServerEventResourcepackage:webEventAll other 60+ enums dropped the suffix:
Client,Cloud,ComputeUnit,ComputeInstance,Database,Deployment,Device,Environment,FeatureFlag,GenAI,General,GraphQL,Host,Http,Kubernetes,Messaging,Network,OperatingSystem,RPC,Url,Service,SourceCode,TelemetryDistro,TelemetrySDK,UserAgent,Version, plus all 33 new enums in this release (Android,Artifact,Aws,Azure,Browser,Cassandra,Cicd,CloudEvents,Cloudfoundry,Code,Destination,Dns,Elasticsearch,Enduser,Faas,Gcp,Geo,Hardware,Heroku,Ios,Log,Oci,Opentracing,Otel,Peer,Profile,Source,System,Test,Thread,Tls,Vcs,Webengine). -
Breaking — file restructure.
lib/src/api/semantics/resource_semantics.dart→lib/src/api/semantics/semantics.dart(the new consolidated home for theOTelSemanticinterface and every attribute-key enum);lib/src/api/semantics/resource_values.dart→lib/src/api/semantics/semantic_values.dart. The previous standalonesemantics.dart(interface only) is deleted; its content moved to the top of the renamed file. Consumers using the package barrel (package:dartastic_opentelemetry_api/dartastic_opentelemetry_api.dart) are unaffected. Directsrc/api/semantics/...imports need the new paths. -
Breaking —
UserSemanticsremoved. Use the newUserenum insemantics.dartinstead. Migration:UserSemantics.userId→User.userId, etc. -
Breaking —
SessionViewSemanticssplit. OTel-spec keys (session.id,session.previous_id) →Sessioninsemantics.dart. Datadog/Dynatrace-style non-spec RUM keys (session_idunderscored,session.start,session.duration,view.*,action.count,user_satisfaction_score) → newRumSessionViewenum inui_semantics.dart.ui_semantics.dartis now strictly the home for Flutter / RUM non-spec conventions.
Added
-
Typed value-set enums — a new
semantic_values.dartfile exposes enums for the 35+ OTel attributes whose spec entry defines a closed set of valid string values. Each value enum exposes its on-wire string via a.valuegetter and implementsOTelSemanticValuefor future polymorphic helpers. Highlights:CloudProvider,CloudPlatform,FaasInvokedProvider,FaasTriggerHostArch,OsTypeHttpRequestMethod,HttpConnectionStateNetworkType,NetworkTransport,NetworkConnectionType,NetworkIoDirectionDbSystem,DbClientConnectionState,CassandraConsistencyLevel,AzureCosmosdbConnectionMode,AzureCosmosdbConsistencyLevelMessagingSystem,MessagingOperationRpcSystem,RpcMessageType,GraphqlOperationTypeOpentracingRefType,OtelStatusCode,OtelSpanSamplingResult,TelemetrySdkLanguageSystemCpuState,SystemMemoryState,SystemFilesystemState,SystemFilesystemType,SystemPagingDirection,SystemPagingState,SystemPagingType,SystemProcessStatus,DiskIoDirection,LogIostreamIosAppState,AndroidAppStateAwsEcsLaunchTypeCicdPipelineRunState,CicdPipelineTaskType,CicdWorkerStateHardwareType,TlsProtocolNameVcsChangeState,VcsLineChangeType,VcsRefTypeTestCaseResultStatus,TestSuiteRunStatusProfileFrameTypeGenAiOperationName,GenAiSystem,GenAiTokenTypeContainerCpuState,ProcessContextSwitchType,ProcessPagingFaultType
Usage:
OTelAPI.attributesFromSemanticMap({ Database.dbSystemName: DbSystem.postgresql.value, Cloud.cloudProvider: CloudProvider.gcp.value, Network.networkTransport: NetworkTransport.quic.value, }); -
Comprehensive semconv-enum coverage of the OTel attribute registry. Every top-level registry namespace that wasn't already represented now has a typed enum. Consumers can keep using raw strings for app-specific keys, but for spec-defined attributes there is now a typed-enum entry, making typos at the call site a compile error.
New enums (33):
AndroidResource—android.os.api_level,android.app.state,android.stateArtifactResource— software-artifact / supply-chain (artifact.attestation.*,artifact.hash,artifact.purl,artifact.version, etc.)AwsResource— ECS / EKS / Lambda / S3 / CloudWatch Logs / DynamoDB attributes (aws.ecs.*,aws.eks.cluster.arn,aws.lambda.invoked_arn,aws.s3.*,aws.dynamodb.*,aws.log.*,aws.request_id)AzureResource—azure.client.id,azure.cosmosdb.*, plus the legacyaz.namespace/az.service_request_idkeys still emitted by some SDKsBrowserResource—browser.brands,browser.language,browser.mobile,browser.platform(matches what the SDK web detector emits)CassandraResource—cassandra.consistency.level,cassandra.coordinator.dc, etc.CicdResource— pipeline / task / worker attributes (cicd.pipeline.*,cicd.worker.*,cicd.system.component)CloudEventsResource—cloudevents.event_id,cloudevents.event_source,cloudevents.event_spec_version,cloudevents.event_subject,cloudevents.event_typeCloudfoundryResource— Cloud Foundry platform attrs (cloudfoundry.app.*,cloudfoundry.org.*,cloudfoundry.process.*,cloudfoundry.space.*,cloudfoundry.system.*)CodeResource— source-link attrs (code.function.name,code.file.path,code.line.number,code.column.number,code.namespace,code.stacktrace)DestinationResource—destination.address,destination.port(mirror ofServerResourcefor outbound non-HTTP)DnsResource—dns.question.name,dns.answersElasticsearchResource—elasticsearch.cluster.name,elasticsearch.node.name,elasticsearch.node.versionEnduserResource—enduser.id,enduser.role,enduser.scope(separate fromuser.*;enduser.*is what services set about the end user they're serving)EventResource—event.name(used by the logs signal)FaasResource— Function-as-a-Service attrs (faas.coldstart,faas.invoked_*,faas.trigger, etc.)GcpResource—gcp.client.service,gcp.cloud_run.job.*,gcp.gce.instance.*GeoResource—geo.continent.code,geo.country.iso_code,geo.locality.name,geo.location.lat,geo.location.lon,geo.postal_code,geo.region.iso_codeHardwareResource—hardware.id,hardware.name,hardware.parent,hardware.type,hardware.serial_number,hardware.vendor,hardware.modelHerokuResource—heroku.app.id,heroku.release.commit,heroku.release.creation_timestampIosResource—ios.app.state,ios.stateLogResource—log.iostream,log.file.*,log.record.original,log.record.uidNetworkResource— addednetworkProtocolName(network.protocol.name),networkProtocolVersion(network.protocol.version), andnetworkTransport(network.transport) — current OTel semconv keys for the wire protocol an HTTP client / server is speaking overOciResource—oci.manifest.digestOpentracingResource—opentracing.ref_typeOtelResource—otel.scope.name,otel.scope.version,otel.status_code,otel.status_description,otel.span.sampling_result, plus the deprecated-but-still-emittedotel.library.name/otel.library.versionPeerResource—peer.serviceProfileResource—profile.frame.type(experimental profiling signal)SourceResource—source.address,source.port(mirror ofClientResourcefor inbound non-HTTP)SystemResource— system-level metric attrs for CPU / memory / disk / network / filesystem / paging / process (used by the SDK's auto-collected runtime metrics)TestResource—test.case.name,test.case.result.status,test.suite.name,test.suite.run.statusThreadResource—thread.id,thread.nameTlsResource— full TLS connection attribute set (tls.cipher,tls.protocol.*,tls.client.*,tls.server.*)UserAgentResource—user_agent.original,user_agent.name,user_agent.version— the OTel semconv user-agent attributes set by HTTP-client instrumentation (e.g.dartastic_dio_otel) on each outbound requestVcsResource— version-control attrs (vcs.repository.url.full,vcs.ref.head.*,vcs.change.*,vcs.owner.name,vcs.provider.name, etc.)WebengineResource—webengine.description,webengine.name,webengine.version
-
Backfilled current-spec keys on
DatabaseResource— the olderdb.system/db.name/db.statement/db.operationentries are retained for back-compat, with the newer formalized keys added alongside them:dbSystemName(db.system.name),dbNamespace(db.namespace),dbOperationName(db.operation.name),dbOperationBatchSize(db.operation.batch.size),dbQueryText(db.query.text),dbQuerySummary(db.query.summary),dbResponseStatusCode(db.response.status_code),dbStoredProcedureName(db.stored_procedure.name),dbClientConnectionState(db.client.connection.state),dbClientConnectionPoolName(db.client.connection.pool.name),dbClientConnectionUsedState(db.client.connection.used.state). -
Backfilled current-spec keys on
ComputeUnitResource(which holds thecontainer.*registry):containerImageTags(container.image.tags, the pluralized form that replaces the legacycontainer.image.tag),containerImageId(container.image.id),containerImageRepoDigests(container.image.repo_digests),containerCommand(container.command),containerCommandArgs(container.command_args),containerCommandLine(container.command_line),containerCsiPluginName(container.csi.plugin.name),containerCsiVolumeId(container.csi.volume.id),containerLabels(container.labels).
-
-
1.0.0-beta.510 May 2026 pre-releaseRelease notes
Open source →Added
-
Pluggable
TimeProviderfor span timestamps. New abstraction with three pieces:TimeProvider(interface) andSystemTimeProvider(default,DateTime.now) —lib/src/util/time_provider.dart.WebTimeProvider—window.performance.now()+timeOriginfor sub-millisecond span timestamps on web. Lives inlib/src/util/web_time_provider.dartas a conditional facade (web_time_provider_web.darton Dart-on-JS / Wasm;web_time_provider_stub.dartthrows on native).defaultTimeProvider— platform-aware constant exported fromlib/src/util/default_time_provider.dart. Native targets resolve toSystemTimeProvider; web targets toWebTimeProvider. Selected at compile time viadart.library.js_interop, the modern Wasm-compatible check.
Plumbed through
APITracerProvider.timeProvider→APITracer.timeProvider→APISpan._timeProviderso span starts, ends, and events all source their timestamps from the same clock.APISpan.addEventNowandaddEvents(Map)now route through the span's_timeProviderrather than the staticOTelFactory.spanEventNowshortcut, which was hardcoded toDateTime.nowand silently dropped sub-millisecond precision when the provider was aWebTimeProvider.Why this matters on web.
DateTime.now()on Dart-on-JS is millisecond-precision — the underlying source is JSDate.now(), andmicrosecondsSinceEpochreturnsmillisecondsSinceEpoch × 1000(the lower three digits are always zero, regardless of the Int64 storage type used by OTLP).WebTimeProviderroutes through the browser performance API: ~5µs nominal precision, browser-coarsened to ~100µs as a Spectre mitigation, still 10–200× better thanDate.now(). Native targets are unaffected and stay atDateTime.now's 1µs floor.Auto-default on web. Web users do not have to opt in — constructing an
APITracerProvideron a web target automatically getsWebTimeProviderviadefaultTimeProvider. To override (e.g., a fake clock in tests), assigntracerProvider.timeProvider = customProvider.
Changed
- README and the API example now use
OTelAPI.attributesFromSemanticMap({Enum.value: ...})for typed-enum-keyed attribute maps in place ofOTelAPI.attributesFromMap({Enum.value.key: ...})/Attributes.of({Enum.value.key: ...})/<String, Object>{...}.toAttributes(). The shorter form drops the.keyaccessor on every entry while keeping the typed-enum-key principle. Mixing different semconv enum types in one map is fine — the param isMap<OTelSemantic, Object>and every semconv enum implementsOTelSemantic. No API surface change;attributesFromSemanticMaphas existed since beta-era.
Release notes
Open source →Added
-
Pluggable
TimeProviderfor span timestamps. New abstraction with three pieces:TimeProvider(interface) andSystemTimeProvider(default,DateTime.now) —lib/src/util/time_provider.dart.WebTimeProvider—window.performance.now()+timeOriginfor sub-millisecond span timestamps on web. Lives inlib/src/util/web_time_provider.dartas a conditional facade (web_time_provider_web.darton Dart-on-JS / Wasm;web_time_provider_stub.dartthrows on native).defaultTimeProvider— platform-aware constant exported fromlib/src/util/default_time_provider.dart. Native targets resolve toSystemTimeProvider; web targets toWebTimeProvider. Selected at compile time viadart.library.js_interop, the modern Wasm-compatible check.
Plumbed through
APITracerProvider.timeProvider→APITracer.timeProvider→APISpan._timeProviderso span starts, ends, and events all source their timestamps from the same clock.APISpan.addEventNowandaddEvents(Map)now route through the span's_timeProviderrather than the staticOTelFactory.spanEventNowshortcut, which was hardcoded toDateTime.nowand silently dropped sub-millisecond precision when the provider was aWebTimeProvider.Why this matters on web.
DateTime.now()on Dart-on-JS is millisecond-precision — the underlying source is JSDate.now(), andmicrosecondsSinceEpochreturnsmillisecondsSinceEpoch × 1000(the lower three digits are always zero, regardless of the Int64 storage type used by OTLP).WebTimeProviderroutes through the browser performance API: ~5µs nominal precision, browser-coarsened to ~100µs as a Spectre mitigation, still 10–200× better thanDate.now(). Native targets are unaffected and stay atDateTime.now's 1µs floor.Auto-default on web. Web users do not have to opt in — constructing an
APITracerProvideron a web target automatically getsWebTimeProviderviadefaultTimeProvider. To override (e.g., a fake clock in tests), assigntracerProvider.timeProvider = customProvider.
Changed
- README and the API example now use
OTelAPI.attributesFromSemanticMap({Enum.value: ...})for typed-enum-keyed attribute maps in place ofOTelAPI.attributesFromMap({Enum.value.key: ...})/Attributes.of({Enum.value.key: ...})/<String, Object>{...}.toAttributes(). The shorter form drops the.keyaccessor on every entry while keeping the typed-enum-key principle. Mixing different semconv enum types in one map is fine — the param isMap<OTelSemantic, Object>and every semconv enum implementsOTelSemantic. No API surface change;attributesFromSemanticMaphas existed since beta-era.
-
-
1.0.0-beta.410 May 2026 pre-releaseRelease notes
Open source →Added
OTelAPI.loggerProviders()— returns the global defaultAPILoggerProviderplus any named providers added viaOTelAPI.addLoggerProvider(name). Parallel to the existingtracerProviders()andmeterProviders(). Backed by a newOTelFactory.getLoggerProviders()so SDK implementations get the same enumeration. LetsOTel.shutdown()in the SDK iterate over named LoggerProviders the way it already does for tracer / meter providers — without this,OTel.addLoggerProvider(name)consumers had to remember to shut each one down manually.
-
1.0.0-beta.309 May 2026 pre-releaseRelease notes
Open source →Fixed
- Breaking:
ServiceResource.serviceResourcepace(keyservice.Resourcepace) was a mangled find/replace artifact (Name→Resourceaccidentally hitserviceNamespace). Restored the correct OTel semconv entry:ServiceResource.serviceNamespacewith keyservice.namespace. Migration: replaceServiceResource.serviceResourcepacewithServiceResource.serviceNamespace.
- Breaking:
-
1.0.0-beta.208 May 2026 pre-releaseRelease notes
Open source →Added
DatabaseResource.dbCollectionName(db.collection.name) — current OTel semconv key, replaces the deprecateddb.sql.table.DatabaseResource.dbResponseReturnedRows(db.response.returned_rows) — current OTel semconv key for the row count returned by a database operation.UserSemantics.userRoles(user.roles) — current OTel semconv key, an array of roles assigned to a user.
Changed
- README and example renamed the placeholder
AppAttributeenum toExampleAttribute(so readers can't blindly copy the name) and dropped the redundantapp.prefix from invented demo keys. Where current OTel semconv keys exist, the example now uses the API's typed enums (e.g.DatabaseResource.dbCollectionName,UserSemantics.userRoles) instead of an app-defined fallback.
Removed
- Breaking:
UserSemantics.userRole(singularuser.role). The singular form is an anti-pattern — users typically have multiple roles. UseUserSemantics.userRoles(user.roles) and pass aList<String>instead.
-
1.0.0-beta.107 May 2026 pre-releaseRelease notes
Open source →Fixed
Context.runIsolate()now marks the deserializedSpanContextasisRemote = trueon the receiving side. Previously the parent isolate's local SpanContext (withisRemote = false) was restored verbatim, sotracer.startSpanin the new isolate fell into the "no parent" branch and produced a fresh root span instead of a child of the parent. This now matches the W3C trace-context-from-HTTP semantic — a SpanContext that crossed a process or isolate boundary is treated as remote and parented correctly.
-
1.0.0-beta07 May 2026 pre-releaseRelease notes
Open source →Added
- (Thank you to Kevin Moore @kevmoo)
Context.run()andContext.runSync()— Zone-based implicit context propagation. These are the spec-aligned way to attach a context for a scope of execution and ensure it propagates correctly acrossawaits and async callbacks. - (Thank you to Kevin Moore @kevmoo)
isTransferableflag onContextKey(defaultfalse) to opt custom keys into cross-isolate transfer viaContext.runIsolate(). ServerResourceandUrlResourcesemantic resource enums.
Changed
- Breaking:
tracer.startSpan()no longer automatically activates the span in the current context, aligning with the OpenTelemetry specification. Usetracer.withSpan/withSpanAsync(orContext.runSync/Context.run) to make a span active for a scope. - Breaking:
Context.currentWithBaggage()is now pure — it returns a Context with Baggage but no longer mutatesContext.current. Pair the returned Context withrunSync/runif you need it active. - Breaking: Custom values stored via
ContextKeyare no longer transferred across isolate boundaries by default. PassisTransferable: truewhen creating the key to opt in. Built-inBaggageandSpanContextcontinue to transfer unconditionally. APITracer.withSpan()andwithSpanAsync()now use Zone-based context propagation (Context.runSync/Context.run) for correct behavior across async boundaries (no-op implementation only).- README and example updated to demonstrate Zone-based context management.
Deprecated
- The static
Context.currentsetter. Setting it does not propagate acrossZones, which produces incorrect context inside async callbacks. UseContext.run()orContext.runSync()instead.
Fixed
APITracer.createSpan()now correctly inherits parent spans from the providedcontextparameter orContext.current. Previously these were ignored.Context.runIsolate()now serializes the specific Context instance it was called on, not the globalContext.current.Context.runIsolate()no longer mutates the parent isolate's_currentContexton return — eliminates a case where Zone-bound context could leak into the parent's static field.nowAsNanos()no longer loses precision on JS. The 64-bit wrap now happens before the multiplication by 1000.
- (Thank you to Kevin Moore @kevmoo)
-
1.0.0-alpha22 Dec 2025 pre-releaseRelease notes
Open source →Changed
Documentation, updated to 1.0.0-alpha release candidate, matching dartastic_opentelemetry
-
0.10.023 Aug 2026Release notes
Open source →Stable-channel republication of
1.0.0-rc.2— the first stable-channel
release since0.9.1. The code is the rc's code with a stable version
stamp, so users who have not opted into prereleases get the fixes. See
the1.0.0-beta.*through1.0.0-rc.2entries for the complete history
since0.9.1.Breaking (relative to 0.9.1)
- Everything the rc line changed applies here, most notably
1.0.0-rc.1's removal of 116 vendor/RUM identifiers that were not
OpenTelemetry semantic conventions.doc/SEMCONV_CANDIDATES.mdmaps
every removal to its registry replacement, a staged candidate, or a
recorded reason for dropping it.
Highlights
OTelAPI.setErrorHandler— configure where the library's internal
error reports go. The default logs and never throws; a strict handler
can crash-fast in development;Context.runIsolatecarries the
handler into child isolates.- Spec-compliance fixes:
Span.end()no longer fabricates anOk
status,CompositePropagator.extractruns in registration order, and
Context.withSpanContextderives instead of throwing. - Semantic conventions at registry v1.44.0, including the complete
browser.web_vital.*set, plus an@experimentalcandidates/
staging area for keys proposed upstream.
Release notes
Open source →Stable-channel republication of
1.0.0-rc.2— the first stable-channel release since0.9.1. The code is the rc's code with a stable version stamp, so users who have not opted into prereleases get the fixes. See the1.0.0-beta.*through1.0.0-rc.2entries for the complete history since0.9.1.Breaking (relative to 0.9.1)
- Everything the rc line changed applies here, most notably
1.0.0-rc.1's removal of 116 vendor/RUM identifiers that were not OpenTelemetry semantic conventions.doc/SEMCONV_CANDIDATES.mdmaps every removal to its registry replacement, a staged candidate, or a recorded reason for dropping it.
Highlights
OTelAPI.setErrorHandler— configure where the library's internal error reports go. The default logs and never throws; a strict handler can crash-fast in development;Context.runIsolatecarries the handler into child isolates.- Spec-compliance fixes:
Span.end()no longer fabricates anOkstatus,CompositePropagator.extractruns in registration order, andContext.withSpanContextderives instead of throwing. - Semantic conventions at registry v1.44.0, including the complete
browser.web_vital.*set, plus an@experimentalcandidates/staging area for keys proposed upstream.
- Everything the rc line changed applies here, most notably
-
0.9.118 Jul 2026Release notes
Open source →Stable-channel republication of 1.0.0-rc.1 — identical content, published so
^0.9.0users and defaultdart pub addget current code. -
0.9.015 Dec 2025 -
0.8.808 Oct 2025 -
0.8.724 Sep 2025 -
0.8.624 Sep 2025 -
0.8.525 Jul 2025 -
0.8.425 Jul 2025 -
0.8.314 Jun 2025Release notes
Open source →Changed
- Attributes toString uses toJson
Removed
- tracer recordSpan, recordSpanAsync, startActiveSpan, startActiveSpanAsync, startSpanWithContext
-
0.8.206 Jun 2025Release notes
Open source →Changed
- Added instrumentationScope() to API
- Removed _getAndCacheOtelFactory() check from getTracerProviders/getMeterProviders
-
0.8.104 Jun 2025 -
0.8.005 May 2025Release notes
Open source →Added
- Initial public release of the OpenTelemetry API for Dart
- Core abstractions for traces, metrics and common (baggage, context)
- Context propagation mechanisms
- Implementation of the OpenTelemetry specification
- No-op implementations of all interfaces
- Comprehensive test suite
- Basic examples
Compliance
- Implements OpenTelemetry API specification v1.42