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 (OTLP, Zipkin, and Jaeger), implementing at least one of the supported
formats is required. Implementing more than one format is optional.
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
TracerProvider | ||||||||||||
Create TracerProvider | + | + | + | + | + | + | + | + | + | + | + | |
Get a Tracer | + | + | + | + | + | + | + | + | + | + | + | |
Get a Tracer with schema_url | + | + | ||||||||||
Safe for concurrent calls | + | + | + | + | + | + | + | + | + | + | + | |
Shutdown (SDK only required) | + | + | + | + | + | - | + | + | + | + | ||
ForceFlush (SDK only required) | + | + | - | + | + | - | + | + | + | + | ||
Trace / Context interaction | ||||||||||||
Get active Span | N/A | + | + | + | + | + | + | + | + | + | ||
Set active Span | N/A | + | + | + | + | + | + | + | + | + | ||
Tracer | ||||||||||||
Create a new Span | + | + | + | + | + | + | + | + | + | + | + | |
Get active Span | N/A | + | + | + | + | + | + | + | + | + | + | |
Mark Span active | N/A | + | + | + | + | + | + | + | + | + | + | |
Safe for concurrent calls | + | + | + | + | + | + | + | + | + | + | + | |
SpanContext | ||||||||||||
IsValid | + | + | + | + | + | + | + | + | + | + | + | |
IsRemote | + | + | + | + | + | + | + | + | + | + | + | |
Conforms to the W3C TraceContext spec | + | + | + | + | + | + | + | + | + | + | ||
Span | ||||||||||||
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 | + | + | + | + | + | - | + | - | - | + | ||
Span attributes | ||||||||||||
SetAttribute | + | + | + | + | + | + | + | + | + | + | + | |
Set order preserved | X | + | - | + | + | + | + | + | + | + | + | + |
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 linking | ||||||||||||
Links can be recorded on span creation | + | + | + | + | ||||||||
Links order is preserved | + | + | + | + | ||||||||
Span events | ||||||||||||
AddEvent | + | + | + | + | + | + | + | + | + | + | + | |
Add order preserved | + | + | + | + | + | + | + | + | + | + | + | |
Safe for concurrent calls | + | + | + | + | + | + | + | + | + | + | + | |
Span exceptions | ||||||||||||
RecordException | - | + | + | + | + | - | + | - | + | - | ||
RecordException with extra parameters | - | + | + | + | + | - | + | - | + | - | ||
Sampling | ||||||||||||
Allow samplers to modify tracestate | + | + | + | + | + | + | + | - | + | |||
ShouldSample gets full parent Context | + | + | + | + | + | + | + | + | - | + | ||
New Span ID created also for non-recording Spans | + | + | + | + | + | + | + | - | + | |||
IdGenerators | + | + | + | + | + | + | + | |||||
SpanLimits | X | + | + | + | + | - | + | |||||
Built-in SpanProcessor s implement ForceFlush spec |
+ | + | + | + | ||||||||
Attribute Limits | X |
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Basic support | + | + | + | + | + | + | + | + | + | + | ||
Use official header name baggage |
+ | + | + | + | + | + | + | + | + | + |
Status: Experimental
Disclaimer: this list of features is still a work in progress, please refer to the specification if in any doubt.
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
The API provides a way to set and get a global default MeterProvider . |
||||||||||||
It is possible to create any number of MeterProvider s. |
||||||||||||
MeterProvider provides a way to get a Meter . |
||||||||||||
get_meter accepts name, version and schema_url . |
||||||||||||
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. |
||||||||||||
New configuration applies to previously returned Meter s. |
||||||||||||
The meter provides functions to create a new Counter . |
||||||||||||
The meter provides functions to create a new AsynchronousCounter . |
||||||||||||
The meter provides functions to create a new Histogram . |
||||||||||||
The meter provides functions to create a new AsynchronousGauge . |
||||||||||||
The meter provides functions to create a new UpDownCounter . |
||||||||||||
The meter provides functions to create a new AsynchronousUpDownCounter . |
||||||||||||
Instruments have name |
||||||||||||
Instruments have kind. | ||||||||||||
Instruments have an optional unit of measure. | ||||||||||||
Instruments have an optional description. | ||||||||||||
An error is returned when multiple instruments are registered under the same Meter using the same name . |
||||||||||||
It is possible to register two instruments with same name under different Meter s. |
||||||||||||
Instrument names conform to the specified syntax. | ||||||||||||
Instrument units conform to the specified syntax. | ||||||||||||
Instrument descriptions conform to the specified syntax. | ||||||||||||
create_counter returns a Counter object. |
||||||||||||
The API for Counter accepts the name of the instrument. |
||||||||||||
The API for Counter accepts the unit of the instrument. |
||||||||||||
The API for Counter accepts the description of the instrument. |
||||||||||||
Counter has an add method. |
||||||||||||
The add method returns null (this can vary depending on the language). |
||||||||||||
The add method accepts optional attributes. |
||||||||||||
The add method accepts the increment amount. |
||||||||||||
The add method of Counter accepts only positive amounts. |
||||||||||||
create_asynchronous_counter returns an AsynchronousCounter object. |
||||||||||||
The API for AsynchronousCounter accepts the name of the instrument. |
||||||||||||
The API for AsynchronousCounter accepts the unit of the instrument. |
||||||||||||
The API for AsynchronousCounter accepts the description of the instrument. |
||||||||||||
The API for AsynchronousCounter accepts a callback. |
||||||||||||
AsynchronousCounter has an add method. |
||||||||||||
The add method does not return a value or returns a null value. |
||||||||||||
The add method accepts optional attributes. |
||||||||||||
The add method accepts the increment amount. |
||||||||||||
The add method accepts only positive amounts. |
||||||||||||
The callback function of an Asynchronous instrument does not block indefinitely. |
||||||||||||
The callback function reports Measurement s. |
||||||||||||
There is a way to pass state to the callback. | ||||||||||||
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 . |
||||||||||||
Configuration can be managed by the MeterProvider . |
||||||||||||
The MeterProvider provides methods to update the configuration |
||||||||||||
The updated configuration applies to all already returned Meter s. |
||||||||||||
There is a way to register View s with a MeterProvider . |
||||||||||||
The View instrument selection criteria is as specified. |
||||||||||||
The name of the View can be specified. |
||||||||||||
The configuration for the metrics stream is as specified. | ||||||||||||
The specified logic is used to process Measurement s made by an instrument. |
||||||||||||
The None aggregation is available. |
||||||||||||
The None aggregation drops all measurements. |
||||||||||||
The Default aggregation is available. |
||||||||||||
The Default aggregation uses the specified aggregation. |
||||||||||||
The Sum aggregation is available. |
||||||||||||
The Sum aggregation performs as specified. |
||||||||||||
The LastValue aggregation is available. |
||||||||||||
The LastValue aggregation performs as specified. |
||||||||||||
The Histogram aggregation is available. |
||||||||||||
The Histogram aggregation performs as specified. |
||||||||||||
The explicit bucket Histogram aggregation is available. |
||||||||||||
The explicit bucket Histogram aggregation performs as specified. |
||||||||||||
A MeasurementProcessor allows hooks when a Measurement is recorded by an instrument. |
||||||||||||
A MeasurementProcessor has access to The Measurement, Instrument and Resource. |
||||||||||||
If a Measurement is reported by a synchronous Instrument, Then a MeasurementProcessor has access to the Baggage , Context and Span associated with the Measurement . |
||||||||||||
The metrics exporter has access to the pre aggregated metrics data. | ||||||||||||
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 wether it succeeded, failed or timed out. |
||||||||||||
The metrics exporter provides a shutdown function. |
||||||||||||
The metrics exporter shutdown function do not block indefinitely. |
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Create from Attributes | + | + | + | + | + | + | + | + | + | + | ||
Create empty | + | + | + | + | + | + | + | + | + | + | ||
Merge (v2) | + | + | + | + | + | + | + | + | ||||
Retrieve attributes | + | + | + | + | + | + | + | + | + | + | ||
Default value for service.name | + | + | + | + | + | + | + | |||||
Resource detector interface/mechanism | + | + | + | + | + | + | - | + | + | + | + | |
Resource detectors populate Schema URL | + |
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Create Context Key | + | + | + | + | + | + | + | + | + | + | + | |
Get value from Context | + | + | + | + | + | + | + | + | + | + | + | |
Set value for Context | + | + | + | + | + | + | + | + | + | + | + | |
Attach Context | N/A | + | + | + | + | + | + | + | + | - | - | |
Detach Context | N/A | + | + | + | + | + | + | + | + | - | - | |
Get current Context | N/A | + | + | + | + | + | + | + | + | + | + | |
Composite Propagator | + | + | + | + | + | N/A | + | + | + | + | ||
Global Propagator | + | + | + | + | + | + | + | + | + | + | ||
TraceContext Propagator | + | + | + | + | + | + | + | + | + | + | ||
B3 Propagator | + | + | + | + | + | + | + | + | + | + | ||
Jaeger Propagator | + | + | + | + | + | + | + | + | - | - | ||
TextMapPropagator | + | |||||||||||
Fields | + | + | + | + | + | + | + | + | + | + | ||
Setter argument | X | N/A | + | + | + | + | + | N/A | + | + | + | |
Getter argument | X | N/A | + | + | + | + | + | N/A | + | + | + | |
Getter argument returning Keys | X | N/A | + | + | + | + | + | N/A | + | - | + |
Note: Support for environment variables is optional.
Feature | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|
OTEL_RESOURCE_ATTRIBUTES | + | + | + | + | + | + | - | + | + | + | - |
OTEL_SERVICE_NAME | + | ||||||||||
OTEL_LOG_LEVEL | - | - | + | - | + | + | - | - | - | - | |
OTEL_PROPAGATORS | - | + | + | + | + | - | - | - | - | - | |
OTEL_BSP_* | - | + | + | + | + | - | + | - | - | - | |
OTEL_EXPORTER_OTLP_* | + | + | + | + | - | - | + | + | - | - | |
OTEL_EXPORTER_JAEGER_* | + | - | - | - | + | - | |||||
OTEL_EXPORTER_ZIPKIN_* | - | - | - | - | - | - | - | ||||
OTEL_TRACES_EXPORTER | - | + | + | + | + | - | - | ||||
OTEL_METRICS_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_TRACES_SAMPLER | - | + | + | + | + | - | - | ||||
OTEL_TRACES_SAMPLER_ARG | - | + | + | + | + | - | - | ||||
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT | |||||||||||
OTEL_ATTRIBUTE_COUNT_LIMIT |
Feature | Optional | Go | Java | JS | Python | Ruby | Erlang | PHP | Rust | C++ | .NET | Swift |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Exporter interface | + | + | + | + | + | |||||||
Exporter interface has ForceFlush |
+ | - | + | - | ||||||||
Standard output (logging) | + | + | + | + | + | + | - | + | + | + | + | |
In-memory (mock exporter) | + | + | + | + | + | + | - | - | + | + | + | |
OTLP | ||||||||||||
OTLP/gRPC Exporter | * | + | + | + | + | + | + | + | + | + | ||
OTLP/HTTP binary Protobuf Exporter | * | + | + | + | + | + | + | + | + | + | - | |
OTLP/HTTP JSON Protobuf Exporter | + | - | + | - | - | + | - | - | ||||
OTLP/HTTP gzip Content-Encoding support | X | + | + | + | + | + | - | - | - | - | ||
Concurrent sending | - | + | + | - | - | + | - | - | - | |||
Honors retryable responses with backoff | X | + | + | + | + | - | - | - | - | |||
Honors non-retryable responses | X | + | - | + | + | - | - | - | - | |||
Honors throttling response | X | + | - | + | + | - | - | - | - | |||
Multi-destination spec compliance | X | + | - | - | - | - | - | |||||
SchemaURL in ResourceSpans and InstrumentationLibrarySpans | + | |||||||||||
SchemaURL in ResourceMetrics and InstrumentationLibraryMetrics | ||||||||||||
SchemaURL in ResourceLogs and InstrumentationLibraryLogs | ||||||||||||
Zipkin | ||||||||||||
Zipkin V1 JSON | X | - | + | + | - | - | - | - | - | - | - | |
Zipkin V1 Thrift | X | - | + | - | - | - | - | - | - | - | - | |
Zipkin V2 JSON | * | + | + | + | + | - | + | + | + | + | + | |
Zipkin V2 Protobuf | * | - | + | + | - | + | - | - | - | - | ||
Service name mapping | + | + | + | + | + | + | + | + | + | + | + | |
SpanKind mapping | + | + | + | + | + | + | + | + | + | + | + | |
InstrumentationLibrary mapping | + | + | - | + | + | - | - | + | + | + | + | |
Boolean attributes | + | + | + | + | + | + | + | + | + | + | + | |
Array attributes | + | + | + | + | + | + | + | + | + | + | + | |
Status mapping | + | + | + | + | + | + | + | + | + | + | + | |
Error Status mapping | + | + | + | + | + | + | - | |||||
Event attributes mapping to Annotations | + | + | + | + | + | + | + | + | + | + | + | |
Integer microseconds in timestamps | N/A | + | + | + | + | + | + | + | ||||
Jaeger | ||||||||||||
Jaeger Thrift over UDP | * | + | + | + | + | + | + | + | ||||
Jaeger Protobuf via gRPC | * | - | + | - | - | - | - | - | ||||
Jaeger Thrift over HTTP | * | + | + | + | + | + | + | - | - | |||
Service name mapping | + | + | + | + | + | + | + | |||||
Resource to Process mapping | + | + | + | + | + | - | + | - | ||||
InstrumentationLibrary mapping | + | + | + | + | + | - | + | - | ||||
Status mapping | + | + | + | + | + | + | + | + | ||||
Error Status mapping | + | + | + | + | + | + | + | - | ||||
Events converted to Logs | + | + | + | + | + | - | + | + | ||||
OpenCensus | ||||||||||||
TBD | ||||||||||||
Prometheus | ||||||||||||
TBD |