Compliance of Implementations with Specification

May 20, 2026 ยท View on GitHub

The following tables show which features are implemented by each OpenTelemetry language implementation.

+ means the feature is supported, - means it is not supported, N/A means the feature is not applicable to the particular language, blank cell means the status of the feature is not known.

For the Optional column, X means the feature is optional, blank means the feature is required, and columns marked with * mean that for each type of exporter (e.g. OTLP), implementing at least one of the supported formats is required. Implementing more than one format is optional.

Traces

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
TracerProviderOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Create TracerProvider++++++++++++
Get a Tracer++++++++++++
Get a Tracer with schema_url++++++++
Get a Tracer with scope attributes+-+++++
Associate Tracer with InstrumentationScope+++++++++
Safe for concurrent calls++++++++++++
Shutdown (SDK only required)++++++++++++
ForceFlush (SDK only required)++++++++++++
Trace / Context interactionOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Get active SpanN/A++++++++++-
Set active SpanN/A++++++++++-
TracerOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Create a new Span++++++++++++
Documentation defines adding attributes at span creation as preferred+-+++++
Get active SpanN/A++++++++++-
Mark Span activeN/A++++++++++-
Safe for concurrent calls++++++++++++
SpanContextOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
IsValid++++++++++++
IsRemote++++++++++++
Conforms to the W3C TraceContext spec+++++++++++-
Support W3C Trace Context Level 2 randomness-+-
SpanOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Create root span++++++++++++
Create with default parent (active span)N/A+++++++++++
Create with parent from Context++++++++++++
No explicit parent Span/SpanContext allowed+++++++++-++
SpanProcessor.OnStart receives parent Context++++++++--++
UpdateName++++++++++++
User-defined start timestamp++++++++++++
End++++++++++++
End with timestamp++++++++++++
IsRecording++++++++++++
IsRecording becomes false after End+++++++++-++
Set status with StatusCode (Unset, Ok, Error)++++++++++++
Safe for concurrent calls++++++++++++
events collection size limit++++++++--++
attribute collection size limit++++++++--++
links collection size limit++++++++--++
SpanProcessor.OnEndingX-+---------+
Span attributesOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
SetAttribute++++++++++++
Set order preservedX+-+++++++++-
String type++++++++++++
Boolean type++++++++++++
Double floating-point type++++++-+++++
Signed int64 type++++++-+++++
Array of primitives (homogeneous)++++++++++++
null values documented as invalid/undefined+++++N/A++N/A+
Unicode support for keys and string values++++++++++++
Span linkingOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Links can be recorded on span creation+++++++++++
Links can be recorded after span creation++++++++++
Links order is preserved+++++++++++
Span eventsOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
AddEvent++++++++++++
Add order preserved++++++++++++
Safe for concurrent calls++++++++++++
Span exceptionsOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
RecordException+++++++--+-+
RecordException with extra parameters+++++++--+-+
SamplingOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Allow samplers to modify tracestate++++++++++-
ShouldSample gets full parent Context+++++++++-++
Sampler: JaegerRemoteSampler+++-+-
New Span ID created also for non-recording Spans++++++++-+-
IdGenerators+++++++++++
SpanLimitsX++++++++-++
Built-in SpanProcessors implement ForceFlush spec+++++++++++
Attribute LimitsX+++++++-
Fetch InstrumentationScope from ReadableSpan++++++
TraceIdRatioBased sampler implements OpenTelemetry tracestate th fieldX--
CompositeSampler and built-in ComposableSamplersX-+-
Sampler: AlwaysRecord-+-

Baggage

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Basic support+++++++++++
Use official header name baggage+++++++++++

