Skip to content

fix: bump otel to v1.44.0 and x/text to v0.39.0 for govulncheck - #107

Merged
thrawn01 merged 1 commit into
masterfrom
fix/govulncheck-otel-x-text
Aug 24, 2026
Merged

fix: bump otel to v1.44.0 and x/text to v0.39.0 for govulncheck#107
thrawn01 merged 1 commit into
masterfrom
fix/govulncheck-otel-x-text

Conversation

@thrawn01

Copy link
Copy Markdown
Collaborator

Purpose

The v2.20.2 release workflow failed. govulncheck exited 3 on two vulnerabilities it found reachable from our own call graph, which blocks the build job and therefore the container and Helm chart publish:

  • GO-2026-5970 — infinite loop on invalid input in golang.org/x/text v0.37.0. Reached through http.Get at cmd/healthcheck/main.go:69, so a healthcheck against a server returning malformed headers can hang the probe. Fixed in v0.39.0.
  • GO-2026-5158go.opentelemetry.io/otel v1.43.0 stopped capping the raw baggage header length during parsing. Reached through the gRPC baggage propagator on every v1Client call, so an attacker-supplied baggage header is parsed without a length bound. Fixed in v1.44.0.

Nothing changes for users of the library: no API, configuration, or behavior changes, only dependency versions and one import path. After this lands the release needs a re-cut as v2.20.3 — fixing master does not retroactively green the v2.20.2 run.

Implementation

  • Bumped golang.org/x/text to v0.39.0 and the otel family — core, sdk, trace, metric, and the three otlptrace exporters — to v1.44.0, keeping the otel modules on a single version. go mod tidy pulled grpc-gateway/v2 v2.28.0 → v2.29.0 and the usual transitive golang.org/x/* and genproto bumps along with it.
  • Moved the semconv import in cmd/gubernator/main.go from v1.40.0 to v1.41.0. This is required, not cosmetic: otel v1.44.0 moves resource.Default() to semconv schema 1.41.0, and resource.Merge rejects a merge across two schema URLs. Left at v1.40.0 the daemon dies at startup with conflicting Schema URL: https://opentelemetry.io/schemas/1.41.0 and https://opentelemetry.io/schemas/1.40.0, which reproduced as a 3-for-3 TestCLI failure. The semconv import has to move in lockstep with every otel minor bump.

Verification

  • govulncheck ./... no longer reports either vulnerability, and flags no third-party module at all.
  • go build ./... and go vet ./... clean.
  • make test green: gubernator 26.0s, cluster 1.7s, cmd/gubernator 3.8s.
  • make lint reports 0 issues.

The v2.20.2 release workflow failed govulncheck with two reachable
vulnerabilities:

  GO-2026-5970 - infinite loop on invalid input in golang.org/x/text
                 v0.37.0, reached via http.Get in cmd/healthcheck.
                 Fixed in v0.39.0.

  GO-2026-5158 - uncapped raw baggage header length in
                 go.opentelemetry.io/otel v1.43.0, reached via the gRPC
                 baggage propagator. Fixed in v1.44.0.

otel v1.44.0 moves resource.Default() to semconv schema 1.41.0, so the
semconv import in cmd/gubernator had to move with it. Left at v1.40.0,
resource.Merge() rejects the mismatched schema URLs and the daemon dies
at startup with "conflicting Schema URL".
@thrawn01
thrawn01 requested a review from Baliedge as a code owner August 24, 2026 21:22
@thrawn01
thrawn01 merged commit 4e681da into master Aug 24, 2026
4 of 7 checks passed
thrawn01 added a commit that referenced this pull request Aug 25, 2026
PR #107 failed this gate twice on the same commit against the same
cached master baseline, flagging a different set of benchmarks each
time. Run one flagged Concurrent_writes at 2.02x while reads passed;
the re-run flagged Concurrent_reads at 5.58x and
Concurrent_reads_and_writes_of_existing_keys at 4.86x while writes
passed. That diff only bumped otel, x/text and grpc-gateway, and
lrucache.go imports none of them. An interleaved local A/B of the two
dependency sets over 8 rounds measured geomean +0.01%, with five of
six benchmarks statistically indistinguishable.

make bench takes one sample per benchmark, and this step compares that
single sample against a single cached sample from master. On a shared
runner that cannot separate a real regression from scheduler noise,
which is why the same commit produced different "regressions" on two
runs. Benchmarks still run and alerts still appear in the job summary;
they no longer fail the build.

Raising the sample count was considered and rejected for now. The
action offers no reduction step: extractGoResult emits one entry per
output line with no grouping, and findAlerts compares every entry
against whichever baseline line matched first, so N samples give N
independent chances to trip the threshold rather than one averaged
comparison. Making the gate block merges again needs that reduction
first.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant