Compliance of Implementations with Specification
Maps OpenTelemetry specification features to Haskell implementation status using a compliance table.
View sourceWhat this file does
Maps OpenTelemetry specification features to Haskell implementation status using a compliance table.
When to use it
- Check which trace, baggage, resource, context propagation, and exporter features are supported
- Identify gaps before adopting hs-opentelemetry in a project
- Track progress when contributing new features to the library
- Compare Haskell implementation against other language SDKs
Assumes this stack
Compliance of Implementations with Specification
The following tables show which features are implemented by the Haskell OpenTelemetry 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.
Traces
| Feature | Optional | Haskell |
|---|---|---|
| TracerProvider | + | |
| Create TracerProvider | + | |
| Get a Tracer | + | |
| Get a Tracer with schema_url | (partial) | |
| Safe for concurrent calls | + | |
| Shutdown (SDK only required) | + | |
| ForceFlush (SDK only required) | + | |
| Trace / Context interaction | + | |
| Get active Span | + | |
| Set active Span | + | |
| Tracer | + | |
| Create a new Span | + | |
| Get active Span | + | |
| Mark Span active | + | |
| Safe for concurrent calls | + | |
| SpanContext | + | |
| IsValid | + | |
| IsRemote | + | |
| Conforms to the W3C TraceContext spec | (partial) | |
| Span | + | |
| Create root span | + | |
| Create with default parent (active span) | + | |
| Create with parent from Context | + | |
| No explicit parent Span/SpanContext allowed | + | |
| Processor.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 | |
| 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 | + | |
| ShouldSample gets InstrumentationLibrary | + | |
| New Span ID created also for non-recording Spans | + | |
| IdGenerators | + | |
| SpanLimits | X | + |
Built-in Processors implement ForceFlush spec | + | |
| Attribute Limits | X | + |
Baggage
| Feature | Optional | Haskell |
|---|---|---|
| Basic support | + | |
Use official header name baggage | + |
Metrics
| Feature | Optional | Haskell |
|---|---|---|
| TBD |
Resource
| Feature | Optional | Haskell |
|---|---|---|
| Create from Attributes | + | |
| Create empty | + | |
| Merge (v2) | ? | |
| Retrieve attributes | + | |
| Default value for service.name | + |
Context Propagation
| Feature | Optional | Haskell |
|---|---|---|
| Create Context Key | + | |
| Get value from Context | + | |
| Set value for Context | + | |
| Attach Context | + | |
| Detach Context | + | |
| Get current Context | + | |
| Composite Propagator | + (monoid instance) | |
| Global Propagator | + | |
| TraceContext Propagator | (partial support) | |
| B3 Propagator | ||
| Jaeger Propagator | ||
| TextMapPropagator | + | |
| Fields | ||
| Setter argument | X | |
| Getter argument | X | |
| Getter argument returning Keys | X |
Environment Variables
Note: Support for environment variables is optional.
| Feature | Haskell |
|---|---|
| OTEL_SDK_DISABLED | + |
| OTEL_RESOURCE_ATTRIBUTES | + |
| OTEL_SERVICE_NAME | + |
| OTEL_LOG_LEVEL | |
| OTEL_PROPAGATORS | + |
| OTEL_BSP_* | + |
| OTEL_EXPORTER_OTLP_* | (partial support) |
| OTEL_EXPORTER_JAEGER_* | |
| OTEL_EXPORTER_ZIPKIN_* | |
| OTEL_TRACES_EXPORTER | (partial support) |
| 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 | + |
Exporters
| Feature | Optional | Haskell |
|---|---|---|
| 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 | (partial support) |
| Multi-destination spec compliance | X | |
| 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 | ||
| 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 |
What's inside
8 feature tables (Traces, Baggage, Metrics, Resource, Context Propagation, Environment Variables, Exporters) with status symbols.
Change this for your project
- Replace
iand675/hs-opentelemetrywith your own repository name if forking - Update the
Haskellcolumn header to match your language or implementation name - Change
(partial support)entries to reflect your actual implementation status
Where it goes
Keep in docs/ or alongside the feature. Agents read it to implement against a defined contract.
Worth borrowing
- Use
+,-,N/A, and blank cells to denote compliance levels clearly - Separate optional and required features with a dedicated column
Related Documents
GPU Selection Guide for Large Language Models (LLMs)
Guides GPU selection for LLM inference, fine-tuning, and training by mapping model sizes, precision levels, and budgets to VRAM requirements.
Community AI Agent Skills Discovery Sources
Catalogs 50+ platforms, repositories, directories, and communities for discovering and sharing AI agent skills across multiple coding tools.
ReleaseKit - Technical Requirements Document
Specifies a Go library and CLI for release automation with conventional commit parsing, validation checks, and workflow orchestration.
api_llm Specification
Defines a workspace of thin HTTP API clients for major LLM providers with no abstraction layer and explicit developer control.