Compliance Matrix

The compliance matrix below is based on the OpenTelemetry Specification template.

Traces

Item Status Optional Evidence
TracerProvider / Create TracerProvider + TracerProvider.scala
TracerProvider / Get a Tracer + TracerProvider.scala
TracerProvider / Get a Tracer with schema_url + TracerBuilder.scala
TracerProvider / Get a Tracer with scope attributes -
TracerProvider / Associate Tracer with InstrumentationScope + TracerProvider.scala
TracerProvider / Safe for concurrent calls + SdkTracerProvider.scala, SpanStorage.scala
TracerProvider / Shutdown (SDK only required) -
TracerProvider / ForceFlush (SDK only required) -
Trace / Context interaction / Get active Span + Tracer.scala
Trace / Context interaction / Set active Span + Tracer.scala
Tracer / Create a new Span + Tracer.scala
Tracer / Documentation defines adding attributes at span creation as preferred -
Tracer / Get active Span + Tracer.scala
Tracer / Mark Span active + Tracer.scala
Tracer / Safe for concurrent calls + SdkTracer.scala, SpanStorage.scala
SpanContext / IsValid + SpanContext.scala
SpanContext / IsRemote + SpanContext.scala
SpanContext / Conforms to the W3C TraceContext spec + W3CTraceContextPropagator.scala
SpanContext / Support W3C Trace Context Level 2 randomness + IdGenerator.scala, SdkSpanBuilder.scala, SdkSpanBuilderSuite.scala
Span / Create root span + SdkSpanBuilder.scala
Span / Create with default parent (active span) + SdkSpanBuilder.scala
Span / Create with parent from Context + SdkSpanBuilder.scala
Span / No explicit parent Span/SpanContext allowed -
Span / SpanProcessor.OnStart receives parent Context + SdkSpanBackend.scala
Span / UpdateName + SdkSpanBackend.scala
Span / User-defined start timestamp + SdkSpanBackend.scala
Span / End + SdkSpanBackend.scala
Span / End with timestamp + SdkSpanBackend.scala
Span / IsRecording + SdkSpanBackend.scala, SdkSpanBackendSuite.scala
Span / IsRecording becomes false after End + SdkSpanBackend.scala, SdkSpanBackendSuite.scala
Span / Set status with StatusCode (Unset, Ok, Error) + SdkSpanBackend.scala
Span / Safe for concurrent calls + SdkSpanBackend.scala
Span / events collection size limit + SdkSpanBackend.scala
Span / attribute collection size limit + SdkSpanBackend.scala
Span / links collection size limit + SdkSpanBackend.scala
Span / SpanProcessor.OnEnding - true
Span attributes / SetAttribute + SdkSpanBackend.scala
Span attributes / Set order preserved - true
Span attributes / String type + SdkSpanBackend.scala
Span attributes / Boolean type + SdkSpanBackend.scala
Span attributes / Double floating-point type + SdkSpanBackend.scala
Span attributes / Signed int64 type + SdkSpanBackend.scala
Span attributes / Array of primitives (homogeneous) + SdkSpanBackend.scala
Span attributes / null values documented as invalid/undefined -
Span attributes / Unicode support for keys and string values + SdkSpanBackend.scala
Span linking / Links can be recorded on span creation + SdkSpanBuilder.scala, SdkSpanBackend.scala
Span linking / Links can be recorded after span creation + SdkSpanBuilder.scala, SdkSpanBackend.scala
Span linking / Links order is preserved + SdkSpanBuilder.scala, SdkSpanBackend.scala
Span events / AddEvent + SdkSpanBackend.scala
Span events / Add order preserved + SdkSpanBackend.scala
Span events / Safe for concurrent calls + SdkSpanBackend.scala
Span exceptions / RecordException + SdkSpanBackend.scala
Span exceptions / RecordException with extra parameters + SdkSpanBackend.scala
Sampling / Allow samplers to modify tracestate + SamplingResult.scala
Sampling / ShouldSample gets full parent Context + SdkSpanBuilder.scala, Sampler.scala
Sampling / Sampler: JaegerRemoteSampler -
Sampling / New Span ID created also for non-recording Spans + SdkSpanBuilder.scala
Sampling / IdGenerators + SdkSpanBuilder.scala
Sampling / SpanLimits + true SpanLimits.scala
Sampling / Built-in SpanProcessors implement ForceFlush spec -
Sampling / Attribute Limits + true SpanLimits.scala, SdkSpanBackend.scala
Sampling / Fetch InstrumentationScope from ReadableSpan + SdkSpanBackend.scala
Sampling / TraceIdRatioBased sampler implements OpenTelemetry tracestate th field - true
Sampling / CompositeSampler and built-in ComposableSamplers - true
Sampling / Sampler: AlwaysRecord -

