Skip to content

build(deps): move to otel 1.47 and hold grpc off 1.84 - #742

Merged
EricAndrechek merged 15 commits into
mainfrom
deps/go-deps-unblock
Oct 7, 2026
Merged

EricAndrechek merged 15 commits into
mainfrom
deps/go-deps-unblock

Conversation

@EricAndrechek

Copy link
Copy Markdown
Member

Summary

Unblocks the weekly Go dependency group (held red since early September) together with the nats-server test fix in its own PR.

  • OpenTelemetry 1.47. The otel modules move to 1.47 (otel/log and sdk/log 1.47.0, otlploggrpc 0.23.0, Prometheus exporter 0.69.0), and every use of the deprecated otel/log/global (in internal/observability and the integration test) moves to otel.Get/SetLoggerProvider, which only exists from 1.47. That clears the SA1019 findings. gRPC stays at 1.83.2, and proto/otlp and grpc-gateway/v2 stay at the versions that don't need gRPC 1.84.
  • gRPC hold. Dependabot ignores google.golang.org/grpc >= 1.84.0, < 1.85.0 (GO-2026-6443; no 1.84.x patch exists, and the fix is only in a 1.85 pre-release), plus go.opentelemetry.io/proto/otlp >= 1.11.1 and grpc-gateway/v2 >= 2.31.0, whose releases require gRPC 1.84.0 and would otherwise pull it in transitively. All three holds go together once gRPC 1.85.0 is tagged; deps: grpc 1.84.0 fails vulncheck (GO-2026-6443) and holds the whole go-deps group red #643 stays open to track that.
  • npm cooldown. Dependabot's npm updates get a 7-day cooldown matching pnpm's minimumReleaseAge, with the same @wave-rf/* and @wavehouse/* excludes. It covers the bumped package only, not packages re-resolved transitively.
  • Docs made true against the pinned SDKs.
    • The "logs ignore the TLS env vars" gap was stale: otlploggrpc has applied the CA and client-certificate variables since v0.21.0, already in v0.1.0. TestOTel_TLSPath_AllSignals now pins it for all three signals.
    • A malformed OTEL_EXPORTER_OTLP_HEADERS entry makes the logs exporter drop the whole variable, while traces and metrics skip only that entry.
    • Each signal misreads a scheme-less endpoint differently, so always write the scheme.
    • Turning otel.logs.enabled off strips trace_id/span_id, component, source and the build fields from stdout.
    • The local-dashboard steps now enable OTel for make dev and compose.
    • The Alloy pattern keeps OTLP logs on, for the stdout trace IDs.
    • make vulncheck is a package-level scan.
    • go get -u needs the gRPC re-pin before go mod tidy.

After this and the nats-server fix land, Dependabot's next go-deps run should go green. The npm cooldown syntax is validated against the published Dependabot schema but only runs on Dependabot's next schedule.

Test plan

  • make ci green locally on the final tree.
  • go list -m google.golang.org/grpc → v1.83.2; go mod tidy -diff clean; make vulncheck and make lint-go clean (no SA1019).
  • go test -tags integration -run TestOTel ./tests/integration/ passes, including logs over a private CA.
  • The documented go get -u ./... → go get google.golang.org/grpc@v1.83 → go mod tidy sequence verified in a scratch copy (gRPC, proto/otlp and grpc-gateway step back down; make tidy clean).
  • Pre-push review: the code reviewer returned ship_it on the code (later commits change only docs, comments and a Makefile help string, so its skip is logged). The docs reviewer returned ship_it on the final commit; its marker was recorded by hand because hand-back reports don't write one yet (fix(agents): review-marker hook writes no marker when a reviewer's report arrives by hand-back #659).

Related Issues

Closes #732. Refs #643 (stays open until the holds are dropped), refs #441 (cooldown covers the bumped package only). Part of #740.

🤖 Generated with Claude Code

EricAndrechek and others added 15 commits October 6, 2026 20:16
otel/log 1.47 deprecates log/global; the replacement otel.GetLoggerProvider
ships with otel 1.47, so the module set and the ten call sites move together.
grpc stays at 1.83.2.

Dependabot ignores grpc >= 1.84.0, < 1.85.0 (GO-2026-6443, no 1.84.x fix) and
gets a 7-day npm cooldown to match pnpm's minimumReleaseAge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ent the holds

The integration test still used otel/log/global. otlploggrpc 0.23.0 honours
the TLS env vars, so the known-gap notes are corrected and the TLS test now
covers logs. Dependabot gets cooldown excludes matching pnpm's, and the docs
describe the holds, the cooldown and the endpoint handling accurately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The logs exporter has applied the OTLP TLS env vars since v0.21.0, which v0.1.0 already shipped; this branch removes a stale docs gap rather than changing behaviour. Also say the companion holds cover later releases, what a scheme-less endpoint does to logs, and why Prometheus-only operation dials nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…less endpoint

The logs exporter discards the whole OTEL_EXPORTER_OTLP_HEADERS value when one entry is malformed, so logs go out unauthenticated while traces and metrics skip only that entry; the docs and comments said every signal skips the entry. Move the scheme-less endpoint behaviour out of the env-var list into its own sentences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… dev OTel steps

A scheme-less endpoint's behaviour depends on how Go parses the host and on OTEL_EXPORTER_OTLP_INSECURE, so say only that the signals misread it differently and to always write the scheme. OTEL_EXPORTER_OTLP_INSECURE needs the endpoint unset; the three signals share an endpoint, not a connection; make dev leaves OTel off, so give the variables it needs; and date the logs shutdown bound to sdk/log v0.20.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…me-less claim

A manual go get -u pulls the held gRPC 1.84 and fails make vulncheck, so say so next to the instructions. Also drop the claim that traces and metrics still export with a scheme-less endpoint, and complete the CHANGELOG file list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… go get -u

make dev and the standalone compose file leave OTel off, so setting only the endpoint sends nothing; say to set WH_OTEL_ENABLED too. After go get -u, pinning gRPC back to 1.83.2 steps proto/otlp and grpc-gateway down with it. Put the logs Shutdown behaviour in the test comment in the past, matching provider.go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ose file

Only make obs-front publishes 4318; the compose file passes no environment through, so the variables go in its environment block; and host.docker.internal needs extra_hosts on Linux Docker Engine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Re-pinning after go mod tidy leaves stale go.sum lines that make tidy rejects. go get -u also upgrades indirect dependencies.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…int at the gRPC re-pin

With otel.enabled on for traces, metrics and logs default to on and are pushed over OTLP as well as scraped; give the pattern a worked environment that turns them off. Name the go get re-pin line wherever the gRPC holds' removal is described, so it goes with them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It covers the main module's non-test dependencies; test-only deps need -t and the go.mod tool block needs go get -u tool.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An exact v1.83.2 would downgrade gRPC once Dependabot takes a later 1.83.x patch; @v1.83 always resolves to the newest 1.83.x.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GO-2026-6443 affects 1.83.0 and 1.83.1; only 1.83.2 carries the fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
make vulncheck runs govulncheck -scan package, which reports any advisory in an imported package without reachability; only V=1 runs the call-graph scan. The gRPC hold text relies on that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…them off costs stdout

Only the OTel-aware logger adds trace_id/span_id, component, source and the build fields to stdout, so turning otel.logs.enabled off breaks Loki-to-Tempo links; the configuration table said it left stdout untouched. Describe make vulncheck's V=1 output accurately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 013355b4-da2a-4003-8055-13458f44130c

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file go Pull requests that update go code area/observability Metrics, logs, traces, health, profiling area/docs Documentation, site/, README area/infra CI, build, deploy, Docker, release area/app Process wiring (internal/app): component build, run, release labels Oct 7, 2026
@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

📚 Docs preview is live → https://f8113f76-wavehouse-docs.wave-rf.workers.dev

  • Commit — f369cc1: docs(otel): keep OTLP logs on in the Alloy pattern; say what turning them off costs stdout
  • Author — @EricAndrechek, Claude Opus 5.5
  • Committed — 2026-10-07 08:42 (UTC-04:00)
  • Deployed — 2026-10-07 09:58 EDT

@github-code-quality

github-code-quality Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: Go

Go

The overall line coverage in commit f369cc1 in the deps/go-deps-unblock branch remains at 93%, unchanged from commit bf88dba in the main branch.

Show a line coverage summary of the most impacted files.
File main bf88dba deps/go-deps-unblock f369cc1 +/-
internal/mq/nats_topology.go 92% 91% -1%
internal/mq/external.go 85% 84% -1%
internal/ingest/worker.go 97% 97% 0%
internal/observ...ity/provider.go 83% 83% 0%

Updated October 07, 2026 14:03 UTC

@EricAndrechek
EricAndrechek marked this pull request as ready for review October 7, 2026 13:55
@EricAndrechek
EricAndrechek requested review from a team and taitelee October 7, 2026 13:55
@EricAndrechek
EricAndrechek added this pull request to the merge queue Oct 7, 2026
Merged via the queue into main with commit c2c8b5d Oct 7, 2026
@EricAndrechek
EricAndrechek deleted the deps/go-deps-unblock branch October 7, 2026 14:57
EricAndrechek added a commit that referenced this pull request Oct 9, 2026
)

Repeated pushes to a PR reused no Go build objects. Measured from CI
logs (2026-10-06 to 10-08), that only matters on a PR that changes
`go.mod`/`go.sum`, so only that case is cached, and only for the two
long-pole jobs.

- **Measured, typical PR.** The integration suite's `app` part compiles
in 5.8–8.5 s from `main`'s entry, against 2.3–3.2 s from a same-tree
one. e2e's 4–7 s cover build is hidden behind its SDK build. A PR-scoped
cache would buy about 4–5 s per push, which is inside the `app` part's
run-to-run spread, so these PRs still save nothing.
- **Measured, dependency-changing PR (#730, #742, #753).** Every push
recompiles the dependency delta from `main`'s generation: 35–50 s in the
integration suite and a 37–49 s cover build in e2e, against about 3 s
and 4 s from the PR's own entry. That is about 30–45 s per push on the
critical path. Of 129 PR runs since 2026-09-25, 34 came from 9 such PRs,
and 25 of those were second or later pushes.
- **Classifier.** `scripts/classify-paths.sh` also emits `go-deps`: any
`go.mod`/`go.sum` in the change set, in any module, which are the files
the cache keys hash. `classify-changes.sh` passes it through only for a
cleanly classified pull request and sets it false everywhere it fails
closed. The `changes` job exposes it as an output.
- **setup-env.** A new `go-cache-pr-save` input, which the `app` part
and e2e set only when `go-deps` is true. So a PR that changes no
dependency never saves, even while `main` holds no entry for its key:
just after a bump lands on `main`, after a failed `main` run, or for a
newly opted-in job. With the input set, the job looks up the exact key
first, from the PR's scope or `main`'s, so a PR whose dependency change
`main` already has hits `main`'s entry and saves nothing. Only on a miss
does it restore the newest entry of its flavor (the PR's own, then
`main`'s) and save the exact key into the PR's scope. The key is per
dependency state, so a PR saves once per dependency change. Merge-queue
refs and branches stay restore-only, and nothing is added to `ci.yml`
beyond the two inputs.
- **Pruning.** `pr-cache-cleanup.yml` gains a `workflow_run` job that
runs after every PR's CI run. It runs the new
`scripts/ci/prune-pr-build-cache.sh` from the default branch with
`actions: write` and deletes every PR-scoped `gobuild-v3` entry that
`main` also holds or that a newer entry of the same flavor supersedes.
It deduplicates the paged listing before grouping, since a row returned
twice would otherwise delete the PR's newest entry, and a fixture test
(`make test-prune-pr-build-cache`, a new `make verify` leaf) pins the
selection and the failure handling. No PR code holds the write token.
The job needs no PR number, so it covers fork PRs too. A PR holds at
most about 0.48 GiB of build cache (double that for the minutes before a
prune).
- **Budget.** The README sizes this for four such PRs open at once, the
most open at once in the last two weeks. The worst case at rest is about
11.7 GiB, about 1.7 GiB over the cap, and eviction by last access takes
it from `main`'s superseded generation, which nothing reads (inferred).
At two such PRs everything fits. `main`'s live entries stay safe up to
six: 3.9 + N × (0.5 CodeQL + 0.48 build) ≤ 10 GiB, assuming the
superseded generation is the size of the live one. The six build flavors
together are 1.02 GiB on `main`; the issue's "about 1.3 GiB per suffix"
was the total for all six of a PR's flavors.

## Test plan

This branch's diff matches #783's (same 13 files, +450/−67), which
CodeRabbit approved; the only line differences are the verify-leaf list
and the `make verify` table row, which differ because the base did.
Re-run here: the pre-commit `make verify` (which runs both fixture
suites below) and a full `make ci`. Items marked "measured on #783" were
not repeated; the CI items are observable once this PR targets `main`.

- [x] `make lint-gha` (actionlint, which also checks the new input and
the `go-deps` output) and `make lint-sh` clean; `make verify` green in
the pre-commit hook, including the new leaf.
- [x] `make test-classify-paths`: new `go-deps` cases (root and nested
modules, look-alike names, mixed with docs, empty, large input); a
mutant that matches only the root `go.mod`/`go.sum` fails it (mutant
measured on #783). `classify-changes.sh` against a stub `gh`:
`go-deps=true` only for a pull request whose file list holds a `go.sum`;
false on push, merge group, dispatch and a failed listing.
- [ ] (measured on #783) The setup-env step conditions, evaluated for
push to `main`, `pull_request` with and without the input, `merge_group`
and `workflow_dispatch`: exactly one restore path runs, and only a PR
miss with the input set is save-capable.
- [ ] (measured on #783) `prune-pr-build-cache.sh --dry-run` against the
live cache list selects 6 entries (1058 MiB): copies of `main`'s keys
under #731, #754 and #756. It keeps #753's own entries (one per flavor,
not on `main`) and never touches `main` or merge-queue scopes.
- [x] `make test-prune-pr-build-cache`: deletes copies of `main`'s key
and version and keeps a same key with another version; deletes
superseded entries and the older of a same-second pair; keeps
`-integration-` apart from `-integration-app-`; ignores other families
and `main`/merge-queue scopes; keeps a PR's only entry listed twice.
Through a stub `gh`: a 404 reads as already gone, a 403 fails after the
rest are attempted, and a failed listing fails. Mutants caught (measured
on #783): no early dedup (the pre-fix script), key-only match, merged
flavors, no prefix filter, `main` scope included, listing failure
ignored, 404 treated as an error, 403 swallowed.
- [ ] This PR's own run, which changes no dependency: `Detect changes`
logs `go-deps=false`, and every Go job, the `app` part and e2e included,
uses the plain restore step, with no `Cache saved` for `gobuild-v3` in
any post step.
- [ ] After merge, the first `PR cache cleanup` run triggered by a PR's
CI (`Prune PR build caches`): passes and deletes the entries the dry run
listed, if they are still there.
- [ ] The first PR that changes `go.mod`/`go.sum` (the next Dependabot
go-deps PR): `Detect changes` logs `go-deps=true`; the first push
restores `main`'s generation through restore-keys and saves
`gobuild-v3-Linux-go-integration-app-<its hash>` and `-e2e-cov-<its
hash>` under `refs/pull/<n>/merge`; the second push exact-hits them, its
integration compile is about 3 s and e2e reaches its containers about 20
s after `make` starts; the prune leaves one entry per flavor; the close
cleanup deletes them. A fork PR's save is unverified: if GitHub refuses
it, the job only logs a warning.
- [x] `make ci` passes on this branch, after merging `main` (#793 and
#788).

## Related Issues

Closes #781. Refs #535 (two generations on `main` still leave thin
headroom). Part of #740.

Supersedes #783. Now based on `main`: its parent, the `-trimpath` PR
#793, has merged. It does not itself use `-trimpath` or `make
ci-remote`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01Wjv2nu841pxTMdUWSAPmDH

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/app Process wiring (internal/app): component build, run, release area/docs Documentation, site/, README area/infra CI, build, deploy, Docker, release area/observability Metrics, logs, traces, health, profiling dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation go Pull requests that update go code

Projects

Archived in project

Development

Successfully merging this pull request may close these issues.

deps: otel/log 1.47.0 deprecates log/global — 9 SA1019 findings hold the go-deps group red

2 participants