From 8ad6ed02ae47b90340f1a7b3f9d8fa40bc27f52f Mon Sep 17 00:00:00 2001 From: Mahad Zaryab <43658574+mahadzaryab1@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:12:13 -0400 Subject: [PATCH] Support Tail Based Sampling Processor From OTEL Collector Extension (#5878) ## Which problem is this PR solving? - Closes #5867 ## Description of the changes - Added the [tail-based sampling processor extension](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/README.md) from otel to jaeger - Added a `docker compose` to demonstrate usage of the tail-based sampling processor extension in jaeger. - Added an end to end integration test to test that the new processor works as expected - Added a README to the `docker compose` setup describing the setup and usage of the new processor ## How was this change tested? - An end to end integration test was added and is run from the CI ## Checklist - [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [x] I have signed all commits - [x] I have added unit tests for the new functionality - [x] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: Mahad Zaryab Signed-off-by: Yuri Shkuro Co-authored-by: Yuri Shkuro Co-authored-by: Yuri Shkuro --- .../ci-e2e-tailsampling-processor.yml | 41 ++++++++ Makefile | 4 + .../config-tail-sampling-always-sample.yaml | 38 ++++++++ ...fig-tail-sampling-service-name-policy.yaml | 46 +++++++++ cmd/jaeger/internal/components.go | 2 + .../internal/integration/tailsampling_test.go | 95 +++++++++++++++++++ docker-compose/tail-sampling/Makefile | 30 ++++++ docker-compose/tail-sampling/README.md | 37 ++++++++ .../tail-sampling/docker-compose.yml | 36 +++++++ .../tail-sampling/jaeger-v2-config.yml | 45 +++++++++ .../otel-collector-config-connector.yml | 27 ++++++ go.mod | 10 ++ go.sum | 26 +++++ 13 files changed, 437 insertions(+) create mode 100644 .github/workflows/ci-e2e-tailsampling-processor.yml create mode 100644 cmd/jaeger/config-tail-sampling-always-sample.yaml create mode 100644 cmd/jaeger/config-tail-sampling-service-name-policy.yaml create mode 100644 cmd/jaeger/internal/integration/tailsampling_test.go create mode 100644 docker-compose/tail-sampling/Makefile create mode 100644 docker-compose/tail-sampling/README.md create mode 100644 docker-compose/tail-sampling/docker-compose.yml create mode 100644 docker-compose/tail-sampling/jaeger-v2-config.yml create mode 100644 docker-compose/tail-sampling/otel-collector-config-connector.yml diff --git a/.github/workflows/ci-e2e-tailsampling-processor.yml b/.github/workflows/ci-e2e-tailsampling-processor.yml new file mode 100644 index 00000000000..8b0d6313f6d --- /dev/null +++ b/.github/workflows/ci-e2e-tailsampling-processor.yml @@ -0,0 +1,41 @@ +name: Test Tail Sampling Processor + +on: + push: + branches: [main] + + pull_request: + branches: [main] + +concurrency: + group: ${{ github.workflow }}-${{ (github.event.pull_request && github.event.pull_request.number) || github.ref || github.run_id }} + cancel-in-progress: true + +# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions +permissions: # added using https://github.com/step-security/secure-workflows + contents: read + +jobs: + tailsampling-processor: + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@0d381219ddf674d61a7572ddd19d7941e271515c # v2.9.0 + with: + egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs + + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version: 1.23.x + + - name: Run Tail Sampling Processor Integration Test + run: | + make tail-sampling-integration-test + + - name: Upload coverage to codecov + uses: ./.github/actions/upload-codecov + with: + files: cover.out + flags: tailsampling-processor diff --git a/Makefile b/Makefile index 6a6a65d0a03..f979fa3e4f0 100644 --- a/Makefile +++ b/Makefile @@ -160,6 +160,10 @@ index-cleaner-integration-test: docker-images-elastic index-rollover-integration-test: docker-images-elastic $(MAKE) storage-integration-test COVEROUT=cover-index-rollover.out +.PHONY: tail-sampling-integration-test +tail-sampling-integration-test: + SAMPLING=tail $(MAKE) jaeger-v2-storage-integration-test + .PHONY: cover cover: nocover bash -c "set -e; set -o pipefail; STORAGE=memory $(GOTEST) -timeout 5m -coverprofile $(COVEROUT) ./... | tee test-results.json" diff --git a/cmd/jaeger/config-tail-sampling-always-sample.yaml b/cmd/jaeger/config-tail-sampling-always-sample.yaml new file mode 100644 index 00000000000..648950fc4fc --- /dev/null +++ b/cmd/jaeger/config-tail-sampling-always-sample.yaml @@ -0,0 +1,38 @@ +service: + extensions: [jaeger_storage, jaeger_query, healthcheckv2] + pipelines: + traces: + receivers: [otlp] + processors: [tail_sampling] + exporters: [jaeger_storage_exporter] + telemetry: + logs: + level: DEBUG + +extensions: + healthcheckv2: + use_v2: true + http: + jaeger_query: + trace_storage: some_storage + jaeger_storage: + backends: + some_storage: + memory: + max_traces: 100000 + +receivers: + otlp: + protocols: + grpc: + http: + endpoint: "0.0.0.0:4318" + +processors: + tail_sampling: + decision_wait: 5s + policies: [{ name: test-policy-1, type: always_sample }] + +exporters: + jaeger_storage_exporter: + trace_storage: some_storage diff --git a/cmd/jaeger/config-tail-sampling-service-name-policy.yaml b/cmd/jaeger/config-tail-sampling-service-name-policy.yaml new file mode 100644 index 00000000000..fc4abff70af --- /dev/null +++ b/cmd/jaeger/config-tail-sampling-service-name-policy.yaml @@ -0,0 +1,46 @@ +service: + extensions: [jaeger_storage, jaeger_query, healthcheckv2] + pipelines: + traces: + receivers: [otlp] + processors: [tail_sampling] + exporters: [jaeger_storage_exporter] + telemetry: + logs: + level: DEBUG + +extensions: + healthcheckv2: + use_v2: true + http: + jaeger_query: + trace_storage: some_storage + jaeger_storage: + backends: + some_storage: + memory: + max_traces: 100000 + +receivers: + otlp: + protocols: + grpc: + http: + endpoint: "0.0.0.0:4318" + +processors: + tail_sampling: + decision_wait: 5s + policies: + [ + { + name: filter-by-attribute, + type: string_attribute, + string_attribute: + { key: service.name, values: [tracegen-00, tracegen-03] }, + }, + ] + +exporters: + jaeger_storage_exporter: + trace_storage: some_storage diff --git a/cmd/jaeger/internal/components.go b/cmd/jaeger/internal/components.go index 5f5bcd03150..69ab5ff0966 100644 --- a/cmd/jaeger/internal/components.go +++ b/cmd/jaeger/internal/components.go @@ -8,6 +8,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter" "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter" "github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension" + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver" "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver" @@ -104,6 +105,7 @@ func (b builders) build() (otelcol.Factories, error) { // standard batchprocessor.NewFactory(), memorylimiterprocessor.NewFactory(), + tailsamplingprocessor.NewFactory(), // add-ons adaptivesampling.NewFactory(), ) diff --git a/cmd/jaeger/internal/integration/tailsampling_test.go b/cmd/jaeger/internal/integration/tailsampling_test.go new file mode 100644 index 00000000000..6ce27cc649e --- /dev/null +++ b/cmd/jaeger/internal/integration/tailsampling_test.go @@ -0,0 +1,95 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package integration + +import ( + "context" + "os" + "os/exec" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/jaegertracing/jaeger/plugin/storage/integration" +) + +// TailSamplingIntegration contains the test components to perform an integration test +// for the Tail Sampling Processor. +type TailSamplingIntegration struct { + E2EStorageIntegration + + // expectedServices contains a list of services that should be sampled in the test case. + expectedServices []string +} + +// TestTailSamplingProcessor_EnforcesPolicies runs an A/B test to perform an integration test +// for the Tail Sampling Processor. +// - Test A uses a Jaeger config file with a tail sampling processor that has a policy for sampling +// all traces. In this test, we check that all services that are samples are stored. +// - Test B uses a Jaeger config file with a tail sampling processor that has a policy to sample +// traces using on the `service.name` attribute. In this test, we check that only the services +// listed as part of the policy in the config file are stored. +func TestTailSamplingProcessor_EnforcesPolicies(t *testing.T) { + if env := os.Getenv("SAMPLING"); env != "tail" { + t.Skipf("This test requires environment variable SAMPLING=tail") + } + + expectedServicesA := []string{"tracegen-00", "tracegen-01", "tracegen-02", "tracegen-03", "tracegen-04"} + tailSamplingA := &TailSamplingIntegration{ + E2EStorageIntegration: E2EStorageIntegration{ + ConfigFile: "../../config-tail-sampling-always-sample.yaml", + StorageIntegration: integration.StorageIntegration{ + CleanUp: purge, + }, + }, + expectedServices: expectedServicesA, + } + + expectedServicesB := []string{"tracegen-00", "tracegen-03"} + tailSamplingB := &TailSamplingIntegration{ + E2EStorageIntegration: E2EStorageIntegration{ + ConfigFile: "../../config-tail-sampling-service-name-policy.yaml", + StorageIntegration: integration.StorageIntegration{ + CleanUp: purge, + }, + }, + expectedServices: expectedServicesB, + } + + t.Run("sample_all", tailSamplingA.testTailSamplingProccessor) + t.Run("sample_some", tailSamplingB.testTailSamplingProccessor) +} + +// testTailSamplingProccessor performs the following steps: +// 1. Initialize the test case by starting the Jaeger V2 collector +// 2. Generate 5 traces using `tracegen` with one service per trace +// 3. Read the stored services from the memory store +// 4. Check that the sampled services match what is expected +func (ts *TailSamplingIntegration) testTailSamplingProccessor(t *testing.T) { + ts.e2eInitialize(t, "memory") + ts.generateTraces(t) + + var actual []string + assert.Eventually(t, func() bool { + var err error + actual, err = ts.SpanReader.GetServices(context.Background()) + require.NoError(t, err) + sort.Strings(actual) + return assert.ObjectsAreEqualValues(ts.expectedServices, actual) + }, 100*time.Second, 15*time.Second) + + t.Logf("Expected: %v", ts.expectedServices) + t.Logf("Actual : %v", actual) +} + +// generateTraces generates 5 traces using `tracegen` with one service per trace +func (*TailSamplingIntegration) generateTraces(t *testing.T) { + tracegenCmd := exec.Command("go", "run", "../../../../cmd/tracegen", "-traces", "5", "-services", "5") + out, err := tracegenCmd.CombinedOutput() + require.NoError(t, err) + t.Logf("tracegen completed: %s", out) +} diff --git a/docker-compose/tail-sampling/Makefile b/docker-compose/tail-sampling/Makefile new file mode 100644 index 00000000000..cef1f8b63d4 --- /dev/null +++ b/docker-compose/tail-sampling/Makefile @@ -0,0 +1,30 @@ +# Copyright (c) 2024 The Jaeger Authors. +# SPDX-License-Identifier: Apache-2.0 + +BINARY ?= jaeger + +.PHONY: build +build: clean-jaeger + cd ../../ && make build-$(BINARY) GOOS=linux + cd ../../ && make create-baseimg PLATFORMS=linux/$(shell go env GOARCH) + cd ../../ && docker buildx build --target release \ + --tag jaegertracing/$(BINARY):dev \ + --build-arg base_image=localhost:5000/baseimg_alpine:latest \ + --build-arg debug_image=not-used \ + --build-arg TARGETARCH=$(shell go env GOARCH) \ + --load \ + cmd/$(BINARY) + +.PHONY: dev +dev: export JAEGER_IMAGE_TAG = dev +dev: build + docker compose -f docker-compose.yml up $(DOCKER_COMPOSE_ARGS) + +.PHONY: clean-jaeger +clean-jaeger: + # Also cleans up intermediate cached containers. + docker system prune -f + +.PHONY: clean-all +clean-all: clean-jaeger + docker rmi -f otel/opentelemetry-collector-contrib:latest diff --git a/docker-compose/tail-sampling/README.md b/docker-compose/tail-sampling/README.md new file mode 100644 index 00000000000..66647e007cb --- /dev/null +++ b/docker-compose/tail-sampling/README.md @@ -0,0 +1,37 @@ +# Tail-Based Sampling Processor + +This `docker compose` environment provides a sample configuration of a Jaeger collector utilizing the +[Tail-Based Sampling Processor in OpenTelemtry](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/README.md). + +## Description of Setup + +The `docker-compose.yml` contains three services and their functions are outlined as follows: + +1. `jaeger` - This is the Jaeger V2 collector that samples traces using the `tail_sampling` processor. +The configuration for this service is in [jaeger-v2-config.yml](./jaeger-v2-config.yml). +The `tail_sampling` processor has one policy that only captures traces from the services `tracegen-02` and `tracegen-04`. +For a full list of policies that can be added to the `tail_sampling` processor, check out [this README](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/tailsamplingprocessor/README.md). +2. `otel_collector` - This is an OpenTelemtry collector with a `loadbalancing` exporter that routes requests to `jaeger`. +The configuration for this service is in [otel-collector-config-connector.yml](./otel-collector-config-connector.yml). +The purpose of this collector is to collect spans from different services and forward all spans with the same `traceID` +to the same downstream collector instance (`jaeger` in this case), so that sampling decisions for a given trace can be +made in the same collector instance. +3. `tracegen` - This is a service that generates traces for 5 different services and sends them to `otel_collector` +(which will in turn send them to `jaeger`). + +Note that in this minimal setup, a `loadbalancer` collector is not necessary since we are only running a +single instance of the `jaeger` collector. In a real-world distributed system running multiple instances +of the `jaeger` collector, a load balancer is necessary to avoid spans from the same trace being routed +to different collector instances. + +## Running the Example + +The example can be run using the following command: + +```bash +make dev +``` + +To see the tail-based sampling processor in action, go to the Jaeger UI at . +You will see that only traces for the services outlined in the policy in [jaeger-v2-config.yml](./jaeger-v2-config.yml) +are sampled. diff --git a/docker-compose/tail-sampling/docker-compose.yml b/docker-compose/tail-sampling/docker-compose.yml new file mode 100644 index 00000000000..c066271048e --- /dev/null +++ b/docker-compose/tail-sampling/docker-compose.yml @@ -0,0 +1,36 @@ +services: + jaeger: + networks: + backend: + image: jaegertracing/jaeger:${JAEGER_IMAGE_TAG:-latest} + volumes: + - "./jaeger-v2-config.yml:/etc/jaeger/config.yml" + command: ["--config", "/etc/jaeger/config.yml"] + ports: + - "16686:16686" + - "4317" + + otel_collector: + networks: + backend: + image: otel/opentelemetry-collector-contrib:${OTEL_IMAGE_TAG:-0.108.0} + volumes: + - ${OTEL_CONFIG_SRC:-./otel-collector-config-connector.yml}:/etc/otelcol/otel-collector-config.yml + command: --config /etc/otelcol/otel-collector-config.yml + depends_on: + - jaeger + ports: + - "4318" + + tracegen: + networks: + - backend + image: jaegertracing/jaeger-tracegen:latest + environment: + - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://otel_collector:4318/v1/traces + command: ["-workers", "3", "-pause", "250ms", "-services", "5", "-duration", "10s"] + depends_on: + - jaeger + +networks: + backend: \ No newline at end of file diff --git a/docker-compose/tail-sampling/jaeger-v2-config.yml b/docker-compose/tail-sampling/jaeger-v2-config.yml new file mode 100644 index 00000000000..545ecf4ea8b --- /dev/null +++ b/docker-compose/tail-sampling/jaeger-v2-config.yml @@ -0,0 +1,45 @@ +service: + extensions: [jaeger_storage, jaeger_query, healthcheckv2] + pipelines: + traces: + receivers: [otlp] + processors: [tail_sampling] + exporters: [jaeger_storage_exporter] + telemetry: + logs: + level: DEBUG + +extensions: + healthcheckv2: + use_v2: true + http: + jaeger_query: + trace_storage: some_storage + jaeger_storage: + backends: + some_storage: + memory: + max_traces: 100000 + +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + +processors: + tail_sampling: + decision_wait: 5s + policies: + [ + { + name: filter-by-attribute, + type: string_attribute, + string_attribute: + { key: service.name, values: [tracegen-02, tracegen-04] }, + }, + ] + +exporters: + jaeger_storage_exporter: + trace_storage: some_storage diff --git a/docker-compose/tail-sampling/otel-collector-config-connector.yml b/docker-compose/tail-sampling/otel-collector-config-connector.yml new file mode 100644 index 00000000000..c6f502f6176 --- /dev/null +++ b/docker-compose/tail-sampling/otel-collector-config-connector.yml @@ -0,0 +1,27 @@ +receivers: + otlp: + protocols: + http: + endpoint: 0.0.0.0:4318 + +exporters: + loadbalancing: + routing_key: "traceID" + protocol: + otlp: + timeout: 1s + tls: + insecure: true + resolver: + static: + hostnames: + - jaeger:4317 + +service: + pipelines: + traces: + receivers: + - otlp + processors: [] + exporters: + - loadbalancing \ No newline at end of file diff --git a/go.mod b/go.mod index fe27ee31e38..d9f165b149f 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.108.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.108.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.108.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.108.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.108.0 @@ -97,6 +98,7 @@ require ( require ( github.com/IBM/sarama v1.43.3 // indirect + github.com/alecthomas/participle/v2 v2.1.1 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -109,11 +111,13 @@ require ( github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elastic/elastic-transport-go/v8 v8.6.0 // indirect + github.com/elastic/go-grok v0.3.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -128,6 +132,7 @@ require ( github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect @@ -145,6 +150,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect + github.com/magefile/mage v1.15.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -157,8 +163,10 @@ require ( github.com/onsi/ginkgo v1.16.5 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.108.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.108.0 // indirect @@ -189,6 +197,7 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -231,6 +240,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.33.0 diff --git a/go.sum b/go.sum index 8a407c30830..4104c5fff1f 100644 --- a/go.sum +++ b/go.sum @@ -35,6 +35,12 @@ github.com/Shopify/sarama v1.33.0/go.mod h1:lYO7LwEBkE0iAeTl94UfPSrDaavFzSFlmn+5 github.com/Shopify/toxiproxy/v2 v2.3.0 h1:62YkpiP4bzdhKMH+6uC5E95y608k3zDwdzuBMsnn3uQ= github.com/Shopify/toxiproxy/v2 v2.3.0/go.mod h1:KvQTtB6RjCJY4zqNJn7C7JDFgsG5uoHYDirfUfpIm0c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= +github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= @@ -104,6 +110,8 @@ github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHo github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= github.com/elastic/go-elasticsearch/v8 v8.15.0 h1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk= github.com/elastic/go-elasticsearch/v8 v8.15.0/go.mod h1:HCON3zj4btpqs2N1jjsAy4a/fiAul+YBP00mBH4xik8= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -155,6 +163,8 @@ github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpG github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= @@ -256,6 +266,7 @@ github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/C github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -268,7 +279,11 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -332,6 +347,8 @@ github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkks github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -391,10 +408,14 @@ github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108 github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.108.0/go.mod h1:osDf+vagg+N6yH5HBZNnDxCMA0oiMg/C3wVckFe/QHo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0 h1:+VLLHBSbtEiLMtSi8ESWM4PPDs/H6XKf0RHWWIX8RjE= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.108.0/go.mod h1:L4KHT5M01zjg0wYmNSX2VArC088vccVa7p4XBrcb48g= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0 h1:DGQwT+PdalEB/LYiE36r/XnFTaU3h+z8cR2LfS3qxm0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.108.0/go.mod h1:pPQV7fCCb3HOo70YMUnnhN3d+0toR23W+eqvOQckpuM= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.108.0 h1:ZABQPbay+ilVHJbbmpuHmtIJBFCbGfMNdkAP7zNXb04= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.108.0/go.mod h1:CQyrhcehFnuGRSYQtqrLT1V9mstkN66SSIEDzHuIcLA= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0 h1:7EKRVuc8GRrAfde2/fh+CFMsJQAQGICg686sRyIk3QI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.108.0/go.mod h1:+ghcpLt2BBbqOm+vv6CeSXK/aLHB4cXiLdsfFNZXeqg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0 h1:WUV7wEVjjEgp8TRcQquQj/2NfRY84Vch43+zG/Pizqk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.108.0/go.mod h1:9mkPZ5pz6HktjWtUdqRmqAsP7VzP/gpIwQ8z/h2YXAU= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0 h1:so+V3rT18oyHJmPs5lBNBLlU8tnHU9h/tkA3Q7q8m7c= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.108.0/go.mod h1:G+N43ID1sP2CnffxkYdMyuJpep2UcGQUyq4HiAmcYSw= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.108.0 h1:vU6a7EKHBu80err/1SCn+8fLpSCdR1PoSzdyydXDcjQ= @@ -409,6 +430,8 @@ github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometh github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.108.0/go.mod h1:hbXv4Zf/FGHDDulPI+eSXNo9VkWviGHxRRgVZf63Dqs= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.108.0 h1:R7dGiMWCxV/qzDegCw9N1uYVP5KKqScAYQgDBJB5Hx0= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.108.0/go.mod h1:hANmkb4pq1DUGtK4PL/Y+8jbc01rSlP4HIq21seXBZk= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0 h1:hGLJKP2YbxQSzRLNHGhvRso4nYn5rxsbg9MS0d9VO1w= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.108.0/go.mod h1:sfGeGw2Bl5rP4Lh0pxccoD5/mMC7EOjnYkP1Wk3jNIY= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0 h1:yXWSvQQ/UU9bmF44OrIXIgOLKjpHuA6zHiFAkaHTroQ= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.108.0/go.mod h1:TvAeOMNJIZCJurJJuJoICrX6FS4B8bJWW01+Z9ctxnc= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.108.0 h1:/ZwEutAtHbC5299UTzYxvhkIKviTSOxEy+unIDUOs7o= @@ -524,6 +547,8 @@ github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFA github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6 h1:SIKIoA4e/5Y9ZOl0DCe3eVMLPOQzJxgZpfdHHeauNTM= +github.com/ua-parser/uap-go v0.0.0-20240611065828-3a4781585db6/go.mod h1:BUbeWZiieNxAuuADTBNb3/aeje6on3DhU3rpWsQSB1E= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= @@ -866,6 +891,7 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=