scf-otelcol) is a custom OpenTelemetry Collector distribution built with
ocb from collector/builder-config.yaml: upstream core v0.165.0 / v1.71.0, contrib v0.165.1,
and three components in this repository (tenantauth, tenantguard, jetstream). Why it is
built this way and what the strict version check does: ../reference/collector.md
“ocb, module layout and strict versioning”. An upgrade moves every collector module together;
ocb’s strict check refuses a mixed set.
Steps
- Choose the target under the pin policy of plan section 5 (a minor line younger than 30 days is skipped unless a security fix needs it) and record it there with a one-line reason.
-
Move every pin of the collector together:
collector/builder-config.yaml: everygomodline ofgo.opentelemetry.io/collector/...andgithub.com/open-telemetry/opentelemetry-collector-contrib/....go.mod: thego.opentelemetry.io/collector/...requirements (the custom components live in the root module, which the generated module replaces, so the root go.mod takes part in version selection). Thengo mod tidy.Makefile:OCB_VERSION.deploy/images/collector.Dockerfile: theotel/opentelemetry-collector-buildertag and index digest, resolved withdocker buildx imagetools inspect. Check that image’s Go version againstgo.mod; for 0.165.0 it shipped Go 1.27.3, which is why the Dockerfile copiesocbinto the pinned Go image.
-
Read the upstream changelogs for every version passed, for the receiver limits, the
transformandmemory_limiterprocessors, theconfmapproviders and any rename of telemetry metrics (the alerts readotelcol_receiver_accepted_metric_pointsand friends, ../reference/observability.md). -
Build:
Expected: ocb logs
Compiled {"binary": "./dist/scf-otelcol/scf-otelcol"}and the target ends with./dist/scf-otelcol/scf-otelcol components >/dev/nullexiting 0. A strict-versioning failure names the module that resolved to another version. -
Run the gates:
collector-itmust end withok github.com/justmert/veristar/tests/collector. Also runpromtoolrule tests if a telemetry metric name changed (infra/ansible/roles/observability/files/rules/tests/). -
Release and roll out as any image change: tag,
release-images.yml, thenmake staging-deploy ROLLING=1 SA_IMAGE_TAG=<release> SA_RELEASE_MANIFEST=<release-images.json>. Edge nodes are updated one at a time behind the drain, so OTLP clients move to the other nodes while one restarts. CheckIngestOTLPErrorRatioHighstays quiet andAPI_METRICSdrains. -
Rollback is a redeploy of the previous release tag; the collector keeps no state of its
own (tokens come from the
registry_otlpbucket, data goes toAPI_METRICS).
Exercised
Not yet exercised: an actual version change (phase 19 kept the pins of plan section 5 and ran
the build and gate at them),
make apipath (about 90 minutes and many containers, too heavy for the shared host
during this phase), and the rollout through deploy.yml on staging.