Skip to content

Configuration

Pipeline YAML sections, edge attributes, variable substitution, and the Runtime config.

Top-level sections

SectionRequiredPurpose
apiVersion / kind / metadataResource identity (K8s convention)
sources✅ (≥1)Topology: where events come from
transformsoptionalTopology: what happens to events
sinks✅ (≥1)Topology: where events go
runjob pipelines onlyJob scheduling (mode/schedule/overlap/catchup_window)
parametersjob optionalTyped job parameters with defaults
constantsoptionalRead-only values visible to scripts and predicates
hooksoptionalLifecycle hooks (failure/success → inline sink)
limitsoptionalPer-pipeline resource limits
edge_defaultsoptionalDefault edge attributes
codecsoptionalNamed codec declarations
dlqoptionalDead-letter policy

Three-section topology

Nodes are organized by section; edges declared on the downstream side via from:

sources:
  ingest:
    decoder: json
    kafka: { brokers: ["${KAFKA_BROKERS}"], topics: [orders] }

transforms:
  enrich:
    from: [ingest]                         # unconditional edge
    script: |
      payload.total = payload.price * payload.qty

sinks:
  eu-out:
    from: { enrich: { when: 'meta.region == "eu"' } }  # conditional edge
    kafka: { topic: orders-eu }

Edge attributes

Attributes on from elements:

AttributeTypeDescription
whenstring or objectCEL predicate (or {lang: cesql, expr: ...})
deliveryobject{retries, backoff, timeout_ms}
requiredboolfalse = best-effort (failure doesn’t block siblings)
bufferobject{max_events, strategy}

Variable substitution

  • ${VAR} — environment variable (unset = error)
  • ${?VAR} — optional (unset = omit key)
  • ${constants.name} — pipeline constant
  • Applies to all string values

Built-in plugins

Sources

NameKey config
kafkabrokers, topics, group_id
http_serverlisten, max_body_bytes
cronexpression (5-field)
filepath (tail)
sqldriver (mysql/postgres/sqlite), query, cursor, pagination

Sinks

NameKey config
kafkabrokers, topic
httpurl, timeout_ms
filepath (JSON lines)
drop(none — discards)

Codecs

NameKey config
json(none)
raw(none)
csvcolumns or header
avroschema (inline or file)
protobufdescriptor_set (file path)

Job pipeline example

apiVersion: eventboat/v3
kind: Pipeline
metadata: { name: nightly-sync }

run:
  mode: job
  schedule: "0 1 * * *"
  overlap: skip
  catchup_window: 2h
  skip_if_successful: true
  retention: { history: 90d }

parameters:
  from: { type: string, default: cursor }
  to:   { type: string, default: now }

sources:
  pull:
    sql:
      driver: mysql
      query: |
        SELECT * FROM orders
        WHERE updated_at >= :from AND updated_at < :to
      args: { from: "${parameters.from}", to: "${parameters.to}" }
      cursor: { column: updated_at }
      pagination: { key: [updated_at, id], page_size: 5000 }

transforms:
  enrich:
    from: [pull]
    script: |
      payload.source_system = constants.source_system

sinks:
  out:
    from: [enrich]
    kafka: { brokers: ["${KAFKA_BROKERS}"], topic: orders-sync }