Metrics

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
The API provides a way to set and get a global default MeterProvider.X+++++++++--
It is possible to create any number of MeterProviders.X++++++++++-
MeterProvider provides a way to get a Meter.+++++++++--
get_meter accepts name, version and schema_url.++++++++--
get_meter accepts attributes.+--++++-
When an invalid name is specified a working Meter implementation is returned as a fallback.++++++++--
The fallback Meter name property keeps its original invalid value.X+-+++++---
Associate Meter with InstrumentationScope.++++++++-
Counter instrument is supported.++++++++++-
AsynchronousCounter instrument is supported.++++++++++-
Histogram instrument is supported.++++++++++-
AsynchronousGauge instrument is supported.++++++++++-
Gauge instrument is supported.+++++-+++--
UpDownCounter instrument is supported.++++++++++-
AsynchronousUpDownCounter instrument is supported.++++++++++-
Instruments have name++++++++++-
Instruments have kind.++++++++++-
Instruments have an optional unit of measure.++++++++++-
Instruments have an optional description.++++++++++-
A valid instrument MUST be created and warning SHOULD be emitted when multiple instruments are registered under the same Meter using the same name.+++++++-
Duplicate instrument registration name conflicts are resolved by using the first-seen for the stream name.+-++-
It is possible to register two instruments with same name under different Meters.++++++++-
Instrument names conform to the specified syntax.+++++++-
Instrument units conform to the specified syntax.-+++++++-
Instrument descriptions conform to the specified syntax.-+-++-+-
Instrument supports the advisory ExplicitBucketBoundaries parameter.+++-
Instrument supports the advisory Attributes parameter.-++-
Synchronous instruments support Bind to pre-associate attributes.X------------
All methods of MeterProvider are safe to be called concurrently.+++-+++-
All methods of Meter are safe to be called concurrently.+++-+++-
All methods of any instrument are safe to be called concurrently.+++-+++-
MeterProvider allows a Resource to be specified.+++++++++-
A specified Resource can be associated with all the produced metrics from any Meter from the MeterProvider.++++++++++-
The supplied name, version and schema_url arguments passed to the MeterProvider are used to create an InstrumentationLibrary instance stored in the Meter.+-++++--
The supplied name, version and schema_url arguments passed to the MeterProvider are used to create an InstrumentationScope instance stored in the Meter.++++++++-
Configuration is managed solely by the MeterProvider.+++++++++-
The MeterProvider provides methods to update the configurationX-+-+--+-
The updated configuration applies to all already returned Meters.if above-+----+-
There is a way to register Views with a MeterProvider.++++++++++-
The View instrument selection criteria is as specified.++++++++++-
The View instrument selection criteria supports wildcards.X+++++-+++-
The View instrument selection criteria supports the match-all wildcard.+++++++++-
The View allows configuring the name, description, attributes keys and aggregation of the resulting metric stream.++++++++--
The View allows configuring excluded attribute keys of resulting metric stream.+++--
The View allows configuring the exemplar reservoir of resulting metric stream.X+------
The SDK allows more than one View to be specified per instrument.X+++++++++-
The Drop aggregation is available.+++++++++-
The Default aggregation is available.+++++++++-
The Default aggregation uses the specified aggregation by instrument.+++++++++-
The Sum aggregation is available.++++++++++-
The LastValue aggregation is available.++++++++++-
The ExplicitBucketHistogram aggregation is available.++++++++++-
The ExponentialBucketHistogram aggregation is available.+++++++-
The metrics Reader implementation supports registering metric Exporters++++++++++-
The metrics Reader implementation supports configuring the default aggregation on the basis of instrument kind.++++++---
The metrics Reader implementation supports configuring the default temporality on the basis of instrument kind.++++++++-
The metrics Exporter has access to the aggregated metrics data (aggregated points, not raw measurements).+++++++++-
The metrics Exporter export function can not be called concurrently from the same Exporter instance.+++-++++-
The metrics Exporter export function does not block indefinitely.+++-++++-
The metrics Exporter export function receives a batch of metrics.++++++++++-
The metrics Exporter export function returns Success or Failure.++++++++++-
The metrics Exporter provides a ForceFlush function.++++++++++-
The metrics Exporter ForceFlush can inform the caller whether it succeeded, failed or timed out.+++++++++-
The metrics Exporter provides a shutdown function.++++++++++-
The metrics Exporter shutdown function do not block indefinitely.+++-+++-
The metrics SDK samples Exemplars from measurements.++--+++-
Exemplar sampling can be disabled.+---+++-
The metrics SDK supports SDK-wide exemplar filter configuration++--+++-
The metrics SDK supports TraceBased exemplar filter++--+++-
The metrics SDK supports AlwaysOn exemplar filter++--+++-
The metrics SDK supports AlwaysOff exemplar filter++--+++-
Exemplars retain any attributes available in the measurement that are not preserved by aggregation or view configuration.++--+++-
Documentation notes that View-filtered attributes may still appear on Exemplars.---------+--
Exemplars contain the associated trace id and span id of the active span in the Context when the measurement was taken.++--+++-
Exemplars contain the timestamp when the measurement was taken.++--+++-
The metrics SDK provides an ExemplarReservoir interface or extension point.+---+++--
An ExemplarReservoir has an offer method with access to the measurement value, attributes, Context and timestamp.+---+++--
The metrics SDK provides a SimpleFixedSizeExemplarReservoir that is used by default for all aggregations except ExplicitBucketHistogram.++--+++--
The metrics SDK provides an AlignedHistogramBucketExemplarReservoir that is used by default for ExplicitBucketHistogram aggregation.++--++--
A metric Producer accepts an optional metric Filter----
The metric Reader implementation supports registering metric Filter and passing them its registered metric Producers----
The metric SDK's metric Producer implementations uses the metric Filter----
Metric SDK implements cardinality limit+++---++-
Metric SDK supports configuring cardinality limit at MeterReader level-++------
Metric SDK supports configuring cardinality limit per metric (using Views)-++----+-
Metric SDK supports per-timeseries cumulative start timestamps+-
The metric SDK's periodic Reader implementation supports the maxExportBatchSize parameter-+----------

Logs

Features for the Logging SDK. Disclaimer: this list of features is still a work in progress, please refer to the specification if in any doubt.

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
LoggerProvider.Get Logger++++++++-+
LoggerProvider.Get Logger accepts attributes+-+++++
LoggerProvider.Shutdown++++++++-+
LoggerProvider.ForceFlush++++++++-+
Logger.Emit(LogRecord)++++++++-+
Logger.Emit(LogRecord) with Exception parameterX++
LogRecord.Set EventName++++++
Logger.EnabledX++++++
Ergonomic APIX
SimpleLogRecordProcessor+++++++++
BatchLogRecordProcessor+++++++++
Can plug custom LogRecordProcessor+++++++++
LogRecordProcessor.EnabledX+-++
OTLP/gRPC exporter++++++++-
OTLP/HTTP exporter++++++++++
OTLP File exporter-+--+--
Can plug custom LogRecordExporter+++++++++
Trace Context Injection+++++++++

Resource

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Create from Attributes++++++++++++
Create empty++++++++++++
Merge (v2)++++++++++
Retrieve attributes++++++++++++
Default value for service.name+++++++++
Resource detector interface/mechanism+++++++++++-
Resource detectors populate Schema URL++-++--

Context Propagation

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Create Context Key++++++++++++
Get value from Context++++++++++++
Set value for Context++++++++++++
Attach ContextN/A++++++++--+
Detach ContextN/A++++++++--+
Get current ContextN/A+++++++++++
Composite Propagator+++++++++++-
Global Propagator+++++++++++-
TraceContext Propagator+++++++++++-
B3 Propagator+++++++++++-
Jaeger PropagatorX+++++++++-+-
OT PropagatorX++++--
OpenCensus Binary Propagator+--
TextMapPropagator++++++-
Fields+++++++++++-
Setter argumentXN/A++++++N/A+++-
Getter argumentXN/A++++++N/A+++-
Getter argument returning KeysXN/A++++++N/A+-+-
Environment Variables as Context Propagation Carriers+++++

Environment Variables

Note: Support for environment variables is optional.

FeatureGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
OTEL_SDK_DISABLED-+-++-+-+---
OTEL_RESOURCE_ATTRIBUTES++++++++++--
OTEL_SERVICE_NAME++++++++++-
OTEL_LOG_LEVEL--+-+-+----
OTEL_PROPAGATORS-+++++-----
OTEL_BSP_*++++++++++--
OTEL_BLRP_*+++++++-
OTEL_EXPORTER_OTLP_*+++++++++--
OTEL_EXPORTER_ZIPKIN_*++++-+--+--
OTEL_TRACES_EXPORTER-++++++----
OTEL_METRICS_EXPORTER-+++-+-----
OTEL_LOGS_EXPORTER-++++----
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT++++++++-+-
OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT+++++++-+-
OTEL_SPAN_EVENT_COUNT_LIMIT++++++++-+-
OTEL_SPAN_LINK_COUNT_LIMIT++++++++-+-
OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT+-++++-+-
OTEL_LINK_ATTRIBUTE_COUNT_LIMIT+-++++-+-
OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT+-++---
OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT+-++---
OTEL_TRACES_SAMPLER++++++++---
OTEL_TRACES_SAMPLER_ARG++++++++---
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT+++++-+-+-
OTEL_ATTRIBUTE_COUNT_LIMIT+++++-+-+-
OTEL_METRIC_EXPORT_INTERVAL+++++++-
OTEL_METRIC_EXPORT_TIMEOUT+-+++++-
OTEL_METRICS_EXEMPLAR_FILTER++++-+-
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE++++++-+-
OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION++++--
OTEL_CONFIG_FILE++++

Declarative configuration

See declarative configuration for details. Disclaimer: Declarative configuration is currently in Development status - work in progress.

FeatureGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Parse a configuration file+++++-
The Parse operation accepts the configuration YAML file format+++++-
The Parse operation performs environment variable substitution+++++-
The Parse operation returns configuration model+++++-
The Parse operation resolves plugin component configuration to properties+++-
Create SDK components++++-
The Create operation accepts configuration model+++++-
The Create operation returns TracerProvider++++-
The Create operation returns MeterProvider+++++-
The Create operation returns LoggerProvider+++++-
The Create operation returns Propagators+++++-
The Create operation calls CreateComponent of corresponding PluginComponentProvider when encountering plugin components+++-
Register a PluginComponentProvider+++-

Exporters

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Exporter interface++++++++++
Exporter interface has ForceFlush++++++-++
Standard output (logging)++++++++++++
In-memory (mock exporter)++++++++++++
OTLPOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
OTLP/gRPC Exporter*++++++++++-
OTLP/HTTP binary Protobuf Exporter*++++++++++-+
OTLP/HTTP JSON Protobuf Exporter+-+--++---
OTLP/HTTP gzip Content-Encoding supportX+++++-+---+
Concurrent sending+++---+---
Honors retryable responses with backoffX+++++-+---
Honors non-retryable responsesX++-++-+---
Honors throttling responseX+--++----
Multi-destination spec complianceX+------
SchemaURL in ResourceSpans and ScopeSpans+++++-
SchemaURL in ResourceMetrics and ScopeMetrics+++-+-
SchemaURL in ResourceLogs and ScopeLogs+++-+-
Honors the user agent spec+++++
Partial Success messages are handled and logged for OTLP/gRPCX+-+
Partial Success messages are handled and logged for OTLP/HTTPX+-+
Metric Exporter configurable temporality preference++++-
Metric Exporter configurable default aggregation+++-
ZipkinOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Zipkin V1 JSONX-++--------
Zipkin V1 ThriftX-+---------
Zipkin V2 JSONX++++-+++++-
Zipkin V2 ProtobufX-++-+------
Service name mapping+++++++++++-
SpanKind mapping+++++++++++-
InstrumentationLibrary mapping++-++-+++++-
InstrumentationScope mapping+-
Boolean attributes+++++++++++-
Array attributes+++++++++++-
Status mapping+++++++++++-
Error Status mapping++++-++++--
Event attributes mapping to Annotations+++++++++++-
Integer microseconds in timestampsN/A+++-+++++-
PrometheusOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwiftKotlin
Metadata Deduplication++-----+----
Name Sanitization++++---++++-
UNIT MetadataX-+++-----+--
Unit SuffixesX++-+---+++--
Unit Full WordsX++-----+----
HELP Metadata++++---++++-
TYPE Metadata++++---++++-
otel_scope_name and otel_scope_version labels on all Metrics++-----+----
otel_scope_[attribute] labels on all Metrics+-----------
otel_scope labels can be disabledX++-----+----
Gauges become Prometheus Gauges++++---+++--
Cumulative Monotonic Sums become Prometheus Counters++++---++++-
Prometheus Counters have _total suffix by default++++---+----
Prometheus Counters _total suffixing can be disabledX+-----------
Cumulative Non-Monotonic Sums become Prometheus Gauges++++---+++--
Delta Non-Monotonic Sums become Cumulative Prometheus CountersX------------
Cumulative Histograms become Prometheus Histograms++++---++++-
Delta Histograms become Cumulative Prometheus HistogramsX------------
Attributes Keys are Sanitized++++---++++-
Colliding sanitized attribute keys are merged++-----+----
Exemplars for Histograms and Monotonic sumsX++----------
target_info metric from ResourceX++++---+----

OpenCensus Compatibility

Languages not covered by the OpenCensus project, or that did not reach Alpha, are not listed here.

FeatureGoJavaJSPythonC++.NETErlang
Trace Bridge++++---
Metric Bridge++-----

OpenTracing Compatibility

Languages not covered by the OpenTracing project do not need to be listed here, e.g. Erlang.

FeatureGoJavaJSPythonRubyPHPRustC++.NETSwift
Create OpenTracing Shim+
Tracer+
Span+
SpanContext+
ScopeManager+
Error mapping for attributes/events+
Migration to OpenTelemetry guide