Compliance of Implementations with Specification

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++.NETSwift
TracerProviderOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
Get active SpanN/A++++++++++
Set active SpanN/A++++++++++
TracerOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
IsValid+++++++++++
IsRemote+++++++++++
Conforms to the W3C TraceContext spec+++++++++++
Support W3C Trace Context Level 2 randomness-
SpanOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
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++.NETSwift
Links can be recorded on span creation++++++++++
Links can be recorded after span creation+++++++
Links order is preserved++++++++++
Span eventsOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
AddEvent+++++++++++
Add order preserved+++++++++++
Safe for concurrent calls+++++++++++
Span exceptionsOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
RecordException+++++++--+-
RecordException with extra parameters+++++++--+-
SamplingOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
Basic support+++++++++++
Use official header name baggage+++++++++++

Metrics

FeatureOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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.-++
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 name of the View can be specified.-++++++++
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.++--++
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

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++.NETSwift
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++.NETSwift
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++.NETSwift
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

Note: Support for environment variables is optional.

FeatureGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
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++.NETSwift
Exporter interface+++++++++
Exporter interface has ForceFlush++++++-+
Standard output (logging)+++++++++++
In-memory (mock exporter)+++++++++++
OTLPOptionalGoJavaJSPythonRubyErlangPHPRustC++.NETSwift
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++.NETSwift
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++.NETSwift
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