Baggage

Item Status Optional Evidence
Basic support + Baggage.scala
Use official header name baggage + W3CBaggagePropagator.scala

Metrics

Item Status Optional Evidence
The API provides a way to set and get a global default MeterProvider. - true
It is possible to create any number of MeterProviders. + true SdkMeterProvider.scala
MeterProvider provides a way to get a Meter. + MeterProvider.scala
get_meter accepts name, version and schema_url. + MeterProvider.scala, MeterBuilder.scala
get_meter accepts attributes. -
When an invalid name is specified a working Meter implementation is returned as a fallback. + SdkMeterProvider.scala
The fallback Meter name property keeps its original invalid value. - true
Associate Meter with InstrumentationScope. + SdkMeterProvider.scala
Counter instrument is supported. + Meter.scala
AsynchronousCounter instrument is supported. + Meter.scala
Histogram instrument is supported. + Meter.scala
AsynchronousGauge instrument is supported. + Meter.scala
Gauge instrument is supported. + Meter.scala
UpDownCounter instrument is supported. + Meter.scala
AsynchronousUpDownCounter instrument is supported. + Meter.scala
Instruments have name + Meter.scala
Instruments have kind. + Meter.scala
Instruments have an optional unit of measure. + Meter.scala
Instruments have an optional description. + Meter.scala
A valid instrument MUST be created and warning SHOULD be emitted when multiple instruments are registered under the same Meter using the same name. + ViewRegistry.scala
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. + SdkMeterProvider.scala
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. + Histogram.scala, SdkHistogram.scala
Instrument supports the advisory Attributes parameter. -
All methods of MeterProvider are safe to be called concurrently. + SdkMeterProvider.scala, ComponentRegistry.scala
All methods of Meter are safe to be called concurrently. + SdkMeter.scala, MeterSharedState.scala
All methods of any instrument are safe to be called concurrently. + SdkCounter.scala, SynchronousStorage.scala, SynchronousStorage.scala
MeterProvider allows a Resource to be specified. + SdkMeterProvider.scala
A specified Resource can be associated with all the produced metrics from any Meter from the MeterProvider. + SdkMeterProvider.scala
The supplied name, version and schema_url arguments passed to the MeterProvider are used to create an InstrumentationLibrary instance stored in the Meter. + SdkMeterProvider.scala
The supplied name, version and schema_url arguments passed to the MeterProvider are used to create an InstrumentationScope instance stored in the Meter. + SdkMeterProvider.scala
Configuration is managed solely by the MeterProvider. + SdkMeterProvider.scala
The MeterProvider provides methods to update the configuration - true
The updated configuration applies to all already returned Meters. - if above
There is a way to register Views with a MeterProvider. + SdkMeterProvider.scala
The View instrument selection criteria is as specified. + InstrumentSelector.scala
The View instrument selection criteria supports wildcards. + true InstrumentSelector.scala
The View instrument selection criteria supports the match-all wildcard. + InstrumentSelector.scala
The name of the View can be specified. + View.scala
The View allows configuring the name, description, attributes keys and aggregation of the resulting metric stream. + View.scala
The View allows configuring excluded attribute keys of resulting metric stream. + View.scala
The View allows configuring the exemplar reservoir of resulting metric stream. - true
The SDK allows more than one View to be specified per instrument. + true ViewRegistry.scala
The Drop aggregation is available. + Aggregation.scala
The Default aggregation is available. + Aggregation.scala
The Default aggregation uses the specified aggregation by instrument. + Aggregation.scala
The Sum aggregation is available. + Aggregation.scala
The LastValue aggregation is available. + Aggregation.scala
The ExplicitBucketHistogram aggregation is available. + Aggregation.scala, ExplicitBucketHistogramOptions.scala
The ExponentialBucketHistogram aggregation is available. + Aggregation.scala, Base2ExponentialHistogramOptions.scala, ExponentialHistogramAggregator.scala
The metrics Reader implementation supports registering metric Exporters + MetricReader.scala, PeriodicMetricReader.scala
The metrics Reader implementation supports configuring the default aggregation on the basis of instrument kind. + PeriodicMetricReader.scala
The metrics Reader implementation supports configuring the default temporality on the basis of instrument kind. + PeriodicMetricReader.scala
The metrics Exporter has access to the aggregated metrics data (aggregated points, not raw measurements). + MetricExporter.scala
The metrics Exporter export function can not be called concurrently from the same Exporter instance. + PeriodicMetricReader.scala
The metrics Exporter export function does not block indefinitely. + PeriodicMetricReader.scala
The metrics Exporter export function receives a batch of metrics. + MetricExporter.scala
The metrics Exporter export function returns Success or Failure. + PeriodicMetricReader.scala
The metrics Exporter provides a ForceFlush function. + MetricExporter.scala
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. + ExemplarReservoir.scala
Exemplar sampling can be disabled. + ExemplarReservoir.scala
The metrics SDK supports SDK-wide exemplar filter configuration + ExemplarFilterAutoConfigure.scala
The metrics SDK supports TraceBased exemplar filter + ExemplarFilter.scala
The metrics SDK supports AlwaysOn exemplar filter + ExemplarFilter.scala
The metrics SDK supports AlwaysOff exemplar filter + ExemplarFilter.scala
Exemplars retain any attributes available in the measurement that are not preserved by aggregation or view configuration. + ExemplarData.scala
Exemplars contain the associated trace id and span id of the active span in the Context when the measurement was taken. + ExemplarData.scala
Exemplars contain the timestamp when the measurement was taken. + ExemplarData.scala
The metrics SDK provides an ExemplarReservoir interface or extension point. + ExemplarReservoir.scala
An ExemplarReservoir has an offer method with access to the measurement value, attributes, Context and timestamp. + ExemplarReservoir.scala
The metrics SDK provides a SimpleFixedSizeExemplarReservoir that is used by default for all aggregations except ExplicitBucketHistogram. + ExemplarReservoir.scala
The metrics SDK provides an AlignedHistogramBucketExemplarReservoir that is used by default for ExplicitBucketHistogram aggregation. + ExemplarReservoir.scala
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 + SynchronousStorage.scala
Metric SDK supports configuring cardinality limit at MeterReader level + CardinalityLimitSelector.scala
Metric SDK supports configuring cardinality limit per metric (using Views) + View.scala

