From 5ee3801e175d0b0d5e5ed199492698414a251803 Mon Sep 17 00:00:00 2001 From: Emmanuel Gautier Date: Mon, 19 Oct 2026 00:23:20 +0200 Subject: [PATCH 1/2] feat: report CLI usage analytics to Argvio instead of OpenTelemetry --- cmd/root.go | 40 +++++++++++++--------------------------- cmd/scan.go | 14 +------------- go.mod | 8 ++++++-- go.sum | 12 ++++++++++-- 4 files changed, 30 insertions(+), 44 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 95aca99..c8d0ff2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -10,10 +10,14 @@ import ( "github.com/spf13/cobra" ) +// argvioAPIKey is proxyaudit's public_ingest-scoped Argvio API key, selecting the +// "proxyaudit" tenant its usage analytics land in. It only allows sending usage +// data, so it is safe to embed. +const argvioAPIKey = "argv_live_pub_RNd_Ho771fi4xeSS04er89Xkbs3JOPIp" //nolint:gosec // ingest-only key, not a secret + var ( - sqaOptOut bool - otelShutdown func(context.Context) error - toolVersion string + sqaOptOut bool + toolVersion string ) var name = "proxyaudit" @@ -27,17 +31,6 @@ func NewRootCmd(projectVersion, commit, date string) (cmd *cobra.Command) { Long: `proxyaudit dynamically tests whether a reverse proxy or API gateway is securely configured: TLS/transport, HTTP security headers, client-IP/header trust boundaries, and information disclosure via exposed management interfaces.`, SilenceErrors: true, SilenceUsage: true, - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if !sqaOptOut { - otelShutdown, _ = telemetryx.New(cmd.Context(), name, projectVersion, telemetryx.WithCommit(commit), telemetryx.WithBuildDate(date)) - } - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - if otelShutdown != nil { - _ = otelShutdown(cmd.Context()) - otelShutdown = nil - } - }, } rootCmd.AddCommand(NewScanCmd()) @@ -51,18 +44,11 @@ func NewRootCmd(projectVersion, commit, date string) (cmd *cobra.Command) { // This is called by main.main(). It only needs to happen once to the RootCmd. func Execute(projectVersion, commit, date string) { c := NewRootCmd(projectVersion, commit, date) - defer func() { - if otelShutdown != nil { - _ = otelShutdown(context.Background()) - otelShutdown = nil - } - }() + argvioShutdown := telemetryx.Instrument(c, projectVersion, argvioAPIKey) + defer func() { _ = argvioShutdown(context.Background()) }() - if err := c.Execute(); err != nil { - if otelShutdown != nil { - _ = otelShutdown(context.Background()) - otelShutdown = nil - } + if err := telemetryx.Execute(c); err != nil { + _ = argvioShutdown(context.Background()) // errFindingsPresent (scan.go) carries no message — the report // was already written to every configured sink by the time it's @@ -73,8 +59,8 @@ func Execute(projectVersion, commit, date string) { var runtimeErr *RuntimeError if errors.As(err, &runtimeErr) { - os.Exit(2) //nolint:gocritic // otelShutdown was already run explicitly above, not relying on the deferred call + os.Exit(2) //nolint:gocritic // argvioShutdown was already run explicitly above, not relying on the deferred call } - os.Exit(1) //nolint:gocritic // otelShutdown was already run explicitly above, not relying on the deferred call + os.Exit(1) //nolint:gocritic // argvioShutdown was already run explicitly above, not relying on the deferred call } } diff --git a/cmd/scan.go b/cmd/scan.go index d6c2fcc..2907bbf 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -4,19 +4,14 @@ import ( "fmt" "github.com/cerberauth/harnessx" - "github.com/cerberauth/harnessx/reporters" "github.com/cerberauth/proxyaudit/proxy" "github.com/cerberauth/proxyaudit/proxy/probebase" "github.com/cerberauth/proxyaudit/proxy/scanctx" cobrareportx "github.com/cerberauth/x/cobrax/reportx" "github.com/cerberauth/x/reportx/harnessreport" - "github.com/cerberauth/x/telemetryx" "github.com/spf13/cobra" - "go.opentelemetry.io/otel" ) -const scanOtelName = "github.com/cerberauth/proxyaudit/cmd/scan" - var engineNames = map[string]scanctx.ProxyEngine{ "": scanctx.EngineUnknown, "nginx": scanctx.EngineNginx, @@ -57,13 +52,6 @@ Use only against systems you own or have explicit written permission to test.`, ctx := cmd.Context() - otelReporter, _ := reporters.NewOTelReporter( - ctx, - otel.Tracer(scanOtelName), - telemetryx.GetMeterProvider().Meter(scanOtelName), - reporters.WithPrefix("proxyaudit.scan"), - ) - sinks, cleanup, err := cobrareportx.SinksFromFlags(cmd) if err != nil { return err @@ -88,7 +76,7 @@ Use only against systems you own or have explicit written permission to test.`, hxEngine := harnessx.New( harnessx.WithChecks(checks...), - harnessx.WithReporters(otelReporter, reportxReporter), + harnessx.WithReporters(reportxReporter), ) scanTarget := scanctx.NewTarget(target, &scanctx.ScanContext{ diff --git a/go.mod b/go.mod index bb287cc..05c76ec 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,9 @@ go 1.27.0 require ( github.com/cerberauth/cache-detective v0.0.0-20260917215736-01100a70209b github.com/cerberauth/harnessx v0.4.0 - github.com/cerberauth/x v0.0.0-20260901215913-9d7750841dbb + github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 - go.opentelemetry.io/otel v1.46.0 ) require ( @@ -16,6 +15,7 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cerberauth/reportx v0.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/getargvio/argvio-go v0.4.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect @@ -23,9 +23,13 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/pflag v1.0.10 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel v1.46.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0 // indirect go.opentelemetry.io/otel/log v0.22.0 // indirect go.opentelemetry.io/otel/metric v1.46.0 // indirect diff --git a/go.sum b/go.sum index f181168..543460b 100644 --- a/go.sum +++ b/go.sum @@ -8,11 +8,13 @@ github.com/cerberauth/harnessx v0.4.0 h1:N9eIQYFv8Zda9r2CjJ5lM14GgCgF1ioeE/GE97Y github.com/cerberauth/harnessx v0.4.0/go.mod h1:CPUs+OKTAUgG9ZRcgSufRoRzjQ2oPLWZcFmck6pGDDs= github.com/cerberauth/reportx v0.3.0 h1:/6zrKrCUiMy1ZkF3sAit0Xk8mSiAf11on9NlHbtXKxc= github.com/cerberauth/reportx v0.3.0/go.mod h1:w51Q19ZWF7OJdDmBoSwBVf2DfdcE8t883fEsKwcd0+o= -github.com/cerberauth/x v0.0.0-20260901215913-9d7750841dbb h1:p8scU5jV+4nyq6CXRPHnCaB22d9DeyaFmubXeNGT47o= -github.com/cerberauth/x v0.0.0-20260901215913-9d7750841dbb/go.mod h1:hPDTiSdQhIKtCxxNnE1KnNKY2nn9FfsmLz5VfcYCcyo= +github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650 h1:7bCMA5CoPya8mPjzp2CNP5VUelKQWHfkSbdYBNfBUjg= +github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650/go.mod h1:/OAwnHHuGPqZeL46RU+JCfuIi+QTIabQuUWHBZpmgwk= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/getargvio/argvio-go v0.4.0 h1:dc/ZrYYrYZSKYas9PFQi+3PE3lT5oQtzIVRyi8+ldLw= +github.com/getargvio/argvio-go v0.4.0/go.mod h1:nKNZakA4qNhrl/UKNZCo10qZwQIxv4+UQxYCdlGIbMQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -46,12 +48,18 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0 h1:Bu39F5tzJct+f2IZbB8989fwyTps3c8e7EsUQsz+vs8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0/go.mod h1:dJUwod88EsFgYCqrDHaSPzhiY9pBUpt0d85/qSfua7k= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0 h1:lYk7RmxdLK865qLwibroNGldHa1U7SWKYYvNjlK7PIo= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0/go.mod h1:6GvlND0H0xdUJanOtIAn0xfwLkauh1tmsYEEVSMDdqY= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0 h1:qkDYCAFiZXLcs1L4aY+tP2wguQ4kURANqHOQMA2et2s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0/go.mod h1:tkipS4DRzmpAmvg+Gw4++O1IdDq6TVDnvnYU6cmbQVs= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0 h1:AP23h/mFgb/lc7tdck1Kfn9qxsM8TAeNPCU5C3pzaps= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0/go.mod h1:K4EqCe1b4kGk5WR690ntg9LaBfsPoV32FwthbyoptuA= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 h1:OFnwLJr+pF3iHrlGSzbxyuo6/6HyBlnlN1CWEJmBVcw= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0/go.mod h1:716wFneO0ov19A2beH5hjfh9AK5z/VWNAtDijp1Y0/g= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 h1:w53CDeOA/Kurp7yRsegSr6pbbr759dOvJ+yNmWM6Hxs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0/go.mod h1:BOmGMCbAtvcJiSJ+hLuhgPLdDbimnraSl8irz3iY8sY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0 h1:KrC1YrQeSt46ITMWAbgQx1M1eV1/1TKzttrBzymPmss= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0/go.mod h1:zDSEzoEqsOrgBeGvH66KRgxh90VonFyJqBHA0Pk3+rM= go.opentelemetry.io/otel/log v0.22.0 h1:5DBNnfvaJ6CVdkJ+Jle8Tzs50aSSv49TXGj9XRsEYw0= From 7519a258c18a7ef087d98f9b7d4e164b94452269 Mon Sep 17 00:00:00 2001 From: Emmanuel Gautier Date: Tue, 3 Nov 2026 00:30:30 +0100 Subject: [PATCH 2/2] feat: scan outcome and engine metrics with argvio.metrics.yaml catalog Co-Authored-By: Claude Opus 5.5 --- .github/workflows/argvio-metrics.yml | 23 ++++++ README.md | 4 + argvio.metrics.yaml | 55 +++++++++++++ cmd/scan.go | 10 ++- go.mod | 53 +++++++------ go.sum | 114 ++++++++++++++------------- 6 files changed, 176 insertions(+), 83 deletions(-) create mode 100644 .github/workflows/argvio-metrics.yml create mode 100644 argvio.metrics.yaml diff --git a/.github/workflows/argvio-metrics.yml b/.github/workflows/argvio-metrics.yml new file mode 100644 index 0000000..babc3b0 --- /dev/null +++ b/.github/workflows/argvio-metrics.yml @@ -0,0 +1,23 @@ +name: Argvio metrics + +# Validates argvio.metrics.yaml on pull requests and syncs it to Argvio on +# release, so the Product dashboard knows what each metric means. +on: + pull_request: + paths: + - argvio.metrics.yaml + - .github/workflows/argvio-metrics.yml + release: + types: [published] + workflow_dispatch: + +permissions: + contents: read + +jobs: + argvio-metrics: + uses: cerberauth/ci/.github/workflows/argvio-metrics.yml@main + with: + sync: ${{ github.event_name != 'pull_request' }} + secrets: + ARGVIO_METRICS_ADMIN_KEY: ${{ secrets.ARGVIO_METRICS_ADMIN_KEY }} diff --git a/README.md b/README.md index 42d600f..7b71531 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,10 @@ Full documentation, including installation options, the CLI reference, the checks reference, and CI/Docker guides, is at [cerberauth.com/docs/proxyaudit](https://www.cerberauth.com/docs/proxyaudit). +## Telemetry + +The CLI collects anonymous usage data to help improve the tool: which command ran, the names (never the values) of the flags used, how the command exited and how long it took, the CLI version, OS and architecture, and basic resource usage, how often a command was mistyped (never what you typed), whether it crashed (never the crash message), plus a few counts that never contain your input: the `--engine` hint given, the outcome of each check (passed, vulnerable, skipped or error, with the check's name and severity) and how many findings each scan reports by severity. Interactive runs also include a random install and session identifier, the shell and terminal emulator you run it in (from a fixed list) and whether its output is piped; runs in CI are fully anonymous. Targets, responses and evidence are never collected. You can opt out of telemetry by passing the `--sqa-opt-out` flag, or by setting `DO_NOT_TRACK=1` (or `ARGVIO_DISABLED=1`). + ## Contributing Issues and pull requests are welcome. Run the test suite with: diff --git a/argvio.metrics.yaml b/argvio.metrics.yaml new file mode 100644 index 0000000..ce8a562 --- /dev/null +++ b/argvio.metrics.yaml @@ -0,0 +1,55 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/getargvio/argvio/main/schema/metrics/v1.schema.json +# +# proxyaudit's product metrics, as shown on the Argvio Product dashboard. +# Synced to Argvio on release (.github/workflows/argvio-metrics.yml); see +# https://github.com/getargvio/argvio/blob/main/docs/metric-catalog.md. +# Every dimension value is a fixed identifier chosen in code. +version: 1 +service: proxyaudit +metrics: + - name: scan.engine + kind: counter + title: Scans by proxy engine + description: Scans by the --engine hint given; unknown when none was. + dims: [engine] + dim_order: + engine: [nginx, traefik, envoy, caddy, haproxy, unknown] + # Scan outcome, sent by x/telemetryx/scanmetrics. + - name: scan.checks + kind: counter + title: Check results + description: Every check run in a scan, by outcome. Error means the check could not be evaluated. + dims: [status] + dim_order: + status: [vulnerable, passed, skipped, error] + - name: scan.vulnerable + kind: counter + title: Vulnerable checks + description: Checks that reported at least one finding, by check and by the check's severity (from its CVSS score). + dims: [check, severity] + dim_order: + severity: [critical, high, medium, low, info] + - name: scan.findings + kind: value + title: Findings per scan + description: Findings reported by one scan, by severity, zeros included, so the share of scans that find something is meaningful. + dims: [severity] + dim_order: + severity: [critical, high, medium, low, info] + - name: scan.vulnerable-rate + kind: ratio + title: Share of checks finding something + description: Vulnerable check results over all check results that ran to completion or were skipped. + unit: "%" + scale: 100 + numerator: { metric: scan.checks, where: { status: vulnerable } } + denominator: { metric: scan.checks } + - name: scan.error-rate + kind: ratio + title: Share of checks in error + description: Check results that could not be evaluated (network errors, unexpected responses), over all check results. + unit: "%" + scale: 100 + direction: down_is_good + numerator: { metric: scan.checks, where: { status: error } } + denominator: { metric: scan.checks } diff --git a/cmd/scan.go b/cmd/scan.go index 2907bbf..26b0ce4 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -9,6 +9,8 @@ import ( "github.com/cerberauth/proxyaudit/proxy/scanctx" cobrareportx "github.com/cerberauth/x/cobrax/reportx" "github.com/cerberauth/x/reportx/harnessreport" + "github.com/cerberauth/x/telemetryx" + "github.com/cerberauth/x/telemetryx/scanmetrics" "github.com/spf13/cobra" ) @@ -21,6 +23,10 @@ var engineNames = map[string]scanctx.ProxyEngine{ "haproxy": scanctx.EngineHAProxy, } +// engineCounter counts scans by the --engine hint, "unknown" without one +// (argvio.metrics.yaml). Values come from engineNames only. +var engineCounter = telemetryx.NewCounter("scan.engine", "engine") + func NewScanCmd() *cobra.Command { var ( aggressive bool @@ -74,10 +80,12 @@ Use only against systems you own or have explicit written permission to test.`, ShowAllFindings: showAllFindings, }) + metricsReporter := scanmetrics.New(ctx, scanmetrics.Config{CheckDefs: defs}) hxEngine := harnessx.New( harnessx.WithChecks(checks...), - harnessx.WithReporters(reportxReporter), + harnessx.WithReporters(reportxReporter, metricsReporter), ) + engineCounter.Add(ctx, 1, string(engine)) scanTarget := scanctx.NewTarget(target, &scanctx.ScanContext{ Engine: engine, diff --git a/go.mod b/go.mod index 05c76ec..34974dc 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.27.0 require ( github.com/cerberauth/cache-detective v0.0.0-20260917215736-01100a70209b - github.com/cerberauth/harnessx v0.4.0 - github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650 + github.com/cerberauth/harnessx v0.5.0 + github.com/cerberauth/x v0.0.0-20261102231323-2cfb133eb4f2 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.12.1 ) @@ -13,38 +13,39 @@ require ( require ( github.com/BurntSushi/toml v1.6.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect - github.com/cerberauth/reportx v0.3.0 // indirect + github.com/cerberauth/reportx v0.4.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/getargvio/argvio-go v0.4.0 // indirect + github.com/getargvio/argvio-go v0.5.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.33.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/pflag v1.0.10 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/otel v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0 // indirect - go.opentelemetry.io/otel/log v0.22.0 // indirect - go.opentelemetry.io/otel/metric v1.46.0 // indirect - go.opentelemetry.io/otel/sdk v1.46.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.22.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.46.0 // indirect - go.opentelemetry.io/otel/trace v1.46.0 // indirect - go.opentelemetry.io/proto/otlp v1.11.0 // indirect + go.opentelemetry.io/otel v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.47.0 // indirect + go.opentelemetry.io/otel/log v1.47.0 // indirect + go.opentelemetry.io/otel/metric v1.47.0 // indirect + go.opentelemetry.io/otel/sdk v1.47.0 // indirect + go.opentelemetry.io/otel/sdk/log v1.47.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.47.0 // indirect + go.opentelemetry.io/otel/trace v1.47.0 // indirect + go.opentelemetry.io/proto/otlp v1.11.1 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect - golang.org/x/net v0.59.0 // indirect - golang.org/x/sys v0.48.0 // indirect - golang.org/x/text v0.42.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd // indirect - google.golang.org/grpc v1.83.2 // indirect + golang.org/x/net v0.62.0 // indirect + golang.org/x/sys v0.49.0 // indirect + golang.org/x/text v0.43.0 // indirect + golang.org/x/time v0.16.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20261026165753-2ffab32bce7e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20261026165753-2ffab32bce7e // indirect + google.golang.org/grpc v1.85.0 // indirect google.golang.org/protobuf v1.36.12 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 543460b..b24e069 100644 --- a/go.sum +++ b/go.sum @@ -4,17 +4,17 @@ github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1x github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cerberauth/cache-detective v0.0.0-20260917215736-01100a70209b h1:evf721Qco2kjtyjr+zRu2pLi5ow0tKZLPI5oALfyOqY= github.com/cerberauth/cache-detective v0.0.0-20260917215736-01100a70209b/go.mod h1:+neXN/38V+OxGAAWUBHFDntaFxa9M49f9bjaOmHaOAY= -github.com/cerberauth/harnessx v0.4.0 h1:N9eIQYFv8Zda9r2CjJ5lM14GgCgF1ioeE/GE97YCPc0= -github.com/cerberauth/harnessx v0.4.0/go.mod h1:CPUs+OKTAUgG9ZRcgSufRoRzjQ2oPLWZcFmck6pGDDs= -github.com/cerberauth/reportx v0.3.0 h1:/6zrKrCUiMy1ZkF3sAit0Xk8mSiAf11on9NlHbtXKxc= -github.com/cerberauth/reportx v0.3.0/go.mod h1:w51Q19ZWF7OJdDmBoSwBVf2DfdcE8t883fEsKwcd0+o= -github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650 h1:7bCMA5CoPya8mPjzp2CNP5VUelKQWHfkSbdYBNfBUjg= -github.com/cerberauth/x v0.0.0-20261101102642-fc4305224650/go.mod h1:/OAwnHHuGPqZeL46RU+JCfuIi+QTIabQuUWHBZpmgwk= +github.com/cerberauth/harnessx v0.5.0 h1:9XTxMkyLAnMQBkrxB4ZZ9O4Zbf/3u6FYI3TzzVIDvSw= +github.com/cerberauth/harnessx v0.5.0/go.mod h1:uXaZUv/Ic5PMsxHb2KzMFaTQjWTDftF5r0yYS6Ha22U= +github.com/cerberauth/reportx v0.4.0 h1:Nb+NsC2dvFEj4mUBEVN9jkD9i7++CMpMTqxYBmBbr/I= +github.com/cerberauth/reportx v0.4.0/go.mod h1:w51Q19ZWF7OJdDmBoSwBVf2DfdcE8t883fEsKwcd0+o= +github.com/cerberauth/x v0.0.0-20261102231323-2cfb133eb4f2 h1:dmpgaPmAB4E4zpcGmvnpxHWxNaHngh6qBCDaVaLDfJo= +github.com/cerberauth/x v0.0.0-20261102231323-2cfb133eb4f2/go.mod h1:EBPWmGLfPC9zb0zyrsRWXlgO9Jq2YvbeCcgzmHYEvYw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/getargvio/argvio-go v0.4.0 h1:dc/ZrYYrYZSKYas9PFQi+3PE3lT5oQtzIVRyi8+ldLw= -github.com/getargvio/argvio-go v0.4.0/go.mod h1:nKNZakA4qNhrl/UKNZCo10qZwQIxv4+UQxYCdlGIbMQ= +github.com/getargvio/argvio-go v0.5.0 h1:azwn8cRJvVOTwjyac2QhCNMixfTa+usxx76xQzZF6PM= +github.com/getargvio/argvio-go v0.5.0/go.mod h1:nKNZakA4qNhrl/UKNZCo10qZwQIxv4+UQxYCdlGIbMQ= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -26,8 +26,8 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.33.0 h1:5T5Ns3kMpWr+z3s5ZA0e7ljVyWNVNxK76sHPAxi5D1k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.33.0/go.mod h1:oWNYw09cH8wl8fFgC5hKlBLxR4XfKy2KQpP8MJjeCcc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -46,59 +46,61 @@ github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWD github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= -go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0 h1:Bu39F5tzJct+f2IZbB8989fwyTps3c8e7EsUQsz+vs8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0/go.mod h1:dJUwod88EsFgYCqrDHaSPzhiY9pBUpt0d85/qSfua7k= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0 h1:lYk7RmxdLK865qLwibroNGldHa1U7SWKYYvNjlK7PIo= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.22.0/go.mod h1:6GvlND0H0xdUJanOtIAn0xfwLkauh1tmsYEEVSMDdqY= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0 h1:qkDYCAFiZXLcs1L4aY+tP2wguQ4kURANqHOQMA2et2s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.46.0/go.mod h1:tkipS4DRzmpAmvg+Gw4++O1IdDq6TVDnvnYU6cmbQVs= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0 h1:AP23h/mFgb/lc7tdck1Kfn9qxsM8TAeNPCU5C3pzaps= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.46.0/go.mod h1:K4EqCe1b4kGk5WR690ntg9LaBfsPoV32FwthbyoptuA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0 h1:OFnwLJr+pF3iHrlGSzbxyuo6/6HyBlnlN1CWEJmBVcw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.46.0/go.mod h1:716wFneO0ov19A2beH5hjfh9AK5z/VWNAtDijp1Y0/g= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0 h1:w53CDeOA/Kurp7yRsegSr6pbbr759dOvJ+yNmWM6Hxs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.46.0/go.mod h1:BOmGMCbAtvcJiSJ+hLuhgPLdDbimnraSl8irz3iY8sY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0 h1:KrC1YrQeSt46ITMWAbgQx1M1eV1/1TKzttrBzymPmss= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.46.0/go.mod h1:zDSEzoEqsOrgBeGvH66KRgxh90VonFyJqBHA0Pk3+rM= -go.opentelemetry.io/otel/log v0.22.0 h1:5DBNnfvaJ6CVdkJ+Jle8Tzs50aSSv49TXGj9XRsEYw0= -go.opentelemetry.io/otel/log v0.22.0/go.mod h1:gzOt/R67vF2GniAqWu8Qv0SXy89f71muHcrkz76PCdc= -go.opentelemetry.io/otel/metric v1.46.0 h1:yBnkXvgV7AXFILZc5K6IZe/CBFF3OS7BJ8ov6/lj0K8= -go.opentelemetry.io/otel/metric v1.46.0/go.mod h1:iPmdWqifKUdzziPkvvzIJXITl56fQx2mGM/DHLB3/2o= -go.opentelemetry.io/otel/metric/x v0.68.0 h1:TA/cBT23D3MnxYPwHL7YFOdYGdx0A0v+s7Mzotpd1dU= -go.opentelemetry.io/otel/metric/x v0.68.0/go.mod h1:agudOmvWhwUTjgibWDzxD2PoWYnpw5Ht5jISYOD2Hd4= -go.opentelemetry.io/otel/sdk v1.46.0 h1:h5CNQQjEbuQXY/JfZtgt3i7HVFV3aHPO2OAwO2eTYPI= -go.opentelemetry.io/otel/sdk v1.46.0/go.mod h1:GAERFXFt5SYCEB+YiKUbMBeza6UaDH7GmGOZEfh2gSM= -go.opentelemetry.io/otel/sdk/log v0.22.0 h1:PRL+s6P63XT4E/bheEflopPUpVxuvANqZwtt89yhoGk= -go.opentelemetry.io/otel/sdk/log v0.22.0/go.mod h1:JNp0sBELrjCTcu5W3GzABVypeU6vDJjBS+X0JISuz+g= -go.opentelemetry.io/otel/sdk/log/logtest v0.22.0 h1:infPnfNrhCNgOUZRs3gWUg8vhoBUHihq02gwK05gzlg= -go.opentelemetry.io/otel/sdk/log/logtest v0.22.0/go.mod h1:gkQZA3z15Bv3KU9vigBTi8dFechSozRP7v94X4VZv+s= -go.opentelemetry.io/otel/sdk/metric v1.46.0 h1:0piZ26EG4RBfebb2jhDH6ERCYHoVWduc3kLgPCwSnSE= -go.opentelemetry.io/otel/sdk/metric v1.46.0/go.mod h1:I1PbKrdVc8Qu8HYVDNtqVIwLwjNrhsV/uFuxfwg8mO4= -go.opentelemetry.io/otel/trace v1.46.0 h1:OULy7ccdJnZtJ0UDYFOIGaCmiWzJ8Vi2G/Rsu60qs1c= -go.opentelemetry.io/otel/trace v1.46.0/go.mod h1:J7GAXweO77XSFkB/rmAqk9D6ihszhFjLU+d9WuUxDLI= -go.opentelemetry.io/proto/otlp v1.11.0 h1:5rrYs0Ykyj50sdU/JU0x8etU+LubXWb+gED6TbEdMIk= -go.opentelemetry.io/proto/otlp v1.11.0/go.mod h1:SmVizdCOAm3XBtG1g1NnOdhW6jtddT72hLMhv8VwA8E= +go.opentelemetry.io/otel v1.47.0 h1:j7ALJ/zgkS7Z6aeJW09p8VC9804bC+PpeTfCD4XPnOM= +go.opentelemetry.io/otel v1.47.0/go.mod h1:8wS9O2qfXrYrzp6hIF/HOYJJf/wIhFPhR2xLuP+iXQU= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.23.0 h1:5Ek4qQ5XX0PSQfY7lMW3CvcR36yy8YFDfGnYnaku8zE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.23.0/go.mod h1:NUKIMOKSexQdTmS1pSxOQBDiVes3DHRier2ePsGW/gQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.23.0 h1:5WVp40k2fJHuc5BtNTgKk+EugKFT8Eg3lywFfCPI/nE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.23.0/go.mod h1:59nH0RYCGHRlwt15WyioeSYINBbuObeBpTowPhEKWHY= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.47.0 h1:LaLVGJtIzHcvHjVs2OftmKcc+M9mdOqS8vZ1fBD1Yes= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.47.0/go.mod h1:vF6H5sNDuQBJWgSX00iZgbIqk2MZZoVMH0ar5t5bOpw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.47.0 h1:7kszRN4Ze5GeAkUnBjBSUIunVBMA+mZIG04auueqguM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.47.0/go.mod h1:CLzakYy8jOdkBfcveCWYkeKJxujcF4xPhh2Z7IfE98U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0 h1:julhjPeUH/q/7hinbSdDdqt5h7Zw9YWmRlWRhI0jd54= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.47.0/go.mod h1:Ao2mz688LH/tFf0yMAenidq6k2YNSx6SIY2q6jDACck= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0 h1:UFpxOpYPmMNUtOWhdb+nC1WELIgVf8z9higURrbzYU4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.47.0/go.mod h1:YBGjxe3lt0jtXoEXxGrGhv/jM7oUBUDVK7zhAvNyEjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.47.0 h1:aXZXsZ012wOgVkqaiQv+Z/d8V0xKjmg70F6m4CE94lc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.47.0/go.mod h1:ziu1gUIJhAaxM3EV1e3Ralk5AAyL1UOYz3lJJ4VSI38= +go.opentelemetry.io/otel/log v1.47.0 h1:cOTS1CcLbSQeZKanGJ+0JpF/+t4PELi3O3bbl2lqCcI= +go.opentelemetry.io/otel/log v1.47.0/go.mod h1:9byitSQ5pLC6PpqwGXjqdMKya6ZTswHRZh2vvXT33nw= +go.opentelemetry.io/otel/metric v1.47.0 h1:4PptaldXx3Eat1XjMZ68pPJEs5wrhlemctZE9a3UdWY= +go.opentelemetry.io/otel/metric v1.47.0/go.mod h1:ADGSXxRrXM6bjbvLo535EstVFlPpPYZm4LBKixjDHwU= +go.opentelemetry.io/otel/metric/x v0.69.0 h1:DjRLr15H83v+hCW7JA9NoJvOkYTtmq5YoDRbe9deYpM= +go.opentelemetry.io/otel/metric/x v0.69.0/go.mod h1:uVvsMPMFFyj/HUQfrUnH3JjnOQ1dwFDorgFLRBasM0k= +go.opentelemetry.io/otel/sdk v1.47.0 h1:zWXEr4j2lFefG87TU6Yg8a7ngfohIKFZHKp0Hf5hC6I= +go.opentelemetry.io/otel/sdk v1.47.0/go.mod h1:VUc24kiOeoGsxG8G9ULx3fWKvB7jMhnGE8Oi607lgR0= +go.opentelemetry.io/otel/sdk/log v1.47.0 h1:W4N/ZfgpkRRnmARnqYoQ6BrWA0mrj8IzVDNLlpmUJZY= +go.opentelemetry.io/otel/sdk/log v1.47.0/go.mod h1:Wu74Z2EmOKXi2FleSNAb0Hyau2G+r5kubSEMJw5aAMs= +go.opentelemetry.io/otel/sdk/log/logtest v0.23.0 h1:j3pm42QCrKYYLLkI6OrV1QHFkUfDA6/4EP+Y1PzggLg= +go.opentelemetry.io/otel/sdk/log/logtest v0.23.0/go.mod h1:zt0gEnuTZgDvqvczHwYswz93eqMaIr6upTTsdV/HUlU= +go.opentelemetry.io/otel/sdk/metric v1.47.0 h1:lfISg2j93VT6yqdk9OfUaZmw/GfcZqCCV3jdXtsPnKw= +go.opentelemetry.io/otel/sdk/metric v1.47.0/go.mod h1:ypLp+mW1Nt2x+Szt3b5/i1syodyts49lMOwxpDI3VGw= +go.opentelemetry.io/otel/trace v1.47.0 h1:JOjX/Oci8K94QHddo+bbfya/Ai/nf6/dt9ZfrFNWSrM= +go.opentelemetry.io/otel/trace v1.47.0/go.mod h1:jNaSLa2PZEYFG6fRjJABAu+bw4FS08uDmPg28lTghu0= +go.opentelemetry.io/proto/otlp v1.11.1 h1:SCrPqH9NE5CmBrOqpjNCiT0X5mGwMyGERXdogfR7Yjw= +go.opentelemetry.io/proto/otlp v1.11.1/go.mod h1:wq8W4aSf6bOy8RZyESOeQFr9Pu7wydWX/TY4sgvrTPg= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= -golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= -golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= -golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= -golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= -golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= -golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/net v0.62.0 h1:18ELalfM5+XNRwzM2nYqXsZQ9ByS1uhj2O/U7+5jqRY= +golang.org/x/net v0.62.0/go.mod h1:WgDCOTH8iwtB66T4/GfI94AHo/hhdb7Hah9NDseQfiI= +golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= +golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= +golang.org/x/text v0.43.0 h1:1QivrlhwAsnMOcqgOdl9my7s9OyZl8O5/UGUTJVXoWc= +golang.org/x/text v0.43.0/go.mod h1:hbSIYA/amXcRXTFSZqh8tWHEoqRvvbKPJ2uz/KU+a+s= +golang.org/x/time v0.16.0 h1:vMb6ptszcQMkcwiRTAuNNU50gom6++Q/6gY2hDM6VDE= +golang.org/x/time v0.16.0/go.mod h1:rVKOqvZeKvrDKTQiAHJ7wmwP0RzleSphoEA9RcdLA0s= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd h1:jgCQeWccunvocKNK2RjhQHNiSjSeMMuBpQ/5pbP+2lA= -google.golang.org/genproto/googleapis/api v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:r4KD2hOq82JBWpTWkJ9NZLf6EwmRvAPIFmk7hPNtd+0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd h1:29LZPNIJg+GEmJwZXruJJRwqy/wnWAYZXDtROToV/aQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260911204522-f61a6ca850bd/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= -google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= -google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= +google.golang.org/genproto/googleapis/api v0.0.0-20261026165753-2ffab32bce7e h1:e789sLZjeTdc02ZCQGTSzHOu0fR73+dwPQVKUp67Z88= +google.golang.org/genproto/googleapis/api v0.0.0-20261026165753-2ffab32bce7e/go.mod h1:vHV3wJM9WZyfV7GyB+OQGq5dWVrFwCDxapPK4WlRD88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261026165753-2ffab32bce7e h1:w3fy/G8OrJHYexn+u5y7hFyc8YRRIr7DCevtIOwAcGY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20261026165753-2ffab32bce7e/go.mod h1:OaIUM3+LpYcK2GXM4FTmhWoIq371Owdr+Cc7/BsYHHc= +google.golang.org/grpc v1.85.0 h1:BPBCfuVRQ1qvBhKDOq9uvQllMvO59rKsYhXpp7Dd8vw= +google.golang.org/grpc v1.85.0/go.mod h1:0rQrOD58yjal/0EaVbGBANindixsCZNQPDV3VKtaKuQ= google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=