Release v0.49.0
What's Changed (Go 🐹)
🛑 Breaking changes 🛑
collector/cmd/otelarrowcol: Remove the generatedcollector/cmd/otelarrowcolcollector module and itsgo.mod/go.sum(#1482, #2439, #2440)
Thegithub.com/open-telemetry/otel-arrow/collector/cmd/otelarrowcolmodule
is no longer published. The OpenTelemetry Protocol with Apache Arrow (OTAP)
components are now exercised using the upstream OpenTelemetry Collector
Contrib distribution instead of a collector generated in this repository.
This removes a large set of test-only collector dependencies (and the
associated dependency/security alerts) from the repository.
💡 Enhancements 💡
Go Modules
This release includes the following Go module:
github.com/open-telemetry/otel-arrow/go@v0.49.0
What's Changed (Rust 🦀)
🛑 Breaking changes 🛑
-
engine: Pass&ExtensionContexttoExtensionFactory.createso extensions can register custom metric sets and extension entities at construction time. (#3285)
After PipelineContext was decoupled from extensions, factories had no way to
build aMetricSet<T>(no public constructor) or otherwise register telemetry
before the extension started. The new first argument re-opens that path with a
narrower, extension-scoped context. All in-tree factories and tests have been
updated. -
engine: Add scope-agnostic extension lifecycle monitor with per-variant telemetry. (#3143)
Decouples the extension subsystem from PipelineContext via a new
ExtensionContext carrying an opaque (scope.kind, scope.id) attribute pair,
so extensions can be hosted at pipeline scope today and engine/group scope
in the future without changing the attribute shape. Local and shared
extension variants are each registered as distinct telemetry entities and
driven by a dedicated ExtensionMetricsMonitor that owns its own collection
interval and shutdown fan-out per scope.Breaking changes to the public API of
otap-df-engine:ExtensionFactory::createno longer receivesPipelineContext. Its
signature is now(ExtensionId, Arc<ExtensionUserConfig>, &ExtensionConfig) -> Result<ExtensionBundle, Error>. Out-of-tree extensions need to be
updated to drop thePipelineContextparameter.PipelineContext::register_channel_entityandchannel_attribute_set
are renamed toregister_node_channel_entityand
node_channel_attribute_set. TheChannelAttributeSetstruct is split
intoNodeChannelAttributeSetandExtensionChannelAttributeSet.
-
observability: Self-telemetry metric attributes are now split across the correct OpenTelemetry layers instead of all being emitted as data-point attributes (#3161)
Metric entity identity moves to the instrumentation scope (otel_scope_*
labels); logs already emitted entity identity on scope. Process/host identity
(host.id,container.id,service.instance.id) is now applied
consistently to the Resource layer for both metrics and logs (SDKResource
/ Prometheustarget_info). Resource attributes are no longer per-metric
labels (querytarget_info), and metric entity attributes are now
otel_scope_-prefixed on the admin Prometheus output. -
query-engine: changes keyword "exclude" to "remove", and changes "date_time" literal tag to "timestamp" to align with nascent spec (#3051) -
query-engine: OPLrenamesyntax changed fromrename attributes["new"] = attributes["old"]torename attributes "old" as "new". Theproject-renamealias has been removed from OPL. (#3224)
💡 Enhancements 💡
-
dependencies: Upgrade various Rust dependencies. (#3216, #3217, #3293, #3301, #3308, #3326) -
engine: Add an optionalpurposefield to flow_metric config, emitted as theflow.purposescope attribute so OTel View selectors can target distinct flavors of flow work. (#2859)
Theflow.purposeattribute is always emitted on flow metrics; whenpurposeis omitted it carries an empty value, so existing single-flow-scope selectors keep matching. -
engine: Add controller extension hooks, static validation, fail-fast runtime error handling, and an opt-in read-only controller monitor extension. (#3263) -
engine: Add full-engine live reconciliation primitives plus Admin HTTP endpoints for config snapshots, config reconciliation, pipeline group creation, and pipeline/group deletion. (#3266) -
otap: Propagate the receiver-observed peer socket address onOtapPdataso processors can read request-scoped transport facts viaOtapPdata::peer_addr(). (#3220)
Adds an optionalOption<SocketAddr>peer-address slot to theContext
carried by everyOtapPdata, populated by the OTLP gRPC, OTLP HTTP, OTAP
gRPC, and syslog/CEF TCP receivers from the accepting socket. Receivers
without a real socket (file-based, journald, UDS) leave itNone. The
value is preserved across transport boundaries byclone_without_context
and is exposed viaOtapPdata::peer_addr()so processors that care
(notably the k8sattributes processor'spod_association: connectionand
passthroughmodes) can opt in to reading it. -
pipeline: Add optionalheadersconfig field toHttpClientSettingsandGrpcClientSettingsfor sending static request headers (e.g.Authorization, tenant routing) on every outbound OTLP/HTTP and OTLP/gRPC request (#3303)
Headers are validated at config load: the OTLP/HTTP exporter rejects
protocol-reserved names (Content-Type/Content-Encoding/Content-Length/Host)
and response-negotiation names (Accept/Accept-Encoding), and the OTLP/gRPC
exporter rejects transport-reserved metadata (Content-Type/TE/User-Agent and
thegrpc-prefix); protocol headers always take precedence. The gRPC static
metadata is built
once at startup so the per-message hot path keeps its zero-allocation fast
path. The OTAP (Arrow) exporter sharesGrpcClientSettingsbut does not apply
static headers to its streams yet, so it rejects a non-emptyheadersmap at
config load rather than silently dropping it. This is the static-header
complement to header propagation (#2563). -
pipeline: Add TDH (Trace Data Helper) decoder for ETW tracelogging events in the ETW receiver (#2783) -
pipeline: Add static gRPC endpoint syntax validation and optional startup_check (none/dns/connect) to OTLP gRPC and OTAP exporters (#3211) -
pipeline: Add opt-in Linux per-process metrics to the host metrics receiver. (#3066)
Per-process metric series includeprocess.pidby default and require it when enabled to avoid indistinguishable same-command process series. -
pipeline: Implement journald receiver ingestion, encoding, and cursor checkpointing. (#2858)
Adds the Linux sd-journal worker, OTAP log projection, downstream Ack/Nack
handling, durable cursor commits, and source metrics for the journald receiver. -
pipeline: Improve engine configuration and node documentation for users discovering dataflow pipelines. (#3212) -
pipeline: Add grouped session and per-subscription pending limits to the Linux user_events receiver. (#3071) -
pipeline: Add optionaluser_agentconfig field toHttpClientSettingsandGrpcClientSettingsfor custom User-Agent headers (#3138) -
pipeline: Addexporter.azure_monitor.in_flight_log_recordsgauge to the Azure Monitor exporter for retry-backpressure visibility. (#3304)
The gauge reports the number of log records currently in-flight at the
exporter (enqueued export requests awaiting completion, including records
being retried). -
pipeline: Add end-to-end integration test for the ETW receiver on Windows (#2783)
Drives the ETW receiver from aTestRuntime, emits TraceLogging events via
both the dynamic (tracelogging_dynamic) and static (tracelogging)
producer crates, and asserts the decoded events arrive in an OTAP Arrow
batch with the expected scalar, string, and nested-struct field values.
Gated on--ignoredand Administrator privileges; runs in CI on
windows-latest. -
pipeline: PreserveOtapPdata::peer_addracross merging processors (batch_processor,temporal_reaggregation_processor) by merging contributing inputs' peer addresses via the newContext::merge_peer_addrhelper. (#3228)
AddsContext::merge_peer_addr, which returnsSome(addr)only when every
contributing input observed the same peer address andNoneotherwise.
batch_processorandtemporal_reaggregation_processor- the two processors
that rebuildOtapPdatawith a freshContextwhen merging multiple inputs- now apply this helper so single-peer streams retain the receiver-observed
peer address end-to-end, while multi-peer merges keeppeer_addrasNone
to avoid misattribution.
- now apply this helper so single-peer streams retain the receiver-observed
-
pipeline: Align the ETW receiver with the OpenTelemetry logs data model appendix ETW mapping - preserve the raw ETW level in theetw.levelattribute so the SeverityNumber mapping stays reversible, and emitSeverityTextusing the standardized ETW level names (LOG_ALWAYS,CRITICAL,ERROR,WARNING,INFO,VERBOSE) (#2783) -
pipeline: Expose object-store retry settings on the Parquet exporter and add flush outcome metrics. (#3052) -
pipeline: OTAP exporter now supports static requestheadersnatively: configured headers are attached once as the initial metadata of each Arrow log/metric/trace stream. The previous config-load rejection is removed. (#3314)
Headers are sent once per stream establishment, not perBatchArrowRecords, so the per-message hot path remains allocation-free. Header validation (ASCII-only, no gRPC-reserved metadata) is shared with the OTLP/gRPC exporter viaGrpcClientSettings. -
query-engine: Add user guide for OPL (#3183) -
query-engine: Addforkoperator call to OPL language and support in query-engine (#3188) -
query-engine: Adds small application that serves an interactive playground for crafting OPL programs (#3214) -
query-engine: Addsdropoperator to OPL for unconditionally discarding telemetry data (#3253) -
query-engine: Adds support for comments in OPL programs (#3151) -
query-engine: AddBytestype keyword support for OPL type-checking expressions (e.g.attributes["x"] is Bytes). (#3223)
🧰 Bug fixes 🧰
-
otap: Fix gRPC startup DNS checks to skip local DNS only when the target endpoint actually uses a configured proxy. (#3222) -
otap: Fix build failure (E0433) when a dependent crate is compiled without a crypto-* feature, by gating the rustls ring fallback in ensure_crypto_provider() behind the test-utils feature. (#3280)
rustls is pinned with default-features off, so rustls::crypto::ring only exists
when the ring feature is enabled (via a crypto-* feature or test-utils). The
unconditional fallback referenced that module even when it was configured out,
breaking lib-only checks of crates that depend on otap-df-otap without selecting
a crypto provider. -
pdata: Handle Duration and Timestamp cardinality estimation across all Arrow time units in concatenate (previously panicked). (#3181) -
pipeline: Add the optionalevent_namefield to the Parquet exporter logs schema so it is no longer silently dropped. (#3270)
Theevent_namecolumn already exists in the canonical OTAP logs schema but was
missing from the hand-written Parquet exporter logs template. Logs that carry
event_nameare now written with the value preserved; logs without it produce a
NULL column. -
pipeline: Transform processor no longer returns a config error when the query has leading whitespace. (#3209) -
query-engine: Fixcoalesceto preserve spans missing the first attribute by using an outer join when aligning attribute batches. (#3078) -
query-engine: Resolves handful of correctness issues in the otap query-engine related to logical expression evaluation (#3003)
Rust Workspace
The Rust workspace at rust/otap-dataflow/ is tagged as rust/otap-dataflow/v0.49.0. Crates are not published to crates.io yet; consume this release via git.
Full Changelog: v0.48.0...v0.49.0