Processors

August 28, 2026 ยท View on GitHub

Processors are the middle nodes in an OTAP Dataflow pipeline DAG. Receivers ingest telemetry and create pdata, processors transform or route that pdata, and exporters deliver it outside the pipeline.

Processors can have one or more input sources and one or more output ports. The engine owns their input loop, delivers both data and control messages, and asks each processor whether new pdata should be admitted through accept_pdata(). Processors use effect handlers to emit downstream data, Ack/Nack outcomes, telemetry, wakeups, and other runtime effects.

This document describes the main processor classes currently represented in core-nodes. Development-only processors are cataloged separately because they are not part of the published runtime crate. The taxonomy is descriptive; it is not a Rust trait hierarchy or a configuration schema.

Primary Processor Classes

Each current processor fits one primary class. Secondary traits, described later, capture cross-cutting behavior.

Inline Single-Route Processors

Inline single-route processors have one logical downstream path and handle each inbound message in the main process() call. They may mutate, observe, or drop messages, but they do not maintain router-style multi-output state.

Examples:

Stateful Single-Route Schedulers

Stateful single-route schedulers also have one logical downstream path, but they retain local state across calls. They may batch, retry, persist, reaggregate, or defer work before forwarding it.

Examples:

Exclusive Routers

Exclusive routers expose multiple output ports, but each inbound message selects at most one output route. Route-local admission matters because one blocked selected route should not automatically stall unrelated routes.

Examples:

Replicating Multi-Route Processors

Replicating multi-route processors clone one inbound message to multiple destinations. Completion is usually aggregated across those destinations and may depend on Ack/Nack policy, fallback chains, and timeout handling.

Example:

Transforming Routed Emitters

Transforming routed emitters run transformation logic that may produce zero, one, or many output batches. Routing is computed by transformation/query execution rather than by a static exclusive route selector.

Example:

Secondary Behavior Traits

Secondary traits describe behavior that cuts across the primary classes.

  • single-route: the processor has one logical downstream path.
  • multi-route: the processor can emit to more than one output port.
  • exclusive-routing: each inbound message selects at most one output.
  • replicating: one inbound message may be cloned to multiple outputs.
  • inline: processing completes in the current process() call.
  • stateful: processing depends on local state retained across calls.
  • ack-aware: the processor subscribes to downstream Ack/Nack outcomes.
  • wakeup-driven: the processor uses local wakeups to resume deferred work.
  • admission-gated: the processor can return accept_pdata() == false.
  • buffering: the processor retains data locally before forwarding.
  • batching: the processor combines or splits data by size or time.
  • retrying: the processor reschedules failed delivery attempts.
  • may-drop: the processor can intentionally drop input data.
  • must-explicitly-ack-or-nack-deferred-work: the processor owns deferred work and must resolve it explicitly during success, failure, or shutdown paths.

Port count alone is not enough to classify a processor. For example, content_router and fanout_processor are both multi-output, but content_router selects one route while fanout_processor replicates to multiple destinations. transform_processor can emit routed outputs, but those routes are produced by transformation execution rather than a static router.

Current Core Processor Classification

ProcessorPrimary classNotable secondary traitsNotes
attributes_processorInline single-routesingle-route, inlineMutates OpenTelemetry attributes before forwarding.
filter_processorInline single-routesingle-route, inline, may-dropFilters signals according to configured rules.
log_sampling_processorInline single-routesingle-route, inline, may-dropSamples logs to reduce volume.
debug_processorInline single-routesingle-route, inlineObserves or emits debug output while preserving simple forward flow.
batch_processorStateful single-route schedulersingle-route, stateful, batching, wakeup-driven, ack-awareBatches by size or time and tracks Ack/Nack-sensitive request state.
retry_processorStateful single-route schedulersingle-route, stateful, retrying, ack-awareRetries failed downstream delivery using exponential backoff.
durable_buffer_processorStateful single-route schedulersingle-route, stateful, buffering, retrying, wakeup-drivenPersists data before forwarding and retries from durable state.
temporal_reaggregation_processorStateful single-route schedulersingle-route, stateful, buffering, admission-gatedReaggregates metrics at lower frequency.
content_routerExclusive routermulti-route, exclusive-routing, wakeup-driven, admission-gatedRoutes by resource attribute value to one selected output.
signal_type_routerExclusive routermulti-route, exclusive-routing, wakeup-driven, admission-gatedRoutes by signal type to one selected output.
fanout_processorReplicating multi-route processormulti-route, replicating, ack-aware, admission-gatedClones data to configured destinations and aggregates completion.
transform_processorTransforming routed emittermulti-route, stateful, ack-awareRuns transformation/query logic that may emit routed outputs.

Development Processor Classification

Development processors live in the unpublished dev-nodes crate and are available in df_engine only when the dev-tools feature is enabled.

ProcessorPrimary classNotable secondary traitsNotes
delay_processorInline single-routesingle-route, inlineAdds artificial delay for testing and rate-shaping scenarios.