Logs

Item Status Optional Evidence
LoggerProvider.Get Logger + LoggerProvider.scala
LoggerProvider.Get Logger accepts attributes -
LoggerProvider.Shutdown -
LoggerProvider.ForceFlush -
Logger.Emit(LogRecord) + SdkLogRecordBuilder.scala
LogRecord.Set EventName + SdkLogRecordBuilder.scala
Logger.Enabled + true SdkLogger.scala, SdkLoggerProvider.scala
Ergonomic API - true
SimpleLogRecordProcessor + SimpleLogRecordProcessor.scala
BatchLogRecordProcessor + BatchLogRecordProcessor.scala, BatchLogRecordProcessorSuite.scala
Can plug custom LogRecordProcessor + SdkLoggerProvider.scala
LogRecordProcessor.Enabled - true
OTLP/gRPC exporter + OtlpLogRecordExporter.scala
OTLP/HTTP exporter + OtlpLogRecordExporter.scala
OTLP File exporter -
Can plug custom LogRecordExporter + LogRecordExportersAutoConfigure.scala
Trace Context Injection + SdkLogRecordBuilder.scala

Resource

Item Status Optional Evidence
Create from Attributes + TelemetryResource.scala
Create empty + TelemetryResource.scala
Merge (v2) + TelemetryResource.scala
Retrieve attributes + TelemetryResource.scala
Default value for service.name + TelemetryResource.scala
Resource detector interface/mechanism + TelemetryResourceAutoConfigure.scala
Resource detectors populate Schema URL + TelemetryResourceDetectorSuite.scala, HostDetectorPlatform.scala

