1.0.0
First stable release. Hardens the runtime under contention and at high cardinality, brings the OTLP path up to spec, fixes deadlock and leak risks in the export pipeline, and lands a full audit of the documentation against the actual public API.
Added
OTEL_METRIC_CARDINALITY_LIMIT(default 2000) caps distinct label sets per vector metric. Excess label sets aggregate into one shared series taggedotel.metric.overflow=true. Dropped count exposed viainstrument_registry:cardinality_dropped/1.instrument_otlp_retrymodule: bounded exponential backoff withRetry-Afterhonoured, classifying transport and HTTP errors per the OTel spec. Configurable viaOTEL_EXPORTER_OTLP_MAX_RETRIES,OTEL_EXPORTER_OTLP_RETRY_INITIAL_DELAY_MS,OTEL_EXPORTER_OTLP_RETRY_MAX_DELAY_MS.- Span attribute value length limit (
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT), per-event and per-link attribute count limits (OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT,OTEL_LINK_ATTRIBUTE_COUNT_LIMIT); excess attributes counted indropped_attributes_countand emitted asdroppedAttributesCountin OTLP. - Tracestate caps at 32 entries / 256 bytes; baggage caps at 180 entries / 8192 bytes per W3C trace-context.
instrument_attributes:apply_limits/2,3andtruncate_value/2helpers.- Span Export Path section in the design and internals guide explaining the full chain from
end_spanto OTLP, with explicit notes thatinstrument_tracer_nifserves the flight recorder only. - Test coverage for 28 documented public APIs that previously had no call sites in CT (propagation
inject_headers/extract_headers/call_with_context/cast_with_context, contextremove_value/spawn_link_with_context, configset_verbose_tracing/is_verbose_tracing/enable_exporter/disable_exporter, tracerrecord_exception/update_name,instrument_test:assert_log_trace_context, loggeradd_trace_context/emit, metricremove_label/clear_labels/set_gauge_to_current_time, exporter callback contracts).
Changed
- Batch processor
force_flush/0and the max-batch-size trigger no longer block the gen_server loop. An export worker is spawned and completion arrives as{export_done, ...}; concurrent flush callers are batched and replied to viagen_server:reply/2. A kill timer enforcesexport_timeout_milliswithout blocking the loop. instrument_exportershutdown now casts the hook unregister so the reply path stays unblocked.instrument_span_processor:on_start/2now has a 5 s safety timeout; the tracer hot path uses the inlinepersistent_termform.- OTLP exporters return
{error, retryable, _}vs{error, permanent, _}. The batch processor keeps retryable batches for up tomax_batch_retriescycles and drops permanent errors. - Probability sampler hashes the upper 8 bytes of the trace id, matching the Java/Go/Python reference SDKs.
- Status transitions now follow the OTel spec:
unset -> ok|error,error -> ok(success overrides),error -> errorupdates the description,okis final. - Batch processor clamps
max_export_batch_sizetomax_queue_sizeon init with a warning. - Documentation snippets fixed across
guides/,book/, andREADME.md: 6 syntax bugs, 8+ calls to non-existent or wrong-arity functions, wrong arg shapes forset_sampler,parent_basedconfig,metric_viewrecord literal,exporter_otlp:export, and stale config keys (schedule_delay_millis,export_timeout_millis). - Book chapter prose smoothed for readability.
Fixed
- Histogram exemplar reservoirs are now freed on unregister.
- Registry unregister no longer scans the global
persistent_termindex; iterates the metric's ownlabels_mapinstead. - Baggage
set/remove/clearuseset_current/1so process-dictionary context tokens no longer accumulate. instrument_exporter_console:export/2andinstrument_metrics_exporter_console:exporter_export/2no longer crash when configured withoutput => {file, Path}. The{file, Fd}wrapper used byshutdown/1is now unwrapped beforeio:put_chars/2.
Removed
instrument_exporter_kafkadocumentation section: the module never existed insrc/exporters/.