OpenTelemetry Collector upgrade — check your config before upgrading

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.

Install free

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 Hub
ext 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

Get the full rule table as a PDF
All 39 rules OTel Collector Drift Lint checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.

Get the full version $29

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
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

OTel Collector Drift Lint

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 loud half: components that no longer exist

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 quiet half: attributes that were renamed

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.

What the linter does

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:

The 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.

15 seconds — what it actually does

Questions people ask

What does OTel Collector Drift Lint actually do?

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.

Who is this for?

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.

Why will a normal YAML linter not catch this?

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.

What is free and what needs a licence key?

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.

What would this cost done by hand?

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.

Why not just ask ChatGPT or another AI chat?

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.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.

Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

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 →