Context Propagation

Item Status Optional Evidence
Create Context Key + Context.scala
Get value from Context + Context.scala
Set value for Context + Context.scala
Attach Context + TraceScope.scala
Detach Context + TraceScope.scala
Get current Context + TraceScope.scala
Composite Propagator + TextMapPropagator.scala
Global Propagator -
TraceContext Propagator + W3CTraceContextPropagator.scala
B3 Propagator + B3Propagator.scala
Jaeger Propagator + JaegerPropagator.scala
OT Propagator + OtTracePropagator.scala
OpenCensus Binary Propagator -
TextMapPropagator + TextMapPropagator.scala
Fields + TextMapPropagator.scala
Setter argument + true TextMapPropagator.scala
Getter argument + true TextMapPropagator.scala
Getter argument returning Keys + true JaegerPropagator.scala

Environment Variables

Item Status Optional Evidence
OTEL_SDK_DISABLED + CommonConfigKeys.scala, OpenTelemetrySdk.scala
OTEL_RESOURCE_ATTRIBUTES + TelemetryResourceAutoConfigure.scala
OTEL_SERVICE_NAME + TelemetryResourceAutoConfigure.scala
OTEL_LOG_LEVEL -
OTEL_PROPAGATORS + ContextPropagatorsAutoConfigure.scala
OTEL_BSP_* + BatchSpanProcessorAutoConfigure.scala
OTEL_BLRP_* + BatchLogRecordProcessorAutoConfigure.scala
OTEL_EXPORTER_OTLP_* + OtlpClientAutoConfigure.scala
OTEL_EXPORTER_ZIPKIN_* -
OTEL_TRACES_EXPORTER + SpanExportersAutoConfigure.scala
OTEL_METRICS_EXPORTER + MetricExportersAutoConfigure.scala
OTEL_LOGS_EXPORTER + LogRecordExportersAutoConfigure.scala
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_SPAN_EVENT_COUNT_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_SPAN_LINK_COUNT_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_LINK_ATTRIBUTE_COUNT_LIMIT + SpanLimitsAutoConfigure.scala
OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT + LogRecordLimitsAutoConfigure.scala, LogRecordLimitsAutoConfigureSuite.scala
OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT + LogRecordLimitsAutoConfigure.scala, LogRecordLimitsAutoConfigureSuite.scala
OTEL_TRACES_SAMPLER + SamplerAutoConfigure.scala
OTEL_TRACES_SAMPLER_ARG + SamplerAutoConfigure.scala
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT + AttributeLimitsConfigurer.scala, LogRecordLimitsAutoConfigureSuite.scala, SpanLimitsAutoConfigureSuite.scala
OTEL_ATTRIBUTE_COUNT_LIMIT + AttributeLimitsConfigurer.scala, LogRecordLimitsAutoConfigureSuite.scala, SpanLimitsAutoConfigureSuite.scala
OTEL_METRIC_EXPORT_INTERVAL + MetricReadersAutoConfigure.scala
OTEL_METRIC_EXPORT_TIMEOUT + MetricReadersAutoConfigure.scala
OTEL_METRICS_EXEMPLAR_FILTER + ExemplarFilterAutoConfigure.scala
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + OtlpMetricExporterAutoConfigure.scala, OtlpMetricExporterAutoConfigureSuite.scala
OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION + OtlpMetricExporterAutoConfigure.scala, OtlpMetricExporterAutoConfigureSuite.scala
OTEL_EXPERIMENTAL_CONFIG_FILE -

Declarative configuration

Item Status Optional Evidence
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 extension 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 CreatePlugin of corresponding ComponentProvider when encountering extension components -
Register a ComponentProvider -

Exporters

