Skip to main content

OTEL-040: Circular pipeline dependency via connectors

Severity: deny (blocking)

Rule Details

Connectors turn one pipeline's exporter side into another pipeline's receiver side. That is a directed graph — and a cycle in that graph means telemetry loops indefinitely between pipelines, consuming CPU and memory until one of the other rules (memory_limiter, queue size) terminates the loop. augur walks the pipeline graph and blocks any config whose connector edges form a cycle.

This rule fires when the connector-pipeline graph contains at least one cycle.

Options

This rule has no options.

Examples

Incorrect
connectors:
forward/a_to_b: {}
forward/b_to_a: {}

service:
pipelines:
traces/a:
receivers: [otlp]
exporters: [forward/a_to_b]
traces/b:
receivers: [forward/a_to_b]
exporters: [forward/b_to_a]
traces/c:
receivers: [forward/b_to_a]
exporters: [forward/a_to_b] # cycle: a_to_b -> b_to_a -> a_to_b
Correct
connectors:
forward/a_to_b: {}

service:
pipelines:
traces/a:
receivers: [otlp]
exporters: [forward/a_to_b]
traces/b:
receivers: [forward/a_to_b]
exporters: [otlp/backend]

When Not To Use It

Never — a connector cycle is always a bug.

  • OTEL-041 — routing connector without default_pipelines
  • OTEL-042 — duplicate processor in same pipeline

Version

Available since augur v0.1.0.

Further Reading

Resources