cannectors

Logging

JSON log format, shipping, what to monitor.

The runtime emits structured logs to stdout by default. Use --log-file to redirect, or let your container platform pick stdout up automatically.

Format

Line-delimited JSON, one event per line.

{"time":"2026-04-21T12:34:56Z","level":"info","pipeline":"sync-orders","module":"httpPolling","msg":"fetched","records":128,"cursor":"eyJpZCI6MTI4fQ"}
{"time":"2026-04-21T12:34:57Z","level":"info","pipeline":"sync-orders","module":"mapping","msg":"processed","records_in":128,"records_out":128,"dropped":0}
{"time":"2026-04-21T12:34:58Z","level":"warn","pipeline":"sync-orders","module":"http_call","msg":"cache miss","key":"cust_42"}

Standard fields on every event:

FieldMeaning
timeRFC 3339 UTC.
leveldebug, info, warn, error.
pipelineThe pipeline's name.
moduleThe module type that emitted the event.
msgShort human label. Stable enough to use in alerts.

Plus module-specific fields (record counts, cursor values, HTTP status, etc.).

Levels

LevelWhen
debugPer-record traces. Only emitted with --verbose.
infoStage start/end, batch totals, cache hits, scheduled-tick fires. Default.
warnRetry attempts, soft failures, deprecated YAML fields.
errorStage failed past onError. The runtime is about to abort.

error events always include the root cause and the record index that triggered it.

Shipping

Pipe stdout into your aggregator:

AggregatorPattern
LokiPromtail tailing the container stdout
DatadogDatadog Agent autodiscovery on the container
CloudWatchECS/EKS log driver, no extra config
VectorSidecar tailing /var/log/cannectors/*.log
OpenTelemetryotelcol with the filelog receiver

All of them parse line-delimited JSON without further work — point them at the stream and the fields land as labels/attributes.

What to monitor

Alert on:

  • level=error — any error event is worth a page. Cannectors doesn't recover from them automatically.
  • msg=retry at high cardinality — sustained retries usually mean the destination is degrading.
  • No msg=tick event in N CRON intervals — the scheduler is stuck or the process is dead.

Don't alert on every level=warn — they cover normal operating conditions (transient retries, cache misses, etc.).

Local dev

--verbose adds per-record trace lines and is the right mode for debugging a pipeline locally. --quiet flips it the other way — nothing on success.

cannectors run --verbose pipeline.yaml | jq -c '.'

jq -c keeps the line-delimited format but pretty-prints individual events as you watch them roll by.

See also