From skills
OllyGarden's opinion on when and how to decompose a monolithic OpenTelemetry Collector config into multiple merged files — and when to leave it alone. Use whenever someone wants to split, break up, modularize, or reorganize a large otelcol / collector YAML, or asks "should I split this config", "this collector config is too big to review", "refactor our collector config into multiple files", "organize the collector config by signal / by team". Executes the split directly when warranted (the collector deep-merges repeated --config file: sources), verifies the merged result is behavior-equivalent to the original, and always reports the reasoning — including a deliberate no-op when the config is simple enough not to need it. Plain files and multi-config merge only; not for Terraform/Kustomize/Helm packaging. Layers on facts from otel-collector; hands off behavioral proof to ollygarden-otel-collector-config-validation.
How this skill is triggered — by the user, by Claude, or both
Slash command
/skills:ollygarden-otel-collector-config-decompositionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill is OllyGarden's opinion that **a collector config should be decomposed only when
This skill is OllyGarden's opinion that a collector config should be decomposed only when the monolith has become painful — and left as one file when it hasn't. Decomposition buys smaller reviews, isolated testing, and clean per-environment variation, but it costs indirection: a reader now has to mentally merge several files to see the whole. When a config fits on a screen, that cost outweighs the benefit. Not splitting is a valid, common, and correct outcome.
The mechanism that makes decomposition work is the collector's deep merge of repeated
--config file: sources (later keys win at each level), plus the file:/env:/yaml:
providers. This skill owns the generic mechanics; the specialized
ollygarden-otel-collector-k8s-daemonset skill is a consumer of this one for its own
reference config.
It layers on upstream facts — point at these rather than duplicating them:
otel-collector skill.filter still drops
the right spans, a transform still sets the attribute) → the
ollygarden-otel-collector-config-validation skill.When you're handed a collector config, assess it, then act directly — don't just advise. But the first decision is always whether to split at all:
Decompose when two or more of these are true; a single weak signal is usually not enough:
tail_sampling policy
list, a big set of Prometheus scrape jobs, a wall of OTTL statements.Do NOT decompose when the config fits on a screen, has a single pipeline, has no environment variation, and is owned by one person. Indirection you don't need is a net negative. If in doubt and the signals are weak, leave it as one file and say why.
Pick the strategy that matches the config's actual organizational boundaries — don't apply
a pattern mechanically. The three patterns, and how to choose between them, are in
references/strategies.md:
common.yaml + self-contained traces.yaml / metrics.yaml /
logs.yaml. The default when signals are owned or iterated independently.base.yaml + receivers.yaml / processors.yaml / exporters.yaml.
Fits when teams own pipeline stages.production.yaml / staging.yaml / development.yaml
that override values. Layers on top of either split above.${file:}) — pull one oversized, independently-ownable sub-block into
its own bare-fragment file. Use sparingly.Before writing files, read references/mechanics.md for the merge
rules and the caveats that bite silently — most importantly that arrays are replaced, not
merged (keep anything that varies together, especially a pipeline's processors: list, in
one file) and that ${file:} paths resolve relative to the collector's working directory,
not the including file.
A decomposition that changes behavior is a bug, not a refactor. Never hand back a split you
haven't merged and checked. Validate the merged set (never a lone fragment) and diff the
fully-resolved output against the original monolith. The commands and the
behavior-equivalence check are in references/verifying.md. For
proving a specific processor/connector still transforms telemetry correctly, hand off to
the ollygarden-otel-collector-config-validation skill.
End every run with a short report so the reasoning ships with the change:
Decision: <decomposed | left as one file>
Why: <which criteria were / weren't met>
Strategy: <by-signal | by-component | overlays | nested — or n/a>
Files: <the file set produced, or "unchanged">
Verification: <merged validate result + equivalence check, or "n/a">
processors: array across files. Arrays are replaced, not merged
— the last file wins and silently drops the rest of the list. Keep it in one file.${file:} nested inclusion. Externalize only blocks that are both large and
independently ownable; each include is another file to open.otel-collector.ollygarden-otel-collector-config-validation.ollygarden-otel-collector-k8s-daemonset.npx claudepluginhub ollygarden/skills --plugin ollygarden-otel-collector-config-decompositionGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.