| MeterProvider |
Builder supports resource, views, readers, producers |
Compliant |
SdkMeterProvider.scala |
|
| MeterProvider |
Default config (default resource, no readers/producers, noop lookup) |
Compliant |
SdkMeterProvider.scala |
|
| MeterProvider |
ForceFlush / Shutdown support |
Partial |
MeterProviderAutoConfigure.scala |
Provider lifecycle is Resource-managed; no explicit shutdown/forceFlush API in core interface |
| Meter |
Noop meter when no readers configured |
Compliant |
SdkMeterProvider.scala |
|
| Views |
View + selector registry |
Compliant |
ViewRegistry.scala, MetricStorageRegistry.scala, MeterSharedState.scala |
Selector matching and duplicate-name conflict warning are implemented |
| Aggregation |
Aggregation + selectors + temporality selectors |
Partial |
Aggregation.scala, AggregationSelector.scala, AggregationTemporalitySelector.scala, Aggregator.scala |
Aggregation.Sum compatibility set omits ObservableCounter, so View.withAggregation(Aggregation.sum) is treated as incompatible for that instrument |
| Explicit Bucket Histogram Aggregation |
RecordMinMax config parameter |
Compliant |
ExplicitBucketHistogramOptions.scala, Aggregation.scala, ExplicitBucketHistogramAggregator.scala |
recordMinMax=false suppresses min/max while keeping count and sum |
| Attribute limits |
Attributes are exempt from limits |
Not Applicable |
|
Spec states metric attributes are exempt from attribute limits |
| Cardinality limits |
Default 2000 + overflow attribute + warning |
Compliant |
CardinalityLimitSelector.scala, SynchronousStorage.scala, AsynchronousStorage.scala |
Uses otel.metric.overflow attribute on overflow |
| Exemplar |
Exemplar data + filters + reservoirs |
Compliant |
ExemplarFilter.scala, ExemplarFilter.scala, ExemplarReservoir.scala, Reservoirs.scala, ExemplarData.scala |
AlwaysOn/AlwaysOff/TraceBased filters and fixed-size/histogram reservoirs are implemented |
| Exemplar |
Custom ExemplarReservoir per-view configurability |
Partial |
View.scala |
View does not expose reservoir configuration |
| MetricReader |
Interface + periodic reader |
Partial |
MetricReader.scala, PeriodicMetricReader.scala, PeriodicMetricReader.scala |
forceFlush performs collection and calls exporter flush; lifecycle remains Resource-managed and there is no explicit shutdown API. |
| MetricReader |
Prevent registration on multiple MeterProviders |
Partial |
PeriodicMetricReader.scala |
Logs warning but does not error |
| MetricExporter |
Push/Pull interfaces + noop |
Partial |
MetricExporter.scala, MetricExporter.scala, MetricExporter.scala |
Push/pull interfaces and noop are implemented; flush covers force-flush semantics, but explicit exporter shutdown is missing. |
| MetricProducer |
Interface + registration |
Compliant |
MetricProducer.scala, MetricReader.scala, PeriodicMetricReader.scala |
produce API exists and producers are registered by reader |
| MetricFilter |
Filtering support |
Not Implemented |
SdkMeterProvider.scala, SdkMeterProvider.scala |
No MetricFilter API or implementation found; builder/configuration path supports views and exemplar filtering only |
| Temporality |
Delta/Cumulative collection semantics |
Compliant |
SynchronousStorage.scala, AsynchronousStorage.scala, RegisteredReader.scala |
Delta uses per-reader last-collect timestamp and reset/diff semantics; cumulative uses stable start times |
| Numerical limits |
Handling for NaN/Inf, etc. |
Partial |
SynchronousStorage.scala |
Drops NaN for synchronous double values; no explicit Inf handling |