diff --git a/.github/workflows/synclibbpf.yaml b/.github/workflows/synclibbpf.yaml index 45b6d2aa5..38d3a8f4a 100644 --- a/.github/workflows/synclibbpf.yaml +++ b/.github/workflows/synclibbpf.yaml @@ -17,7 +17,7 @@ jobs: - name: Setup Go uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5 with: - go-version: "~1.23.1" + go-version: "~1.24.0" check-latest: true cache-dependency-path: "**/go.sum" - id: sync diff --git a/CHANGELOG.md b/CHANGELOG.md index 763c4b379..3afaca3ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ OpenTelemetry Go Automatic Instrumentation adheres to [Semantic Versioning](http The `auto` package no longer supports process discovery (note: the built binary (`auto/cli`) still supports process discovery). Once a target process has been identified, use `WithPID` to configure `Instrumentation` instead. ([#1890](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/1890)) +### Fixed + +- Fix spans parsing from eBPF for the legacy (go version < 1.24 otel-go < 1.33) otel global instrumentation. ([#1960](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/1960)) + ## [v0.21.0] - 2025-02-18 > [!WARNING] diff --git a/Makefile b/Makefile index c770c4fb5..1d2f857e4 100644 --- a/Makefile +++ b/Makefile @@ -140,15 +140,6 @@ docker-build: docker-build-base: docker buildx build -t $(IMG_NAME_BASE) --target base . -.PHONY: sample-app/nethttp sample-app/gin sample-app/databasesql sample-app/nethttp-custom sample-app/otelglobal sample-app/autosdk sample-app/kafka-go -sample-app/%: LIBRARY=$* -sample-app/%: - if [ -f ./internal/test/e2e/$(LIBRARY)/build.sh ]; then \ - ./internal/test/e2e/$(LIBRARY)/build.sh; \ - else \ - cd internal/test/e2e/$(LIBRARY) && docker build -t sample-app . ;\ - fi - LIBBPF_VERSION ?= "< 1.5, >= 1.4.7" LIBBPF_DEST ?= "$(REPODIR)/internal/include/libbpf" .PHONY: synclibbpf @@ -204,7 +195,12 @@ fixture-otelglobal: fixtures/otelglobal fixture-autosdk: fixtures/autosdk fixture-kafka-go: fixtures/kafka-go fixtures/%: LIBRARY=$* -fixtures/%: docker-build sample-app/% +fixtures/%: docker-build + if [ -f ./internal/test/e2e/$(LIBRARY)/build.sh ]; then \ + ./internal/test/e2e/$(LIBRARY)/build.sh; \ + else \ + cd internal/test/e2e/$(LIBRARY) && docker build -t sample-app . ;\ + fi kind create cluster kind load docker-image otel-go-instrumentation sample-app helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts diff --git a/examples/httpPlusdb/Dockerfile b/examples/httpPlusdb/Dockerfile index 3100d7dbe..a02c689b0 100644 --- a/examples/httpPlusdb/Dockerfile +++ b/examples/httpPlusdb/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 WORKDIR /app COPY ./*.go . RUN go mod init main diff --git a/examples/kafka-go/Dockerfile b/examples/kafka-go/Dockerfile index d3f58f5af..a1dfb0c35 100644 --- a/examples/kafka-go/Dockerfile +++ b/examples/kafka-go/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 WORKDIR /app COPY . . ARG BINARY_NAME diff --git a/examples/rolldice/docker-compose.yaml b/examples/rolldice/docker-compose.yaml index 3f0c3bed8..5b88b1871 100644 --- a/examples/rolldice/docker-compose.yaml +++ b/examples/rolldice/docker-compose.yaml @@ -5,7 +5,7 @@ networks: services: jaeger: - image: jaegertracing/jaeger:2.3.0@sha256:6f578f9f7e3cfadf2f46a3c4ceb52614b8520b519eedcb465d63a08136b5cd24 + image: jaegertracing/jaeger:2.4.0@sha256:81afdc6ae85f52a5f063c80fcdb201798bb283d81067211121291b64026c19c2 ports: - "16686:16686" # Web HTTP restart: unless-stopped diff --git a/examples/rolldice/frontend/Dockerfile b/examples/rolldice/frontend/Dockerfile index 3d0a0fc72..e9fbaa069 100644 --- a/examples/rolldice/frontend/Dockerfile +++ b/examples/rolldice/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 WORKDIR /usr/src/user diff --git a/examples/rolldice/user/Dockerfile b/examples/rolldice/user/Dockerfile index 3500961ee..4383e719e 100644 --- a/examples/rolldice/user/Dockerfile +++ b/examples/rolldice/user/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 WORKDIR /usr/src/user diff --git a/go.mod b/go.mod index 40a9beea3..7182b925d 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/stretchr/testify v1.10.0 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 go.opentelemetry.io/collector/pdata v1.27.0 - go.opentelemetry.io/contrib/exporters/autoexport v0.59.0 + go.opentelemetry.io/contrib/exporters/autoexport v0.60.0 go.opentelemetry.io/otel v1.35.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 @@ -57,7 +57,7 @@ require ( github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/bridges/prometheus v0.59.0 // indirect + go.opentelemetry.io/contrib/bridges/prometheus v0.60.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.11.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.11.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0 // indirect @@ -75,8 +75,8 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.37.0 // indirect golang.org/x/text v0.23.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250311190419-81fb87f6b8bf // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf // indirect google.golang.org/protobuf v1.36.5 // indirect ) diff --git a/go.sum b/go.sum index 536f85bb9..9803b0922 100644 --- a/go.sum +++ b/go.sum @@ -80,10 +80,10 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/collector/pdata v1.27.0 h1:66yI7FYkUDia74h48Fd2/KG2Vk8DxZnGw54wRXykCEU= go.opentelemetry.io/collector/pdata v1.27.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= -go.opentelemetry.io/contrib/bridges/prometheus v0.59.0 h1:HY2hJ7yn3KuEBBBsKxvF3ViSmzLwsgeNvD+0utRMgzc= -go.opentelemetry.io/contrib/bridges/prometheus v0.59.0/go.mod h1:H4H7vs8766kwFnOZVEGMJFVF+phpBSmTckvvNRdJeDI= -go.opentelemetry.io/contrib/exporters/autoexport v0.59.0 h1:dKhAFwh7SSoOw+gwMtSv+XLkUGTFAwAGMT3X3XSE4FA= -go.opentelemetry.io/contrib/exporters/autoexport v0.59.0/go.mod h1:fPl+qlrhRdRntIpPs9JoQ0iBKAsnH5VkgppU1f9kyF4= +go.opentelemetry.io/contrib/bridges/prometheus v0.60.0 h1:x7sPooQCwSg27SjtQee8GyIIRTQcF4s7eSkac6F2+VA= +go.opentelemetry.io/contrib/bridges/prometheus v0.60.0/go.mod h1:4K5UXgiHxV484efGs42ejD7E2J/sIlepYgdGoPXe7hE= +go.opentelemetry.io/contrib/exporters/autoexport v0.60.0 h1:GuQXpvSXNjpswpweIem84U9BNauqHHi2w1GtNAalvpM= +go.opentelemetry.io/contrib/exporters/autoexport v0.60.0/go.mod h1:CkmxekdHco4d7thFJNPQ7Mby4jMBgZUclnrxT4e+ryk= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.11.0 h1:HMUytBT3uGhPKYY/u/G5MR9itrlSO2SMOsSD3Tk3k7A= @@ -161,10 +161,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/api v0.0.0-20250311190419-81fb87f6b8bf h1:BdIVRm+fyDUn8lrZLPSlBCfM/YKDwUBYgDoLv9+DYo0= +google.golang.org/genproto/googleapis/api v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf h1:dHDlF3CWxQkefK9IJx+O8ldY0gLygvrlYRBNbPqDWuY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= diff --git a/instrumentation.go b/instrumentation.go index bdc7d0e61..4d241c0c4 100644 --- a/instrumentation.go +++ b/instrumentation.go @@ -53,9 +53,7 @@ const ( // Instrumentation manages and controls all OpenTelemetry Go // auto-instrumentation. type Instrumentation struct { - target *process.Info - analyzer *process.Analyzer - manager *instrumentation.Manager + manager *instrumentation.Manager stopMu sync.Mutex stop context.CancelFunc @@ -97,42 +95,17 @@ func NewInstrumentation(ctx context.Context, opts ...InstrumentationOption) (*In } cp := convertConfigProvider(c.cp) - mngr, err := instrumentation.NewManager(c.logger, ctrl, cp, p...) + mngr, err := instrumentation.NewManager(c.logger, ctrl, c.pid, cp, p...) if err != nil { return nil, err } - pa := process.NewAnalyzer(c.logger, c.pid) - pi, err := pa.Analyze(mngr.GetRelevantFuncs()) - if err != nil { - return nil, err - } - - alloc, err := process.Allocate(c.logger, c.pid) - if err != nil { - return nil, err - } - pi.Allocation = alloc - - c.logger.Info( - "target process analysis completed", - "pid", pi.ID, - "go_version", pi.GoVersion, - "dependencies", pi.Modules, - "total_functions_found", len(pi.Functions), - ) - mngr.FilterUnusedProbes(pi) - - return &Instrumentation{ - target: pi, - analyzer: pa, - manager: mngr, - }, nil + return &Instrumentation{manager: mngr}, nil } // Load loads and attaches the relevant probes to the target process. func (i *Instrumentation) Load(ctx context.Context) error { - return i.manager.Load(ctx, i.target) + return i.manager.Load(ctx) } // Run starts the instrumentation. It must be called after [Instrumentation.Load]. diff --git a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf/probe.bpf.c b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf/probe.bpf.c index cca88512f..9fcd1f7e8 100644 --- a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf/probe.bpf.c +++ b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf/probe.bpf.c @@ -46,11 +46,11 @@ typedef struct tracer_id { } tracer_id_t; struct control_t { - u32 kind; // Required to be 1. + u64 kind; // Required to be 1. }; struct otel_span_t { - u32 kind; // Required to be 0. + u64 kind; // Required to be 0. BASE_SPAN_PROPERTIES struct span_name_t span_name; otel_status_t status; @@ -622,6 +622,7 @@ int uprobe_End(struct pt_regs *ctx) { return 0; } span->end_time = bpf_ktime_get_ns(); + span->kind = 0; stop_tracking_span(&span->sc, &span->psc); output_span_event(ctx, span, sizeof(*span), &span->sc); diff --git a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_arm64_bpfel.go b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_arm64_bpfel.go index bcfb0a47e..b513ed20b 100644 --- a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_arm64_bpfel.go +++ b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_arm64_bpfel.go @@ -13,8 +13,7 @@ import ( ) type bpfOtelSpanT struct { - Kind uint32 - _ [4]byte + Kind uint64 StartTime uint64 EndTime uint64 Sc bpfSpanContext diff --git a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_x86_bpfel.go b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_x86_bpfel.go index 6c88185f7..31a29a6db 100644 --- a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_x86_bpfel.go +++ b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/bpf_x86_bpfel.go @@ -13,8 +13,7 @@ import ( ) type bpfOtelSpanT struct { - Kind uint32 - _ [4]byte + Kind uint64 StartTime uint64 EndTime uint64 Sc bpfSpanContext diff --git a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/probe.go b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/probe.go index bad9b4f57..5b72cc882 100644 --- a/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/probe.go +++ b/internal/pkg/instrumentation/bpf/go.opentelemetry.io/otel/traceglobal/probe.go @@ -210,7 +210,7 @@ func New(logger *slog.Logger) probe.Probe { } } -type recordKind uint32 +type recordKind uint64 const ( recordKindTelemetry recordKind = iota @@ -236,7 +236,6 @@ func (c *converter) decodeEvent(record perf.Record) (*event, error) { switch kind { case recordKindTelemetry: e = new(event) - reader.Reset(record.RawSample) err = binary.Read(reader, binary.LittleEndian, e) case recordKindConrol: if c.uprobeNewStart != nil { diff --git a/internal/pkg/instrumentation/manager.go b/internal/pkg/instrumentation/manager.go index 875f30d53..4a95d1db3 100644 --- a/internal/pkg/instrumentation/manager.go +++ b/internal/pkg/instrumentation/manager.go @@ -55,7 +55,7 @@ type Manager struct { } // NewManager returns a new [Manager]. -func NewManager(logger *slog.Logger, otelController *opentelemetry.Controller, cp ConfigProvider, probes ...probe.Probe) (*Manager, error) { +func NewManager(logger *slog.Logger, otelController *opentelemetry.Controller, pid process.ID, cp ConfigProvider, probes ...probe.Probe) (*Manager, error) { m := &Manager{ logger: logger, probes: make(map[probe.ID]probe.Probe), @@ -63,11 +63,33 @@ func NewManager(logger *slog.Logger, otelController *opentelemetry.Controller, c cp: cp, } - err := m.registerProbes(probes) + funcs := make(map[string]any) + for _, p := range probes { + if err := m.registerProbe(p); err != nil { + return nil, err + } + + for _, s := range p.Manifest().Symbols { + funcs[s.Symbol] = nil + } + } + + var err error + m.proc, err = process.NewInfo(pid, funcs) if err != nil { return nil, err } + alloc, err := process.Allocate(logger, pid) + if err != nil { + return nil, err + } + m.proc.Allocation = alloc + + m.logger.Info("loaded process info", "process", m.proc) + + m.filterUnusedProbes() + return m, nil } @@ -103,23 +125,11 @@ func (m *Manager) registerProbe(p probe.Probe) error { return nil } -// GetRelevantFuncs returns the instrumented functions for all managed probes. -func (m *Manager) GetRelevantFuncs() map[string]interface{} { - funcsMap := make(map[string]interface{}) - for _, i := range m.probes { - for _, s := range i.Manifest().Symbols { - funcsMap[s.Symbol] = nil - } - } - - return funcsMap -} - -// FilterUnusedProbes filterers probes whose functions are already instrumented +// filterUnusedProbes filterers probes whose functions are already instrumented // out of the Manager. -func (m *Manager) FilterUnusedProbes(target *process.Info) { +func (m *Manager) filterUnusedProbes() { existingFuncMap := make(map[string]interface{}) - for _, f := range target.Functions { + for _, f := range m.proc.Functions { existingFuncMap[f.Name] = nil } @@ -237,14 +247,14 @@ func (m *Manager) ConfigLoop(ctx context.Context) { } } -func (m *Manager) Load(ctx context.Context, target *process.Info) error { +func (m *Manager) Load(ctx context.Context) error { if len(m.probes) == 0 { return errors.New("no instrumentation for target process") } if m.cp == nil { return errors.New("no config provider set") } - if target == nil { + if m.proc == nil { return errors.New("target details not set - load is called on non-initialized instrumentation") } m.stateMu.Lock() @@ -255,12 +265,11 @@ func (m *Manager) Load(ctx context.Context, target *process.Info) error { } m.currentConfig = m.cp.InitialConfig(ctx) - err := m.loadProbes(target) + err := m.loadProbes() if err != nil { return err } - m.proc = target m.state = managerStateLoaded return nil @@ -330,7 +339,7 @@ func (m *Manager) Stop() error { defer m.probeMu.Unlock() m.logger.Debug("Shutting down all probes") - err := m.cleanup(m.proc) + err := m.cleanup() // Wait for all probes to stop. m.runningProbesWG.Wait() @@ -339,19 +348,19 @@ func (m *Manager) Stop() error { return err } -func (m *Manager) loadProbes(target *process.Info) error { +func (m *Manager) loadProbes() error { // Remove resource limits for kernels <5.11. if err := rlimitRemoveMemlock(); err != nil { return err } - exe, err := openExecutable(target.ID.ExePath()) + exe, err := openExecutable(m.proc.ID.ExePath()) if err != nil { return err } m.exe = exe - if err := m.mount(target); err != nil { + if err := m.mount(); err != nil { return err } @@ -359,10 +368,10 @@ func (m *Manager) loadProbes(target *process.Info) error { for name, i := range m.probes { if isProbeEnabled(name, m.currentConfig) { m.logger.Info("loading probe", "name", name) - err := i.Load(exe, target, m.currentConfig.SamplingConfig) + err := i.Load(exe, m.proc, m.currentConfig.SamplingConfig) if err != nil { m.logger.Error("error while loading probes, cleaning up", "error", err, "name", name) - return errors.Join(err, m.cleanup(target)) + return errors.Join(err, m.cleanup()) } } } @@ -371,16 +380,16 @@ func (m *Manager) loadProbes(target *process.Info) error { return nil } -func (m *Manager) mount(target *process.Info) error { - if target.Allocation != nil { - m.logger.Debug("Mounting bpffs", "allocation", target.Allocation) +func (m *Manager) mount() error { + if m.proc.Allocation != nil { + m.logger.Debug("Mounting bpffs", "allocation", m.proc.Allocation) } else { m.logger.Debug("Mounting bpffs") } - return bpffsMount(target) + return bpffsMount(m.proc) } -func (m *Manager) cleanup(target *process.Info) error { +func (m *Manager) cleanup() error { ctx := context.Background() err := m.cp.Shutdown(context.Background()) for _, i := range m.probes { @@ -394,14 +403,5 @@ func (m *Manager) cleanup(target *process.Info) error { } m.logger.Debug("Cleaning bpffs") - return errors.Join(err, bpffsCleanup(target)) -} - -func (m *Manager) registerProbes(probes []probe.Probe) error { - for _, p := range probes { - if err := m.registerProbe(p); err != nil { - return err - } - } - return nil + return errors.Join(err, bpffsCleanup(m.proc)) } diff --git a/internal/pkg/instrumentation/manager_load_test.go b/internal/pkg/instrumentation/manager_load_test.go index 3e9b93184..24258c1ce 100644 --- a/internal/pkg/instrumentation/manager_load_test.go +++ b/internal/pkg/instrumentation/manager_load_test.go @@ -22,8 +22,11 @@ import ( grpcServer "go.opentelemetry.io/auto/internal/pkg/instrumentation/bpf/google.golang.org/grpc/server" httpClient "go.opentelemetry.io/auto/internal/pkg/instrumentation/bpf/net/http/client" httpServer "go.opentelemetry.io/auto/internal/pkg/instrumentation/bpf/net/http/server" + "go.opentelemetry.io/auto/internal/pkg/instrumentation/probe" "go.opentelemetry.io/auto/internal/pkg/instrumentation/testutils" "go.opentelemetry.io/auto/internal/pkg/instrumentation/utils" + "go.opentelemetry.io/auto/internal/pkg/process" + "go.opentelemetry.io/auto/internal/pkg/process/binary" ) func TestLoadProbes(t *testing.T) { @@ -51,10 +54,9 @@ func TestLoadProbes(t *testing.T) { } } -func fakeManager(t *testing.T) *Manager { +func fakeManager(t *testing.T, fnNames ...string) *Manager { logger := slog.Default() - m, err := NewManager( - logger, nil, NewNoopConfigProvider(nil), + probes := []probe.Probe{ grpcClient.New(logger, ""), grpcServer.New(logger, ""), httpServer.New(logger, ""), @@ -64,9 +66,27 @@ func fakeManager(t *testing.T) *Manager { kafkaConsumer.New(logger, ""), autosdk.New(logger), otelTraceGlobal.New(logger), - ) - assert.NoError(t, err) - assert.NotNil(t, m) + } + ver := semver.New(1, 20, 0, "", "") + var fn []*binary.Func + for _, name := range fnNames { + fn = append(fn, &binary.Func{Name: name}) + } + m := &Manager{ + logger: slog.Default(), + cp: NewNoopConfigProvider(nil), + probes: make(map[probe.ID]probe.Probe), + proc: &process.Info{ + ID: 1, + Functions: fn, + GoVersion: ver, + Modules: map[string]*semver.Version{}, + }, + } + for _, p := range probes { + m.probes[p.Manifest().ID] = p + } + m.filterUnusedProbes() return m } diff --git a/internal/pkg/instrumentation/manager_test.go b/internal/pkg/instrumentation/manager_test.go index 2b68bcae0..1b0670a2f 100644 --- a/internal/pkg/instrumentation/manager_test.go +++ b/internal/pkg/instrumentation/manager_test.go @@ -39,72 +39,32 @@ import ( ) func TestProbeFiltering(t *testing.T) { - ver := semver.New(1, 20, 0, "", "") - t.Run("empty target details", func(t *testing.T) { m := fakeManager(t) - - info := process.Info{ - ID: 1, - Functions: []*binary.Func{}, - GoVersion: ver, - Modules: map[string]*semver.Version{}, - } - m.FilterUnusedProbes(&info) assert.Empty(t, m.probes) }) t.Run("only HTTP client target details", func(t *testing.T) { - m := fakeManager(t) - - httpFuncs := []*binary.Func{ - {Name: "net/http.(*Transport).roundTrip"}, - } - - info := process.Info{ - ID: 1, - Functions: httpFuncs, - GoVersion: ver, - Modules: map[string]*semver.Version{}, - } - m.FilterUnusedProbes(&info) + m := fakeManager(t, "net/http.(*Transport).roundTrip") assert.Len(t, m.probes, 1) // one function, single probe }) t.Run("HTTP server and client target details", func(t *testing.T) { - m := fakeManager(t) - - httpFuncs := []*binary.Func{ - {Name: "net/http.(*Transport).roundTrip"}, - {Name: "net/http.serverHandler.ServeHTTP"}, - } - - info := process.Info{ - ID: 1, - Functions: httpFuncs, - GoVersion: ver, - Modules: map[string]*semver.Version{}, - } - m.FilterUnusedProbes(&info) + m := fakeManager( + t, + "net/http.(*Transport).roundTrip", + "net/http.serverHandler.ServeHTTP", + ) assert.Len(t, m.probes, 2) }) t.Run("HTTP server and client dependent function only target details", func(t *testing.T) { - m := fakeManager(t) - - httpFuncs := []*binary.Func{ + m := fakeManager( + t, // writeSubset depends on "net/http.(*Transport).roundTrip", it should be ignored without roundTrip - {Name: "net/http.Header.writeSubset"}, - {Name: "net/http.serverHandler.ServeHTTP"}, - } - - info := process.Info{ - ID: 1, - Functions: httpFuncs, - GoVersion: ver, - Modules: map[string]*semver.Version{}, - } - m.FilterUnusedProbes(&info) + "net/http.Header.writeSubset", + "net/http.serverHandler.ServeHTTP", + ) assert.Len(t, m.probes, 1) }) } @@ -192,10 +152,9 @@ func TestDependencyChecks(t *testing.T) { }) } -func fakeManager(t *testing.T) *Manager { +func fakeManager(t *testing.T, fnNames ...string) *Manager { logger := slog.Default() - m, err := NewManager( - logger, nil, NewNoopConfigProvider(nil), + probes := []probe.Probe{ grpcClient.New(logger, ""), grpcServer.New(logger, ""), httpServer.New(logger, ""), @@ -205,9 +164,27 @@ func fakeManager(t *testing.T) *Manager { kafkaConsumer.New(logger, ""), autosdk.New(logger), otelTraceGlobal.New(logger), - ) - assert.NoError(t, err) - assert.NotNil(t, m) + } + ver := semver.New(1, 20, 0, "", "") + var fn []*binary.Func + for _, name := range fnNames { + fn = append(fn, &binary.Func{Name: name}) + } + m := &Manager{ + logger: slog.Default(), + cp: NewNoopConfigProvider(nil), + probes: make(map[probe.ID]probe.Probe), + proc: &process.Info{ + ID: 1, + Functions: fn, + GoVersion: ver, + Modules: map[string]*semver.Version{}, + }, + } + for _, p := range probes { + m.probes[p.Manifest().ID] = p + } + m.filterUnusedProbes() return m } @@ -264,6 +241,7 @@ func TestRunStoppingByContext(t *testing.T) { logger: slog.Default(), probes: map[probe.ID]probe.Probe{{}: p}, cp: NewNoopConfigProvider(nil), + proc: new(process.Info), } mockExeAndBpffs(t) @@ -271,7 +249,7 @@ func TestRunStoppingByContext(t *testing.T) { ctx, stopCtx := context.WithCancel(context.Background()) errCh := make(chan error, 1) - err = m.Load(ctx, &process.Info{ID: 1000}) + err = m.Load(ctx) require.NoError(t, err) go func() { errCh <- m.Run(ctx) }() @@ -313,6 +291,7 @@ func TestRunStoppingByStop(t *testing.T) { logger: slog.Default(), probes: map[probe.ID]probe.Probe{{}: &p}, cp: NewNoopConfigProvider(nil), + proc: new(process.Info), } mockExeAndBpffs(t) @@ -320,7 +299,7 @@ func TestRunStoppingByStop(t *testing.T) { ctx := context.Background() errCh := make(chan error, 1) - err = m.Load(ctx, &process.Info{ID: 1000}) + err = m.Load(ctx) require.NoError(t, err) time.AfterFunc(100*time.Millisecond, func() { @@ -445,12 +424,13 @@ func TestConfigProvider(t *testing.T) { netHTTPClientLibID: {TracesEnabled: &falseVal}, }, }), + proc: new(process.Info), } mockExeAndBpffs(t) runCtx, cancel := context.WithCancel(context.Background()) - err := m.Load(runCtx, &process.Info{ID: 1000}) + err := m.Load(runCtx) require.NoError(t, err) runErr := make(chan error, 1) @@ -577,6 +557,7 @@ func TestRunStopDeadlock(t *testing.T) { logger: slog.Default(), probes: map[probe.ID]probe.Probe{{}: p}, cp: NewNoopConfigProvider(nil), + proc: new(process.Info), } mockExeAndBpffs(t) @@ -584,7 +565,7 @@ func TestRunStopDeadlock(t *testing.T) { ctx, stopCtx := context.WithCancel(context.Background()) errCh := make(chan error, 1) - err = m.Load(ctx, &process.Info{ID: 1000}) + err = m.Load(ctx) require.NoError(t, err) go func() { errCh <- m.Run(ctx) }() @@ -625,6 +606,7 @@ func TestStopBeforeLoad(t *testing.T) { logger: slog.Default(), probes: map[probe.ID]probe.Probe{{}: &p}, cp: NewNoopConfigProvider(nil), + proc: new(process.Info), } mockExeAndBpffs(t) @@ -645,11 +627,12 @@ func TestStopBeforeRun(t *testing.T) { logger: slog.Default(), probes: map[probe.ID]probe.Probe{{}: &p}, cp: NewNoopConfigProvider(nil), + proc: new(process.Info), } mockExeAndBpffs(t) - err = m.Load(context.Background(), &process.Info{ID: 1000}) + err = m.Load(context.Background()) require.NoError(t, err) require.True(t, p.loaded.Load()) diff --git a/internal/pkg/opentelemetry/controller_test.go b/internal/pkg/opentelemetry/controller_test.go index bee6f7147..327d80cd2 100644 --- a/internal/pkg/opentelemetry/controller_test.go +++ b/internal/pkg/opentelemetry/controller_test.go @@ -305,7 +305,7 @@ func TestTrace(t *testing.T) { ctrl.Trace(tt.traces) tp.ForceFlush(context.Background()) spans := exporter.GetSpans() - assert.Equal(t, len(tt.expected), len(spans)) + assert.Len(t, spans, len(tt.expected)) // span contexts get modified by exporter, update expected with output for i, span := range spans { diff --git a/internal/pkg/process/analyze.go b/internal/pkg/process/analyze.go deleted file mode 100644 index 4a959b3e2..000000000 --- a/internal/pkg/process/analyze.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package process - -import ( - "debug/elf" - "errors" - "fmt" - - "github.com/Masterminds/semver/v3" - - "go.opentelemetry.io/auto/internal/pkg/process/binary" -) - -// Info are the details about a target process. -type Info struct { - ID ID - Functions []*binary.Func - GoVersion *semver.Version - Modules map[string]*semver.Version - Allocation *Allocation -} - -// GetFunctionOffset returns the offset for of the function with name. -func (i *Info) GetFunctionOffset(name string) (uint64, error) { - for _, f := range i.Functions { - if f.Name == name { - return f.Offset, nil - } - } - - return 0, fmt.Errorf("could not find offset for function %s", name) -} - -// GetFunctionReturns returns the return value of the call for the function -// with name. -func (i *Info) GetFunctionReturns(name string) ([]uint64, error) { - for _, f := range i.Functions { - if f.Name == name { - return f.ReturnOffsets, nil - } - } - - return nil, fmt.Errorf("could not find returns for function %s", name) -} - -// Analyze returns the target details for an actively running process. -func (a *Analyzer) Analyze(relevantFuncs map[string]interface{}) (*Info, error) { - result := &Info{ID: a.id} - - elfF, err := elf.Open(a.id.ExePath()) - if err != nil { - return nil, err - } - defer elfF.Close() - - bi, err := a.id.BuildInfo() - if err != nil { - return nil, err - } - - goVersion, err := semver.NewVersion(bi.GoVersion) - if err != nil { - return nil, err - } - result.GoVersion = goVersion - result.Modules = make(map[string]*semver.Version, len(bi.Deps)+1) - for _, dep := range bi.Deps { - depVersion, err := semver.NewVersion(dep.Version) - if err != nil { - a.logger.Error("parsing dependency version", "error", err, "dependency", dep) - continue - } - result.Modules[dep.Path] = depVersion - } - result.Modules["std"] = goVersion - - funcs, err := a.findFunctions(elfF, relevantFuncs) - if err != nil { - return nil, err - } - for _, fn := range funcs { - a.logger.Debug("found function", "function_name", fn) - } - - result.Functions = funcs - if len(result.Functions) == 0 { - return nil, errors.New("could not find function offsets for instrumenter") - } - - return result, nil -} - -func (a *Analyzer) findFunctions(elfF *elf.File, relevantFuncs map[string]interface{}) ([]*binary.Func, error) { - result, err := binary.FindFunctionsUnStripped(elfF, relevantFuncs) - if err != nil { - if errors.Is(err, elf.ErrNoSymbols) { - a.logger.Debug("No symbols found in binary, trying to find functions using .gosymtab") - return binary.FindFunctionsStripped(elfF, relevantFuncs) - } - return nil, err - } - - return result, nil -} diff --git a/internal/pkg/process/discover.go b/internal/pkg/process/discover.go deleted file mode 100644 index 3200f74c3..000000000 --- a/internal/pkg/process/discover.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package process - -import ( - "log/slog" -) - -// Analyzer is used to find actively running processes. -type Analyzer struct { - id ID - logger *slog.Logger -} - -// NewAnalyzer returns a new [ProcessAnalyzer]. -func NewAnalyzer(logger *slog.Logger, id ID) *Analyzer { - return &Analyzer{id: id, logger: logger} -} diff --git a/internal/pkg/process/info.go b/internal/pkg/process/info.go new file mode 100644 index 000000000..56c9ebbb4 --- /dev/null +++ b/internal/pkg/process/info.go @@ -0,0 +1,120 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package process + +import ( + "debug/elf" + "errors" + "fmt" + "runtime/debug" + + "github.com/Masterminds/semver/v3" + + "go.opentelemetry.io/auto/internal/pkg/process/binary" +) + +// Info are the details about a target process. +type Info struct { + ID ID + Functions []*binary.Func + GoVersion *semver.Version + Modules map[string]*semver.Version + Allocation *Allocation +} + +// NewInfo returns a new Info with information about the process identified by +// id. The functions of the returned Info are filtered by relevantFuncs. +// +// A partial Info and error may be returned for dependencies that cannot be +// parsed. +func NewInfo(id ID, relevantFuncs map[string]interface{}) (*Info, error) { + elfF, err := elf.Open(id.ExePath()) + if err != nil { + return nil, err + } + defer elfF.Close() + + bi, err := id.BuildInfo() + if err != nil { + return nil, err + } + + goVersion, err := semver.NewVersion(bi.GoVersion) + if err != nil { + return nil, err + } + + result := &Info{ + ID: id, + GoVersion: goVersion, + } + + result.Functions, err = findFunctions(elfF, relevantFuncs) + if err != nil { + return nil, err + } + + result.Modules, err = findModules(goVersion, bi.Deps) + return result, err +} + +func findModules(goVer *semver.Version, deps []*debug.Module) (map[string]*semver.Version, error) { + var err error + out := make(map[string]*semver.Version, len(deps)+1) + for _, dep := range deps { + depVersion, e := semver.NewVersion(dep.Version) + if e != nil { + err = errors.Join( + err, + fmt.Errorf("invalid dependency version %s (%s): %w", dep.Path, dep.Version, e), + ) + continue + } + out[dep.Path] = depVersion + } + out["std"] = goVer + return out, err +} + +func findFunctions(elfF *elf.File, relevantFuncs map[string]interface{}) ([]*binary.Func, error) { + found, err := binary.FindFunctionsUnStripped(elfF, relevantFuncs) + if err != nil { + if !errors.Is(err, elf.ErrNoSymbols) { + return nil, err + } + found, err = binary.FindFunctionsStripped(elfF, relevantFuncs) + if err != nil { + return nil, err + } + } + + if len(found) == 0 { + return nil, errors.New("no functions found") + } + + return found, nil +} + +// GetFunctionOffset returns the offset for of the function with name. +func (i *Info) GetFunctionOffset(name string) (uint64, error) { + for _, f := range i.Functions { + if f.Name == name { + return f.Offset, nil + } + } + + return 0, fmt.Errorf("could not find offset for function %s", name) +} + +// GetFunctionReturns returns the return value of the call for the function +// with name. +func (i *Info) GetFunctionReturns(name string) ([]uint64, error) { + for _, f := range i.Functions { + if f.Name == name { + return f.ReturnOffsets, nil + } + } + + return nil, fmt.Errorf("could not find returns for function %s", name) +} diff --git a/internal/test/e2e/autosdk/Dockerfile b/internal/test/e2e/autosdk/Dockerfile index 7b3adb54f..73498d4f5 100644 --- a/internal/test/e2e/autosdk/Dockerfile +++ b/internal/test/e2e/autosdk/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # Make sure this dir exists. WORKDIR /usr/src/go.opentelemetry.io/auto/internal/test/e2e/autosdk diff --git a/internal/test/e2e/databasesql/Dockerfile b/internal/test/e2e/databasesql/Dockerfile index 0c2b87ba4..5bb33bf4e 100644 --- a/internal/test/e2e/databasesql/Dockerfile +++ b/internal/test/e2e/databasesql/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/gin/Dockerfile b/internal/test/e2e/gin/Dockerfile index 6d4ce2c9f..3d12e217b 100644 --- a/internal/test/e2e/gin/Dockerfile +++ b/internal/test/e2e/gin/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/gin/go.mod b/internal/test/e2e/gin/go.mod index 92895db15..18a002829 100644 --- a/internal/test/e2e/gin/go.mod +++ b/internal/test/e2e/gin/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require github.com/gin-gonic/gin v1.10.0 require ( - github.com/bytedance/sonic v1.12.10 // indirect - github.com/bytedance/sonic/loader v0.2.3 // indirect + github.com/bytedance/sonic v1.13.1 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect github.com/cloudwego/base64x v0.1.5 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gin-contrib/sse v1.0.0 // indirect diff --git a/internal/test/e2e/gin/go.sum b/internal/test/e2e/gin/go.sum index b25524857..f1b23c626 100644 --- a/internal/test/e2e/gin/go.sum +++ b/internal/test/e2e/gin/go.sum @@ -1,8 +1,8 @@ -github.com/bytedance/sonic v1.12.10 h1:uVCQr6oS5669E9ZVW0HyksTLfNS7Q/9hV6IVS4nEMsI= -github.com/bytedance/sonic v1.12.10/go.mod h1:uVvFidNmlt9+wa31S1urfwwthTWteBgG0hWuoKAXTx8= +github.com/bytedance/sonic v1.13.1 h1:Jyd5CIvdFnkOWuKXr+wm4Nyk2h0yAFsr8ucJgEasO3g= +github.com/bytedance/sonic v1.13.1/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/bytedance/sonic/loader v0.2.3 h1:yctD0Q3v2NOGfSWPLPvG2ggA2kV6TS6s4wioyEqssH0= -github.com/bytedance/sonic/loader v0.2.3/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= diff --git a/internal/test/e2e/grpc/Dockerfile b/internal/test/e2e/grpc/Dockerfile index 90b72b81a..f979db968 100644 --- a/internal/test/e2e/grpc/Dockerfile +++ b/internal/test/e2e/grpc/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/grpc/go.mod b/internal/test/e2e/grpc/go.mod index 7ab27af1d..29c8ad7e2 100644 --- a/internal/test/e2e/grpc/go.mod +++ b/internal/test/e2e/grpc/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( go.opentelemetry.io/otel v1.35.0 google.golang.org/grpc v1.71.0 - google.golang.org/grpc/examples v0.0.0-20250305181404-8c080da92c4b + google.golang.org/grpc/examples v0.0.0-20250313062406-775150f68c17 ) require ( @@ -17,7 +17,7 @@ require ( golang.org/x/net v0.37.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf // indirect google.golang.org/protobuf v1.36.5 // indirect ) diff --git a/internal/test/e2e/grpc/go.sum b/internal/test/e2e/grpc/go.sum index 755e0c034..12e76e397 100644 --- a/internal/test/e2e/grpc/go.sum +++ b/internal/test/e2e/grpc/go.sum @@ -31,12 +31,12 @@ golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf h1:dHDlF3CWxQkefK9IJx+O8ldY0gLygvrlYRBNbPqDWuY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/grpc/examples v0.0.0-20250305181404-8c080da92c4b h1:lGeZKqXtSofY106YT2zHyumJOikXrCtF7KVh2RdAmBk= -google.golang.org/grpc/examples v0.0.0-20250305181404-8c080da92c4b/go.mod h1:FAlqAXO1RibHnEmPJVE0uEPry64CkJtJikaCETqUfKM= +google.golang.org/grpc/examples v0.0.0-20250313062406-775150f68c17 h1:0e3BNfSs+Wo4m5F4dy0EFSG6qX/lp5oecAnuLRAhqPk= +google.golang.org/grpc/examples v0.0.0-20250313062406-775150f68c17/go.mod h1:FAlqAXO1RibHnEmPJVE0uEPry64CkJtJikaCETqUfKM= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/test/e2e/kafka-go/Dockerfile b/internal/test/e2e/kafka-go/Dockerfile index 01db5c78d..fa99b1e40 100644 --- a/internal/test/e2e/kafka-go/Dockerfile +++ b/internal/test/e2e/kafka-go/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 AS builder +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 AS builder # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/nethttp/Dockerfile b/internal/test/e2e/nethttp/Dockerfile index 1110f29f3..162c4eb83 100644 --- a/internal/test/e2e/nethttp/Dockerfile +++ b/internal/test/e2e/nethttp/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/nethttp_custom/Dockerfile b/internal/test/e2e/nethttp_custom/Dockerfile index 5f02500ea..0b026fb03 100644 --- a/internal/test/e2e/nethttp_custom/Dockerfile +++ b/internal/test/e2e/nethttp_custom/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/test/e2e/otelglobal/Dockerfile b/internal/test/e2e/otelglobal/Dockerfile index ff2ad688a..553b4cbde 100644 --- a/internal/test/e2e/otelglobal/Dockerfile +++ b/internal/test/e2e/otelglobal/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.24.1@sha256:c5adecdb7b3f8c5ca3c88648a861882849cc8b02fed68ece31e25de88ad13418 +FROM golang:1.24.1@sha256:8678013a2add364dc3d5df2acc2b36893fbbd60ebafa5d5149bc22158512f021 # pre-copy/cache go.mod for pre-downloading dependencies and only redownloading # them in subsequent builds if they change diff --git a/internal/tools/go.mod b/internal/tools/go.mod index 8aefdc3eb..0cf25543c 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/Masterminds/semver/v3 v3.3.1 github.com/docker/docker v28.0.1+incompatible - github.com/golangci/golangci-lint v1.64.6 + github.com/golangci/golangci-lint v1.64.7 github.com/google/go-licenses/v2 v2.0.0-alpha.1 go.opentelemetry.io/auto v0.21.0 go.opentelemetry.io/build-tools/crosslink v0.20.0 @@ -20,15 +20,15 @@ require ( dario.cat/mergo v1.0.1 // indirect github.com/4meepo/tagalign v1.4.2 // indirect github.com/Abirdcfly/dupword v0.1.3 // indirect - github.com/Antonboom/errname v1.0.0 // indirect + github.com/Antonboom/errname v1.1.0 // indirect github.com/Antonboom/nilnil v1.0.1 // indirect - github.com/Antonboom/testifylint v1.5.2 // indirect + github.com/Antonboom/testifylint v1.6.0 // indirect github.com/BurntSushi/toml v1.4.1-0.20241028111116-b7406c026f5a // indirect github.com/Crocmagnon/fatcontext v0.7.1 // indirect github.com/Djarvur/go-err113 v0.1.0 // indirect github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect github.com/alexkohler/nakedret/v2 v2.0.5 // indirect @@ -41,11 +41,11 @@ require ( github.com/bkielbasa/cyclop v1.2.3 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bombsimon/wsl/v4 v4.6.0 // indirect - github.com/breml/bidichk v0.3.2 // indirect - github.com/breml/errchkjson v0.4.0 // indirect + github.com/breml/bidichk v0.3.3 // indirect + github.com/breml/errchkjson v0.4.1 // indirect github.com/butuzov/ireturn v0.3.1 // indirect github.com/butuzov/mirror v1.3.0 // indirect - github.com/catenacyber/perfsprint v0.9.0 // indirect + github.com/catenacyber/perfsprint v0.9.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.2 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.10 // indirect @@ -70,7 +70,7 @@ require ( github.com/firefart/nonamedreturns v1.0.5 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.9 // indirect + github.com/ghostiam/protogetter v0.3.10 // indirect github.com/go-critic/go-critic v0.12.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect @@ -90,7 +90,7 @@ require ( github.com/gofrs/flock v0.12.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect - github.com/golangci/dupl v0.0.0-20250303184901-44c6a0ba7e6c // indirect + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect github.com/golangci/go-printf-func-name v0.1.0 // indirect github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect github.com/golangci/misspell v0.6.0 // indirect @@ -219,7 +219,7 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/build-tools v0.20.0 // indirect go.opentelemetry.io/collector/pdata v1.27.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect @@ -228,14 +228,14 @@ require ( go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.15.0 // indirect golang.org/x/crypto v0.36.0 // indirect - golang.org/x/exp v0.0.0-20250228200357-dead58393ab7 // indirect + golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/exp/typeparams v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/mod v0.24.0 // indirect golang.org/x/net v0.37.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect golang.org/x/tools v0.31.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf // indirect google.golang.org/grpc v1.71.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -243,7 +243,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.2 // indirect - honnef.co/go/tools v0.6.0 // indirect + honnef.co/go/tools v0.6.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect mvdan.cc/gofumpt v0.7.0 // indirect mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect diff --git a/internal/tools/go.sum b/internal/tools/go.sum index 7e4e90329..ef5e212f2 100644 --- a/internal/tools/go.sum +++ b/internal/tools/go.sum @@ -9,12 +9,12 @@ github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI= github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= -github.com/Antonboom/errname v1.0.0 h1:oJOOWR07vS1kRusl6YRSlat7HFnb3mSfMl6sDMRoTBA= -github.com/Antonboom/errname v1.0.0/go.mod h1:gMOBFzK/vrTiXN9Oh+HFs+e6Ndl0eTFbtsRTSRdXyGI= +github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE= +github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw= github.com/Antonboom/nilnil v1.0.1 h1:C3Tkm0KUxgfO4Duk3PM+ztPncTFlOf0b2qadmS0s4xs= github.com/Antonboom/nilnil v1.0.1/go.mod h1:CH7pW2JsRNFgEh8B2UaPZTEPhCMuFowP/e8Udp9Nnb0= -github.com/Antonboom/testifylint v1.5.2 h1:4s3Xhuv5AvdIgbd8wOOEeo0uZG7PbDKQyKY5lGoQazk= -github.com/Antonboom/testifylint v1.5.2/go.mod h1:vxy8VJ0bc6NavlYqjZfmp6EfqXMtBgQ4+mhCojwC1P8= +github.com/Antonboom/testifylint v1.6.0 h1:6rdILVPt4+rqcvhid8w9wJNynKLUgqHNpFyM67UeXyc= +github.com/Antonboom/testifylint v1.6.0/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -31,8 +31,8 @@ github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lpr github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= -github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= @@ -65,16 +65,16 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bombsimon/wsl/v4 v4.6.0 h1:ew2R/N42su553DKTYqt3HSxaQN+uHQPv4xZ2MBmwaW4= github.com/bombsimon/wsl/v4 v4.6.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= -github.com/breml/bidichk v0.3.2 h1:xV4flJ9V5xWTqxL+/PMFF6dtJPvZLPsyixAoPe8BGJs= -github.com/breml/bidichk v0.3.2/go.mod h1:VzFLBxuYtT23z5+iVkamXO386OB+/sVwZOpIj6zXGos= -github.com/breml/errchkjson v0.4.0 h1:gftf6uWZMtIa/Is3XJgibewBm2ksAQSY/kABDNFTAdk= -github.com/breml/errchkjson v0.4.0/go.mod h1:AuBOSTHyLSaaAFlWsRSuRBIroCh3eh7ZHh5YeelDIk8= +github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= +github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= +github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= +github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= github.com/butuzov/ireturn v0.3.1 h1:mFgbEI6m+9W8oP/oDdfA34dLisRFCj2G6o/yiI1yZrY= github.com/butuzov/ireturn v0.3.1/go.mod h1:ZfRp+E7eJLC0NQmk1Nrm1LOrn/gQlOykv+cVPdiXH5M= github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= -github.com/catenacyber/perfsprint v0.9.0 h1:IZj13sFjPdHcahlpOqcF5yLm2l4VBV2FttMo2H+wwWw= -github.com/catenacyber/perfsprint v0.9.0/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= +github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0= +github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -143,8 +143,8 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/ github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghostiam/protogetter v0.3.9 h1:j+zlLLWzqLay22Cz/aYwTHKQ88GE2DQ6GkWSYFOI4lQ= -github.com/ghostiam/protogetter v0.3.9/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= +github.com/ghostiam/protogetter v0.3.10 h1:Zi944grvhejqK0rEQloLZPH5HDDoREFQlL+mSNP0jV0= +github.com/ghostiam/protogetter v0.3.10/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-critic/go-critic v0.12.0 h1:iLosHZuye812wnkEz1Xu3aBwn5ocCPfc9yqmFG9pa6w= @@ -211,14 +211,14 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golangci/dupl v0.0.0-20250303184901-44c6a0ba7e6c h1:BhAyQ4fBxnBDr0LwgEPVETkquPQW4BW6DiNBQq6CO5E= -github.com/golangci/dupl v0.0.0-20250303184901-44c6a0ba7e6c/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint v1.64.6 h1:jOLaQN41IV7bMzXuNC4UnQGll7N1xY6eFDXkXEPGKAs= -github.com/golangci/golangci-lint v1.64.6/go.mod h1:Wz9q+6EVuqGQ94GQ96RB2mjpcZYTOGhBhbt4O7REPu4= +github.com/golangci/golangci-lint v1.64.7 h1:Xk1EyxoXqZabn5b4vnjNKSjCx1whBK53NP+mzLfX7HA= +github.com/golangci/golangci-lint v1.64.7/go.mod h1:5cEsUQBSr6zi8XI8OjmcY2Xmliqc4iYL7YoPrL+zLJ4= github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= @@ -566,8 +566,8 @@ go.opentelemetry.io/build-tools/multimod v0.20.0 h1:FETwv1AoxFIfRpblTNiBwxtGgE6l go.opentelemetry.io/build-tools/multimod v0.20.0/go.mod h1:lfXozgnnd6PRqZCCr3qvWW+clvy13XwaPGS8UrW5eIU= go.opentelemetry.io/collector/pdata v1.27.0 h1:66yI7FYkUDia74h48Fd2/KG2Vk8DxZnGw54wRXykCEU= go.opentelemetry.io/collector/pdata v1.27.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= @@ -604,8 +604,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250228200357-dead58393ab7 h1:aWwlzYV971S4BXRS9AmqwDLAD85ouC6X+pocatKY58c= -golang.org/x/exp v0.0.0-20250228200357-dead58393ab7/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20250305212735-054e65f0b394 h1:VI4qDpTkfFaCXEPrbojidLgVQhj2x4nzTccG0hjaLlU= @@ -748,10 +748,10 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/api v0.0.0-20250311190419-81fb87f6b8bf h1:BdIVRm+fyDUn8lrZLPSlBCfM/YKDwUBYgDoLv9+DYo0= +google.golang.org/genproto/googleapis/api v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf h1:dHDlF3CWxQkefK9IJx+O8ldY0gLygvrlYRBNbPqDWuY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -789,8 +789,8 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.6.0 h1:TAODvD3knlq75WCp2nyGJtT4LeRV/o7NN9nYPeVJXf8= -honnef.co/go/tools v0.6.0/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= +honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= +honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= diff --git a/sdk/internal/telemetry/test/go.mod b/sdk/internal/telemetry/test/go.mod index 2b1b71bd2..825e75797 100644 --- a/sdk/internal/telemetry/test/go.mod +++ b/sdk/internal/telemetry/test/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/net v0.37.0 // indirect golang.org/x/sys v0.31.0 // indirect golang.org/x/text v0.23.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf // indirect google.golang.org/grpc v1.71.0 // indirect google.golang.org/protobuf v1.36.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/sdk/internal/telemetry/test/go.sum b/sdk/internal/telemetry/test/go.sum index ea4a80a1b..7d3b87dc1 100644 --- a/sdk/internal/telemetry/test/go.sum +++ b/sdk/internal/telemetry/test/go.sum @@ -85,8 +85,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf h1:dHDlF3CWxQkefK9IJx+O8ldY0gLygvrlYRBNbPqDWuY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250311190419-81fb87f6b8bf/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= diff --git a/sdk/span_test.go b/sdk/span_test.go index d24f8f341..0ab4fe1e0 100644 --- a/sdk/span_test.go +++ b/sdk/span_test.go @@ -391,7 +391,7 @@ func TestSpanAddLinkLimit(t *testing.T) { func TestSpanLinkAttrLimit(t *testing.T) { nInt := len(tAttrs) - require.GreaterOrEqual(t, len(tAttrs), 0) + require.GreaterOrEqual(t, nInt, 0) n := uint32(nInt) // nolint: gosec // Bound checked. tests := []struct { @@ -523,7 +523,7 @@ func TestAddEventLimit(t *testing.T) { func TestAddEventAttrLimit(t *testing.T) { nInt := len(tAttrs) - require.GreaterOrEqual(t, len(tAttrs), 0) + require.GreaterOrEqual(t, nInt, 0) n := uint32(nInt) // nolint: gosec // Bound checked. tests := []struct { @@ -612,7 +612,7 @@ func TestSpanSetAttributes(t *testing.T) { func TestSpanAttributeLimits(t *testing.T) { nInt := len(tAttrs) - require.GreaterOrEqual(t, len(tAttrs), 0) + require.GreaterOrEqual(t, nInt, 0) n := uint32(nInt) // nolint: gosec // Bound checked. tests := []struct { diff --git a/sdk/tracer.go b/sdk/tracer.go index 131b3ac83..d147e4121 100644 --- a/sdk/tracer.go +++ b/sdk/tracer.go @@ -23,14 +23,15 @@ type tracer struct { var _ trace.Tracer = tracer{} func (t tracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { - var psc trace.SpanContext + var psc, sc trace.SpanContext sampled := true span := new(span) // Ask eBPF for sampling decision and span context info. - t.start(ctx, span, &psc, &sampled, &span.spanContext) + t.start(ctx, span, &psc, &sampled, &sc) span.sampled.Store(sampled) + span.spanContext = sc ctx = trace.ContextWithSpan(ctx, span)