Best Practices for Edge Delta Processors
3 minute read
Overview
The Edge Delta Processor nodes (formerly known as multi-processor nodes) enable you to organize and manage multiple processors (such as extract and aggregate metric processors) under a unified logic block. This is helpful for building structured processing flows using conditional logic and reusable groups. However, improper configuration can lead to high memory usage, excessive metric generation, and agent instability. This guide outlines configuration best practices to help you avoid these issues.

When to Use a Processor Node
Use a processor node to:
- Encapsulate related processors under a shared telemetry type and condition.
- Create modular logic flows that are easier to manage.
- Branch logic using conditional groups.
Avoid using a single processor to handle many unrelated logic flows, especially if they share relaxed conditions or overlapping scopes.
Common Pitfalls
1. Broad or Overlapping Conditions
When multiple conditional groups or extract/aggregate rules match the same data, each one may execute independently—leading to multiple versions of the same metric.
Issue: Metric duplication, excessive memory use, and difficulty tracking root cause.
Solution:
- Use mutually exclusive conditions for each rule or group.
- Use
name ==
checks to tightly couple aggregate metrics to corresponding extract metrics. - Avoid duplicating logic across groups unless absolutely necessary.
2. Overloading One Processor Node
Stacking too many extract and aggregate metric rules into one processor (especially without exclusive conditions) can overwhelm the agent.
Issue: CPU/memory spikes, OOMKills, and pipeline restarts.
Solution:
- Split logic into multiple processors when:
- You have more than 2-3 extract-aggregate metric chains.
- Different chains process different telemetry types.
- Different chains operate under separate logic scopes.
3. Missing or Loose name ==
Conditions in Aggregate Processors
Aggregate metrics without a scoping condition may pick up more metric items than expected.
Issue: Metrics aggregate unrelated data, balloon in cardinality, and consume memory.
Solution:
- Always use a
name == "..."
condition in your aggregate rule to ensure it only matches the corresponding extract metric.
Recommendations
Use Separate Processors per Metric Flow
- type: sequence
processors:
- type: extract_metric
extract_metric_rules:
- name: latency
gauge:
value: attributes["response_time_ms"]
- type: aggregate_metric
condition: name == "latency"
aggregate_metric_rules:
- name: latency_avg
interval: 1m
aggregation_type: avg
Use Conditional Groups for Clean Branching
- type: sequence
processors:
- type: sequence
condition: attributes["level"] == "Error"
processors:
- type: extract_metric
...
- type: aggregate_metric
...
Disable Unused Logic Safely
- Toggle the parent conditional group, not just individual processors.
- Confirm that child processors are truly inactive by inspecting pipeline behavior.
Leverage the Final
Option
Use the Final flag to stop further processing of a data item after a processor finishes. This prevents downstream duplication.
Debugging and Optimization
Detecting Excess Metric Volume
- Use the Metrics Explorer to visualize:
- Metric count over time
- Cardinality grouped by
name
orattributes
Profiling High Memory Agents
- Enable profiling via the UI for affected agents.
- Look for spikes tied to:
- Metric extraction and aggregation
- ebpf-based sources (Service Map, K8s Trace)
Triage Checklist
- Is metric volume increasing after a recent pipeline change?
- Are conditions overlapping across extract/aggregate rules?
- Are processors grouped under a single high-traffic node?
- Are logs or pprof showing GC pressure or agent crashes (OOMKills)?
Summary
Problem | Impact | Best Practice |
---|---|---|
Overlapping conditions | Duplicate or bloated metrics | Use name == and mutually exclusive filters |
Too many processors in one MP | Memory/CPU pressure, crashes | Split flows into separate processors |
No scoping in aggregates | Aggregates capture wrong data | Use specific name == conditions |
Disabled logic still executing | Unexpected metric generation | Toggle conditional group, not just children |