Item Status Optional Evidence
Exporter interface + SpanExporter.scala
Exporter interface has ForceFlush + SpanExporter.scala
Standard output (logging) + ConsoleSpanExporter.scala, ConsoleMetricExporter.scala, ConsoleLogRecordExporter.scala
In-memory (mock exporter) + InMemorySpanExporter.scala, InMemoryMetricExporter.scala, InMemoryLogRecordExporter.scala
OTLP / OTLP/gRPC Exporter + OtlpSpanExporter.scala
OTLP / OTLP/HTTP binary Protobuf Exporter + OtlpSpanExporter.scala
OTLP / OTLP/HTTP JSON Protobuf Exporter + OtlpSpanExporter.scala
OTLP / OTLP/HTTP gzip Content-Encoding support + true OtlpClient.scala
OTLP / Concurrent sending + SpanExporter.scala
OTLP / Honors retryable responses with backoff + true OtlpClient.scala, OtlpClient.scala
OTLP / Honors non-retryable responses - true
OTLP / Honors throttling response - true
OTLP / Multi-destination spec compliance - true
OTLP / SchemaURL in ResourceSpans and ScopeSpans + SpansProtoEncoder.scala
OTLP / SchemaURL in ResourceMetrics and ScopeMetrics + MetricsProtoEncoder.scala
OTLP / SchemaURL in ResourceLogs and ScopeLogs + LogsProtoEncoder.scala
OTLP / Honors the user agent spec + OtlpClient.scala
OTLP / Partial Success messages are handled and logged for OTLP/gRPC + true OtlpClient.scala, SpansProtoEncoder.scala, MetricsProtoEncoder.scala, LogsProtoEncoder.scala
OTLP / Partial Success messages are handled and logged for OTLP/HTTP - true
OTLP / Metric Exporter configurable temporality preference + OtlpMetricExporter.scala
OTLP / Metric Exporter configurable default aggregation + OtlpMetricExporter.scala
Zipkin / Zipkin V1 JSON - true
Zipkin / Zipkin V1 Thrift - true
Zipkin / Zipkin V2 JSON - true
Zipkin / Zipkin V2 Protobuf - true
Zipkin / Service name mapping -
Zipkin / SpanKind mapping -
Zipkin / InstrumentationLibrary mapping -
Zipkin / InstrumentationScope mapping -
Zipkin / Boolean attributes -
Zipkin / Array attributes -
Zipkin / Status mapping -
Zipkin / Error Status mapping -
Zipkin / Event attributes mapping to Annotations -
Zipkin / Integer microseconds in timestamps -
Prometheus / Metadata Deduplication + PrometheusWriter.scala
Prometheus / Name Sanitization + PrometheusConverter.scala
Prometheus / UNIT Metadata + true PrometheusConverter.scala
Prometheus / Unit Suffixes + true PrometheusWriter.scala
Prometheus / Unit Full Words + true PrometheusConverter.scala
Prometheus / HELP Metadata + PrometheusWriter.scala
Prometheus / TYPE Metadata + PrometheusWriter.scala
Prometheus / otelscopename and otelscopeversion labels on all Metrics + PrometheusWriter.scala
Prometheus / otelscope'attribute' labels on all Metrics + PrometheusWriter.scala
Prometheus / otel_scope labels can be disabled + true PrometheusWriter.scala
Prometheus / Gauges become Prometheus Gauges + PrometheusWriter.scala
Prometheus / Cumulative Monotonic Sums become Prometheus Counters + PrometheusWriter.scala
Prometheus / Prometheus Counters have _total suffix by default + PrometheusWriter.scala
Prometheus / Prometheus Counters _total suffixing can be disabled + true PrometheusWriter.scala
Prometheus / Cumulative Non-Monotonic Sums become Prometheus Gauges + PrometheusWriter.scala
Prometheus / Delta Non-Monotonic Sums become Cumulative Prometheus Counters - true
Prometheus / Cumulative Histograms become Prometheus Histograms + PrometheusWriter.scala
Prometheus / Delta Histograms become Cumulative Prometheus Histograms - true
Prometheus / Attributes Keys are Sanitized + PrometheusConverter.scala
Prometheus / Colliding sanitized attribute keys are merged + PrometheusWriter.scala
Prometheus / Exemplars for Histograms and Monotonic sums - true
Prometheus / target_info metric from Resource + true PrometheusWriter.scala

OpenCensus Compatibility

Item Status Optional Evidence
Trace Bridge -
Metric Bridge -

OpenTracing Compatibility

Item Status Optional Evidence
Create OpenTracing Shim -
Tracer -
Span -
SpanContext -
ScopeManager -
Error mapping for attributes/events -
Migration to OpenTelemetry guide -