Flags removed Collector components and legacy semantic-convention attribute names in OpenTelemetry Collector YAML before the upgrade drops your pipeline. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
VS Code MarketplaceOpen VSX (Cursor, VSCodium)npmMCP server (npx)Docker Hubext install ReadyStack.otel-collector-drift-lint npx @readystack/otel-collector-drift-lint <file> npx @readystack/otel-collector-drift-lint --mcp
Team? One key for every ReadyStack linter, 5 seats, $149 once
Scan every YAML in the repo in one pass, export the findings as JSON or Markdown you keep, and fail a CI job on the blocking ones
One payment, one licence key for this tool. The key is shown right after payment.
A freelance SRE or observability contractor bills $100-150 an hour; reading one gateway config line by line is most of that hour
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.

25 findings in one 82-line OpenTelemetry Collector config, 20 of them errors - that is what a platform team gets back when they lint the gateway YAML they have carried since the 2023 rollout.
The config is not broken. It parses; yamllint is happy and nothing has complained in two years. Then someone bumps the Collector image tag, the pod enters CrashLoopBackOff, and the log says four words about an unknown type.
Two things have moved underneath a config like that, and only one of them is loud.
The jaeger and jaeger_thrift exporters were removed from opentelemetry-collector-contrib in v0.107.0. Jaeger has accepted OTLP for years, so the fix is an ordinary otlp exporter on port 4317 - but until you make that edit the binary will not load the config at all:
exporters:
jaeger: # removed in contrib v0.107.0
endpoint: jaeger-collector:14250
logging: # deprecated, now debug:
loglevel: debug # now verbosity: basic|normal|detailed
extensions:
memory_ballast: # removed in v0.113.0 - use GOMEMLIMIT
size_mib: 512
remote_sampling moved off the jaeger receiver into the jaegerremotesampling extension. These you would find on your own eventually, because the process tells you: it refuses to start. Eight of the sample config's findings are this kind.
The other twelve are worse.
When the HTTP conventions went stable in semconv v1.23.0, http.method became http.request.method, http.status_code became http.response.status_code, http.url became url.full and http.target became url.path. Network, database and resource attributes moved too: net.peer.name to server.address, db.statement to db.query.text, deployment.environment to deployment.environment.name.
Now look at a processor written before that:
filter/noise:
traces:
span:
- 'attributes["http.target"] == "/healthz"'
transform/db:
trace_statements:
- context: span
statements:
- set(attributes["db.query"], attributes["db.statement"])
Valid YAML. The Collector starts, the filter compiles. And the day one service's instrumentation is upgraded to the stable conventions, the health-check spans stop being dropped - silently, one service at a time, with no error anywhere. Nobody is paged for a filter that matches nothing. You find it in the bill, or in an incident where the span you needed was sampled away.
39 rules: nine for removed or deprecated components and settings, twenty-nine for renamed attributes, one for a config with no service.name, which lands the telemetry under unknown_service. Every finding carries a line number and the replacement spelling.
Three real configs, three different answers:
service.nameThe middle case makes the point: that config boots, it looks maintained, and eight of its rules are keyed to names that no longer arrive.
Linting the file you have open is free, in the editor or in a browser page running the same engine file, uploading nothing. The key changes scope, not depth: every YAML in the workspace in one pass, a JSON or Markdown report you keep, a non-zero exit code for CI. $29 once. A freelance SRE bills $100-150 an hour, and one config against the Collector changelog is most of that hour.
It reads an OpenTelemetry Collector config as YAML and applies 39 rules. Eight of them name components the Collector no longer accepts, such as the jaeger exporter removed in contrib v0.107.0 and the memory_ballast extension removed in v0.113.0. Twenty-nine name attributes the semantic conventions renamed, like http.method to http.request.method. Every finding carries a line number and the replacement.
Platform and SRE engineers who own the Collector config for a team: the gateway deployment, the daemonset agent, the sidecar in a service chart. If you are the person who bumps the Collector image tag and watches whether the pod comes back, and whether the dashboards keep drawing afterwards, this is aimed at you.
A YAML linter checks that the document parses. Every finding here is valid YAML. The jaeger exporter block is well formed; the Collector simply refuses to start because that component no longer exists. A filter keyed on http.target parses perfectly and quietly matches nothing once the SDK emits url.path instead.
Linting the file you have open is free and complete: every rule runs, every finding shows its line and its replacement, with no watermark, no trial limit and nothing held back. The licence key adds scope and ownership: one command that sweeps every YAML in the workspace, a JSON or Markdown report you keep, and a non-zero exit for CI.
A freelance SRE or observability contractor bills roughly $100 to $150 an hour, and reading one gateway config against the Collector changelog and the semantic convention history takes most of an hour, per config. The 82-line sample config in this repository carries 25 findings across 20 errors and 5 warnings.
A general AI chat answers from training data with a cutoff date, cannot read your repository and names no rule version. OpenTelemetry Collector Config Lint - drift and deprecated c checks the file you open against 39 rules from a rule set dated 2026-09-20, and points at the exact line. For a filing, an audit or a client you need that dated result on your own files.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →