Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Docs

sources and sinks

Sources and sinks are connectors: an id, a registered kind, and an opaque connector-specific config block. Both lists require at least one entry.

sources:
  - id: fleet-mqtt          # unique id, used in metric labels and file names
    kind: mqtt              # a source kind registered with the binary
    config:                 # connector-specific; validated by the connector
      url: mqtt://broker:1883
      ...

sinks:
  - id: local
    kind: parquet           # a sink kind registered with the binary
    config: { ... }
    required: true          # WAL consumer policy (below)
    start_from: earliest

Connector shell

KeyTypeRequiredDescription
idstringyesUnique within its section. 1–64 characters: letters, digits, _, -, starting with a letter or digit. Used in metric labels, cursor names, and file names.
kindstringyesLowercase letters, digits, _. Must name a connector registered with the binary, or validation fails with config.unknown_kind.
configmappingnoConnector-specific configuration (deny_unknown_fields inside each connector). Kept as untyped JSON at this layer and validated by the connector factory, so connector options evolve independently of the config format.

Registered kinds

KindRoleFeature flagStatus
mqttsourcebuilt-inAvailable (MQTT source)
httpsourcebuilt-inAvailable (HTTP source)
grpcsourcebuilt-inAvailable (gRPC source)
mcapsourcebuilt-inAvailable (ROS 2); replays MCAP and rosbag2-MCAP recordings
modbussourcebuilt-inAvailable (Modbus source); Modbus TCP polling
cansourcebuilt-inAvailable (CAN source); Linux SocketCAN (raw and DBC decoded)
opcuasourceopcua (off by default)Available (OPC UA source)
ros2_livesourceros2-live (off by default)Available (ROS 2 live source); rmw_zenoh transport, experimental
parquetsegment sinkbuilt-inAvailable (Parquet segments sink)
object_storeshipper servicebuilt-inAvailable (object storage sink); configured under sinks: and runs as a service shipping the named segment sink
icebergregistrar serviceiceberg (off by default)Available (Apache Iceberg registrar); configured under sinks:, experimental (P2)
natsbatch sinkbuilt-inAvailable (NATS JetStream sink); one message per event, deduplicated by Nats-Msg-Id
kafkabatch sinkbuilt-inAvailable (Apache Kafka sink); one record per event, acks=all
mqtt_publishbatch sinkbuilt-inAvailable (MQTT publish sink); one message per event, QoS 0 or 1
clickhousebatch sinkclickhouse (on by default)Available (ClickHouse sink); inserts into an existing table, never creates or alters tables

Sink WAL-consumer policies

Each sink entry takes three optional keys next to id, kind, and config. They control how the sink participates in WAL retention — who decides when old segments may be deleted. Keys at their defaults are omitted from serialization and from the config hash.

KeyTypeDefaultDescription
requiredbooleantrueWhether the WAL keeps data until this sink has consumed it. false makes the sink an optional consumer: it never holds retention back, and if it falls behind eviction it sees a Gap::Evicted in its reader.
max_lag{ bytes: <size> } or { age: <duration> }noneHow far a required sink may fall behind before it stops holding WAL data back — an explicit, counted loss for that sink. One key only, and a zero value is invalid. Refused on a required: false sink (an optional sink never holds retention, so there is nothing to limit).
start_fromearliest or latestearliestWhere a sink with no committed cursor starts. latest commits the cursor at the current durable end during startup, so a restart cannot skip data. A sink that already has a cursor always resumes from it, ignoring this key.

Examples:

# An analytics sink that may not starve the WAL of the capture path:
- id: scratch-analytics
  kind: parquet
  required: false
  config: { ... }

# A required sink that must not pin more than 2 GiB of WAL:
- id: local
  kind: parquet
  max_lag: { bytes: 2GiB }
  config: { ... }

Secrets in connector config

Interpolated values inside config: blocks are tracked per connector, wrapped in Secret<T>, and redacted from logs and diagnostics. See secrets.