From 380150948de8ca1bb16c634083fde83a39fb8f09 Mon Sep 17 00:00:00 2001 From: KevinSchneider Date: Tue, 6 Jun 2023 15:08:53 -0500 Subject: [PATCH 1/4] fix: change es version check to support elasticsearch 8+ Signed-off-by: KevinSchneider --- pkg/es/wrapper/wrapper.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/es/wrapper/wrapper.go b/pkg/es/wrapper/wrapper.go index 9df3a251857..47a31011f98 100644 --- a/pkg/es/wrapper/wrapper.go +++ b/pkg/es/wrapper/wrapper.go @@ -66,7 +66,7 @@ func (c ClientWrapper) Index() es.IndexService { // Search calls this function to internal client. func (c ClientWrapper) Search(indices ...string) es.SearchService { searchService := c.client.Search(indices...) - if c.esVersion == 7 { + if c.esVersion >= 7 { searchService = searchService.RestTotalHitsAsInt(true) } return WrapESSearchService(searchService) @@ -75,7 +75,7 @@ func (c ClientWrapper) Search(indices ...string) es.SearchService { // MultiSearch calls this function to internal client. func (c ClientWrapper) MultiSearch() es.MultiSearchService { multiSearchService := c.client.MultiSearch() - if c.esVersion == 7 { + if c.esVersion >= 7 { multiSearchService = multiSearchService.RestTotalHitsAsInt(true) } return WrapESMultiSearchService(multiSearchService) @@ -167,7 +167,7 @@ func (i IndexServiceWrapper) Index(index string) es.IndexService { // Type calls this function to internal service. func (i IndexServiceWrapper) Type(typ string) es.IndexService { - if i.esVersion == 7 { + if i.esVersion >= 7 { return WrapESIndexService(i.bulkIndexReq, i.bulkService, i.esVersion) } return WrapESIndexService(i.bulkIndexReq.Type(typ), i.bulkService, i.esVersion) From ff35d0006573c6511046518abb315caa3f3308d7 Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Sun, 11 Jun 2023 17:54:50 -0400 Subject: [PATCH 2/4] Add CI for v8 Signed-off-by: Yuri Shkuro --- .github/workflows/ci-elasticsearch.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci-elasticsearch.yml b/.github/workflows/ci-elasticsearch.yml index f7e3289f55a..3d4c14cc1d5 100644 --- a/.github/workflows/ci-elasticsearch.yml +++ b/.github/workflows/ci-elasticsearch.yml @@ -26,6 +26,9 @@ jobs: - major: 7.x image: 7.14.0 distribution: elasticsearch + - major: 8.x + image: 8.8.0 + distribution: elasticsearch name: ${{ matrix.version.distribution }} ${{ matrix.version.major }} steps: - name: Harden Runner From 8450cee85187ad2980663803a81424ce7e5e6ed5 Mon Sep 17 00:00:00 2001 From: KevinSchneider Date: Thu, 29 Jun 2023 12:13:28 -0500 Subject: [PATCH 3/4] merge main Signed-off-by: KevinSchneider --- .github/workflows/ci-all-in-one-build.yml | 4 +- .github/workflows/ci-build-binaries.yml | 2 +- .github/workflows/ci-cassandra.yml | 2 +- .github/workflows/ci-crossdock.yml | 4 +- .github/workflows/ci-docker-build.yml | 4 +- .github/workflows/ci-elasticsearch.yml | 4 +- .github/workflows/ci-grpc-badger.yml | 2 +- .github/workflows/ci-hotrod.yml | 4 +- .github/workflows/ci-kafka.yml | 2 +- .github/workflows/ci-opensearch.yml | 4 +- .github/workflows/ci-protogen-tests.yml | 2 +- .github/workflows/ci-release.yml | 6 +- .github/workflows/ci-unit-tests-go-tip.yml | 2 +- .github/workflows/ci-unit-tests.yml | 2 +- .github/workflows/codeql.yml | 8 +- .github/workflows/fossa.yml | 2 +- cmd/all-in-one/main.go | 4 +- cmd/collector/app/server/http_test.go | 32 ++----- cmd/query/app/grpc_handler.go | 10 +-- cmd/query/app/grpc_handler_test.go | 6 +- cmd/query/app/handler_options.go | 4 +- cmd/query/app/http_handler.go | 10 +-- cmd/query/app/http_handler_test.go | 4 +- cmd/query/app/server.go | 10 +-- cmd/query/app/server_test.go | 26 +++--- cmd/query/app/token_propagation_test.go | 4 +- cmd/query/main.go | 4 +- cmd/tracegen/main.go | 53 +++++++++--- examples/hotrod/pkg/tracing/init.go | 28 +++++-- examples/hotrod/services/driver/redis.go | 38 ++++----- examples/memstore-plugin/README.md | 6 ++ go.mod | 38 ++++----- go.sum | 85 ++++++++++--------- internal/tracegen/config.go | 35 ++++---- internal/tracegen/worker.go | 98 +++++++++++++--------- pkg/cassandra/config/config.go | 4 + pkg/jtracer/jtracer.go | 29 +++++++ pkg/jtracer/jtracer_test.go | 31 +++++++ pkg/kafka/auth/config.go | 1 + pkg/kafka/auth/kerberos.go | 16 ++-- pkg/kafka/auth/options.go | 36 ++++---- scripts/rebuild-ui.sh | 19 ++--- 42 files changed, 408 insertions(+), 277 deletions(-) create mode 100644 examples/memstore-plugin/README.md create mode 100644 pkg/jtracer/jtracer.go create mode 100644 pkg/jtracer/jtracer_test.go diff --git a/.github/workflows/ci-all-in-one-build.yml b/.github/workflows/ci-all-in-one-build.yml index 4a31e8bf0b2..70ad9e413f5 100644 --- a/.github/workflows/ci-all-in-one-build.yml +++ b/.github/workflows/ci-all-in-one-build.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -41,7 +41,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Build, test, and publish all-in-one image run: bash scripts/build-all-in-one-image.sh pr-only diff --git a/.github/workflows/ci-build-binaries.yml b/.github/workflows/ci-build-binaries.yml index 9264bfd5f89..02b3c95c36a 100644 --- a/.github/workflows/ci-build-binaries.yml +++ b/.github/workflows/ci-build-binaries.yml @@ -38,7 +38,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true diff --git a/.github/workflows/ci-cassandra.yml b/.github/workflows/ci-cassandra.yml index 99bdd0af665..b29198adbba 100644 --- a/.github/workflows/ci-cassandra.yml +++ b/.github/workflows/ci-cassandra.yml @@ -32,7 +32,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 with: diff --git a/.github/workflows/ci-crossdock.yml b/.github/workflows/ci-crossdock.yml index 0cb1c2a808f..26477ec040d 100644 --- a/.github/workflows/ci-crossdock.yml +++ b/.github/workflows/ci-crossdock.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -39,7 +39,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Build, test, and publish crossdock image run: bash scripts/build-crossdock.sh diff --git a/.github/workflows/ci-docker-build.yml b/.github/workflows/ci-docker-build.yml index d9ce8b75061..0348f5baaaa 100644 --- a/.github/workflows/ci-docker-build.yml +++ b/.github/workflows/ci-docker-build.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -42,7 +42,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Build only linux/amd64 docker image for Pull Request if: github.ref_name != 'main' diff --git a/.github/workflows/ci-elasticsearch.yml b/.github/workflows/ci-elasticsearch.yml index 3d4c14cc1d5..d1c5206809c 100644 --- a/.github/workflows/ci-elasticsearch.yml +++ b/.github/workflows/ci-elasticsearch.yml @@ -36,7 +36,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -51,7 +51,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Run elasticsearch integration tests run: bash scripts/es-integration-test.sh ${{ matrix.version.distribution }} ${{ matrix.version.image }} diff --git a/.github/workflows/ci-grpc-badger.yml b/.github/workflows/ci-grpc-badger.yml index 225f63bbaf6..60dd1697abd 100644 --- a/.github/workflows/ci-grpc-badger.yml +++ b/.github/workflows/ci-grpc-badger.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 with: diff --git a/.github/workflows/ci-hotrod.yml b/.github/workflows/ci-hotrod.yml index 292fe2ecb3c..25be9c5787b 100644 --- a/.github/workflows/ci-hotrod.yml +++ b/.github/workflows/ci-hotrod.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -38,7 +38,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Build, test, and publish hotrod image run: bash scripts/hotrod-integration-test.sh diff --git a/.github/workflows/ci-kafka.yml b/.github/workflows/ci-kafka.yml index 4f619f555aa..0d69c8b9857 100644 --- a/.github/workflows/ci-kafka.yml +++ b/.github/workflows/ci-kafka.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 with: diff --git a/.github/workflows/ci-opensearch.yml b/.github/workflows/ci-opensearch.yml index 7f43d756cdc..840b6b19e3e 100644 --- a/.github/workflows/ci-opensearch.yml +++ b/.github/workflows/ci-opensearch.yml @@ -30,7 +30,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -45,7 +45,7 @@ jobs: - name: Install tools run: make install-ci - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Run opensearch integration tests run: bash scripts/es-integration-test.sh ${{ matrix.version.distribution }} ${{ matrix.version.image }} diff --git a/.github/workflows/ci-protogen-tests.yml b/.github/workflows/ci-protogen-tests.yml index 6618fd00143..ab04045802c 100644 --- a/.github/workflows/ci-protogen-tests.yml +++ b/.github/workflows/ci-protogen-tests.yml @@ -20,7 +20,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml index 04a31192cb7..fff3d6d97a3 100644 --- a/.github/workflows/ci-release.yml +++ b/.github/workflows/ci-release.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 with: submodules: true @@ -68,7 +68,7 @@ jobs: repo_token: ${{ secrets.GITHUB_TOKEN }} if: steps.package-binaries.outcome == 'success' - - uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 + - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 - name: Build and upload all docker images run: bash scripts/build-upload-docker-images.sh @@ -89,6 +89,6 @@ jobs: QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }} - name: SBOM Generation - uses: anchore/sbom-action@422cb34a0f8b599678c41b21163ea6088edb2624 + uses: anchore/sbom-action@78fc58e266e87a38d4194b2137a3d4e9bcaf7ca1 with: artifact-name: jaeger-SBOM.spdx.json diff --git a/.github/workflows/ci-unit-tests-go-tip.yml b/.github/workflows/ci-unit-tests-go-tip.yml index c6151b0e6d9..de18b6933e7 100644 --- a/.github/workflows/ci-unit-tests-go-tip.yml +++ b/.github/workflows/ci-unit-tests-go-tip.yml @@ -17,7 +17,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # From https://github.com/actions/setup-go/issues/21#issuecomment-997208686 - name: Install Go tip diff --git a/.github/workflows/ci-unit-tests.yml b/.github/workflows/ci-unit-tests.yml index b63ae5248c3..af43ce53663 100644 --- a/.github/workflows/ci-unit-tests.yml +++ b/.github/workflows/ci-unit-tests.yml @@ -26,7 +26,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d9dd2e93fa8..331c79d7a58 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -36,11 +36,11 @@ jobs: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - name: Checkout repository - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@83f0fe6c4988d98a455712a27f0255212bba9bd4 + uses: github/codeql-action/init@cdcdbb579706841c47f7063dda365e292e5cad7a with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -49,7 +49,7 @@ jobs: # queries: ./path/to/local/query, your-org/your-repo/queries@main - name: Autobuild - uses: github/codeql-action/autobuild@83f0fe6c4988d98a455712a27f0255212bba9bd4 + uses: github/codeql-action/autobuild@cdcdbb579706841c47f7063dda365e292e5cad7a - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@83f0fe6c4988d98a455712a27f0255212bba9bd4 + uses: github/codeql-action/analyze@cdcdbb579706841c47f7063dda365e292e5cad7a diff --git a/.github/workflows/fossa.yml b/.github/workflows/fossa.yml index cc9aa01611b..a36cc7e9dfe 100644 --- a/.github/workflows/fossa.yml +++ b/.github/workflows/fossa.yml @@ -21,7 +21,7 @@ jobs: with: egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 with: diff --git a/cmd/all-in-one/main.go b/cmd/all-in-one/main.go index 963b224d5c5..b40e427cfa7 100644 --- a/cmd/all-in-one/main.go +++ b/cmd/all-in-one/main.go @@ -45,6 +45,7 @@ import ( "github.com/jaegertracing/jaeger/internal/metrics/fork" "github.com/jaegertracing/jaeger/internal/metrics/jlibadapter" "github.com/jaegertracing/jaeger/pkg/config" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/pkg/version" @@ -273,7 +274,8 @@ func startQuery( ) *queryApp.Server { spanReader = storageMetrics.NewReadMetricsDecorator(spanReader, baseFactory.Namespace(metrics.NSOptions{Name: "query"})) qs := querysvc.NewQueryService(spanReader, depReader, *queryOpts) - server, err := queryApp.NewServer(svc.Logger, qs, metricsQueryService, qOpts, tm, opentracing.GlobalTracer()) + jtracer := jtracer.OT(opentracing.GlobalTracer()) + server, err := queryApp.NewServer(svc.Logger, qs, metricsQueryService, qOpts, tm, jtracer) if err != nil { svc.Logger.Fatal("Could not start jaeger-query service", zap.Error(err)) } diff --git a/cmd/collector/app/server/http_test.go b/cmd/collector/app/server/http_test.go index 6f2742d233e..acfd4a80a11 100644 --- a/cmd/collector/app/server/http_test.go +++ b/cmd/collector/app/server/http_test.go @@ -26,7 +26,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" - "go.uber.org/zap/zaptest" "github.com/jaegertracing/jaeger/cmd/collector/app/handler" "github.com/jaegertracing/jaeger/internal/metricstest" @@ -94,7 +93,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { clientTLS tlscfg.Options expectError bool expectClientError bool - expectServerFail bool }{ { name: "should fail with TLS client to untrusted TLS server", @@ -109,7 +107,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { }, expectError: true, expectClientError: true, - expectServerFail: false, }, { name: "should fail with TLS client to trusted TLS server with incorrect hostname", @@ -125,7 +122,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { }, expectError: true, expectClientError: true, - expectServerFail: false, }, { name: "should pass with TLS client to trusted TLS server with correct hostname", @@ -139,9 +135,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { CAPath: testCertKeyLocation + "/example-CA-cert.pem", ServerName: "example.com", }, - expectError: false, - expectClientError: false, - expectServerFail: false, }, { name: "should fail with TLS client without cert to trusted TLS server requiring cert", @@ -156,8 +149,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { CAPath: testCertKeyLocation + "/example-CA-cert.pem", ServerName: "example.com", }, - expectError: false, - expectServerFail: false, expectClientError: true, }, { @@ -175,9 +166,6 @@ func TestSpanCollectorHTTPS(t *testing.T) { CertPath: testCertKeyLocation + "/example-client-cert.pem", KeyPath: testCertKeyLocation + "/example-client-key.pem", }, - expectError: false, - expectServerFail: false, - expectClientError: false, }, { name: "should fail with TLS client without cert to trusted TLS server requiring cert from a different CA", @@ -194,15 +182,15 @@ func TestSpanCollectorHTTPS(t *testing.T) { CertPath: testCertKeyLocation + "/example-client-cert.pem", KeyPath: testCertKeyLocation + "/example-client-key.pem", }, - expectError: false, - expectServerFail: false, expectClientError: true, }, } for _, test := range testCases { t.Run(test.name, func(t *testing.T) { - logger := zaptest.NewLogger(t) + // Cannot reliably use zaptest.NewLogger(t) because it causes race condition + // See https://github.com/jaegertracing/jaeger/issues/4497. + logger := zap.NewNop() params := &HTTPServerParams{ HostPort: fmt.Sprintf(":%d", ports.CollectorHTTP), Handler: handler.NewJaegerSpanHandler(logger, &mockSpanProcessor{}), @@ -214,14 +202,12 @@ func TestSpanCollectorHTTPS(t *testing.T) { } server, err := StartHTTPServer(params) - - if test.expectServerFail { - require.Error(t, err) - } - defer server.Close() - require.NoError(t, err) - clientTLSCfg, err0 := test.clientTLS.Config(zap.NewNop()) + defer func() { + assert.NoError(t, server.Close()) + }() + + clientTLSCfg, err0 := test.clientTLS.Config(logger) require.NoError(t, err0) dialer := &net.Dialer{Timeout: 2 * time.Second} conn, clientError := tls.DialWithDialer(dialer, "tcp", "localhost:"+fmt.Sprintf("%d", ports.CollectorHTTP), clientTLSCfg) @@ -260,7 +246,7 @@ func TestSpanCollectorHTTPS(t *testing.T) { } func TestStartHTTPServerParams(t *testing.T) { - logger := zaptest.NewLogger(t) + logger := zap.NewNop() params := &HTTPServerParams{ HostPort: fmt.Sprintf(":%d", ports.CollectorHTTP), Handler: handler.NewJaegerSpanHandler(logger, &mockSpanProcessor{}), diff --git a/cmd/query/app/grpc_handler.go b/cmd/query/app/grpc_handler.go index 53a452db2f6..57827073000 100644 --- a/cmd/query/app/grpc_handler.go +++ b/cmd/query/app/grpc_handler.go @@ -19,7 +19,6 @@ import ( "errors" "time" - "github.com/opentracing/opentracing-go" "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -27,6 +26,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" "github.com/jaegertracing/jaeger/model" _ "github.com/jaegertracing/jaeger/pkg/gogocodec" // force gogo codec registration + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/plugin/metrics/disabled" "github.com/jaegertracing/jaeger/proto-gen/api_v2" "github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics" @@ -53,14 +53,14 @@ type GRPCHandler struct { queryService *querysvc.QueryService metricsQueryService querysvc.MetricsQueryService logger *zap.Logger - tracer opentracing.Tracer + tracer jtracer.JTracer nowFn func() time.Time } // GRPCHandlerOptions contains optional members of GRPCHandler. type GRPCHandlerOptions struct { Logger *zap.Logger - Tracer opentracing.Tracer + Tracer jtracer.JTracer NowFn func() time.Time } @@ -73,8 +73,8 @@ func NewGRPCHandler(queryService *querysvc.QueryService, options.Logger = zap.NewNop() } - if options.Tracer == nil { - options.Tracer = opentracing.NoopTracer{} + if options.Tracer.OT == nil { + options.Tracer = jtracer.NoOp() } if options.NowFn == nil { diff --git a/cmd/query/app/grpc_handler_test.go b/cmd/query/app/grpc_handler_test.go index d6e3365f60b..a82ebe94afd 100644 --- a/cmd/query/app/grpc_handler_test.go +++ b/cmd/query/app/grpc_handler_test.go @@ -23,7 +23,6 @@ import ( "testing" "time" - "github.com/opentracing/opentracing-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -36,6 +35,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" "github.com/jaegertracing/jaeger/model" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/plugin/metrics/disabled" "github.com/jaegertracing/jaeger/proto-gen/api_v2" @@ -145,7 +145,7 @@ type grpcClient struct { conn *grpc.ClientConn } -func newGRPCServer(t *testing.T, q *querysvc.QueryService, mq querysvc.MetricsQueryService, logger *zap.Logger, tracer opentracing.Tracer, tenancyMgr *tenancy.Manager) (*grpc.Server, net.Addr) { +func newGRPCServer(t *testing.T, q *querysvc.QueryService, mq querysvc.MetricsQueryService, logger *zap.Logger, tracer jtracer.JTracer, tenancyMgr *tenancy.Manager) (*grpc.Server, net.Addr) { lis, _ := net.Listen("tcp", ":0") var grpcOpts []grpc.ServerOption if tenancyMgr.Enabled { @@ -925,7 +925,7 @@ func initializeTenantedTestServerGRPCWithOptions(t *testing.T, tm *tenancy.Manag } logger := zap.NewNop() - tracer := opentracing.NoopTracer{} + tracer := jtracer.NoOp() server, addr := newGRPCServer(t, q, tqs.metricsQueryService, logger, tracer, tm) diff --git a/cmd/query/app/handler_options.go b/cmd/query/app/handler_options.go index 7e562f4eb47..78d34db8221 100644 --- a/cmd/query/app/handler_options.go +++ b/cmd/query/app/handler_options.go @@ -18,10 +18,10 @@ package app import ( "time" - "github.com/opentracing/opentracing-go" "go.uber.org/zap" "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" + "github.com/jaegertracing/jaeger/pkg/jtracer" ) // HandlerOption is a function that sets some option on the APIHandler @@ -62,7 +62,7 @@ func (handlerOptions) QueryLookbackDuration(queryLookbackDuration time.Duration) } // Tracer creates a HandlerOption that initializes OpenTracing tracer -func (handlerOptions) Tracer(tracer opentracing.Tracer) HandlerOption { +func (handlerOptions) Tracer(tracer jtracer.JTracer) HandlerOption { return func(apiHandler *APIHandler) { apiHandler.tracer = tracer } diff --git a/cmd/query/app/http_handler.go b/cmd/query/app/http_handler.go index 3e09895d37b..9714483a4f2 100644 --- a/cmd/query/app/http_handler.go +++ b/cmd/query/app/http_handler.go @@ -28,13 +28,13 @@ import ( "github.com/gogo/protobuf/proto" "github.com/gorilla/mux" "github.com/opentracing-contrib/go-stdlib/nethttp" - "github.com/opentracing/opentracing-go" "go.uber.org/zap" "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" "github.com/jaegertracing/jaeger/model" uiconv "github.com/jaegertracing/jaeger/model/converter/json" ui "github.com/jaegertracing/jaeger/model/json" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/plugin/metrics/disabled" "github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics" @@ -88,7 +88,7 @@ type APIHandler struct { basePath string apiPrefix string logger *zap.Logger - tracer opentracing.Tracer + tracer jtracer.JTracer } // NewAPIHandler returns an APIHandler @@ -111,8 +111,8 @@ func NewAPIHandler(queryService *querysvc.QueryService, tm *tenancy.Manager, opt if aH.logger == nil { aH.logger = zap.NewNop() } - if aH.tracer == nil { - aH.tracer = opentracing.NoopTracer{} + if aH.tracer.OT == nil { + aH.tracer = jtracer.NoOp() } return aH } @@ -147,7 +147,7 @@ func (aH *APIHandler) handleFunc( handler = tenancy.ExtractTenantHTTPHandler(aH.tenancyMgr, handler) } traceMiddleware := nethttp.Middleware( - aH.tracer, + aH.tracer.OT, handler, nethttp.OperationNameFunc(func(r *http.Request) string { return route diff --git a/cmd/query/app/http_handler_test.go b/cmd/query/app/http_handler_test.go index 59e41735be4..04604526ac6 100644 --- a/cmd/query/app/http_handler_test.go +++ b/cmd/query/app/http_handler_test.go @@ -43,6 +43,7 @@ import ( "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/model/adjuster" ui "github.com/jaegertracing/jaeger/model/json" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/plugin/metrics/disabled" "github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics" @@ -304,9 +305,10 @@ func TestGetTrace(t *testing.T) { t.Run(testCase.suffix, func(t *testing.T) { reporter := jaeger.NewInMemoryReporter() jaegerTracer, jaegerCloser := jaeger.NewTracer("test", jaeger.NewConstSampler(true), reporter) + jTracer := jtracer.OT(jaegerTracer) defer jaegerCloser.Close() - ts := initializeTestServer(HandlerOptions.Tracer(jaegerTracer)) + ts := initializeTestServer(HandlerOptions.Tracer(jTracer)) defer ts.server.Close() ts.spanReader.On("GetTrace", mock.AnythingOfType("*context.valueCtx"), model.NewTraceID(0, 0x123456abc)). diff --git a/cmd/query/app/server.go b/cmd/query/app/server.go index b078b24c631..2c9e834f324 100644 --- a/cmd/query/app/server.go +++ b/cmd/query/app/server.go @@ -23,7 +23,6 @@ import ( "time" "github.com/gorilla/handlers" - "github.com/opentracing/opentracing-go" "github.com/soheilhy/cmux" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -37,6 +36,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" "github.com/jaegertracing/jaeger/pkg/bearertoken" "github.com/jaegertracing/jaeger/pkg/healthcheck" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/netutils" "github.com/jaegertracing/jaeger/pkg/recoveryhandler" "github.com/jaegertracing/jaeger/pkg/tenancy" @@ -51,7 +51,7 @@ type Server struct { querySvc *querysvc.QueryService queryOptions *QueryOptions - tracer opentracing.Tracer // TODO make part of flags.Service + tracer jtracer.JTracer // TODO make part of flags.Service conn net.Listener grpcConn net.Listener @@ -65,7 +65,7 @@ type Server struct { } // NewServer creates and initializes Server -func NewServer(logger *zap.Logger, querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, options *QueryOptions, tm *tenancy.Manager, tracer opentracing.Tracer) (*Server, error) { +func NewServer(logger *zap.Logger, querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, options *QueryOptions, tm *tenancy.Manager, tracer jtracer.JTracer) (*Server, error) { _, httpPort, err := net.SplitHostPort(options.HTTPHostPort) if err != nil { return nil, err @@ -107,7 +107,7 @@ func (s Server) HealthCheckStatus() chan healthcheck.Status { return s.unavailableChannel } -func createGRPCServer(querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, options *QueryOptions, tm *tenancy.Manager, logger *zap.Logger, tracer opentracing.Tracer) (*grpc.Server, error) { +func createGRPCServer(querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, options *QueryOptions, tm *tenancy.Manager, logger *zap.Logger, tracer jtracer.JTracer) (*grpc.Server, error) { var grpcOpts []grpc.ServerOption if options.TLSGRPC.Enabled { @@ -148,7 +148,7 @@ func createGRPCServer(querySvc *querysvc.QueryService, metricsQuerySvc querysvc. return server, nil } -func createHTTPServer(querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, queryOpts *QueryOptions, tm *tenancy.Manager, tracer opentracing.Tracer, logger *zap.Logger) (*http.Server, context.CancelFunc, error) { +func createHTTPServer(querySvc *querysvc.QueryService, metricsQuerySvc querysvc.MetricsQueryService, queryOpts *QueryOptions, tm *tenancy.Manager, tracer jtracer.JTracer, logger *zap.Logger) (*http.Server, context.CancelFunc, error) { apiHandlerOptions := []HandlerOption{ HandlerOptions.Logger(logger), HandlerOptions.Tracer(tracer), diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go index fa020757334..300ae982d37 100644 --- a/cmd/query/app/server_test.go +++ b/cmd/query/app/server_test.go @@ -24,7 +24,6 @@ import ( "testing" "time" - "github.com/opentracing/opentracing-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -40,6 +39,7 @@ import ( "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/pkg/config/tlscfg" "github.com/jaegertracing/jaeger/pkg/healthcheck" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/ports" "github.com/jaegertracing/jaeger/proto-gen/api_v2" @@ -69,7 +69,7 @@ func TestCreateTLSServerSinglePortError(t *testing.T) { _, err := NewServer(zap.NewNop(), &querysvc.QueryService{}, nil, &QueryOptions{HTTPHostPort: ":8080", GRPCHostPort: ":8080", TLSGRPC: tlsCfg, TLSHTTP: tlsCfg}, - tenancy.NewManager(&tenancy.Options{}), opentracing.NoopTracer{}) + tenancy.NewManager(&tenancy.Options{}), jtracer.NoOp()) assert.NotNil(t, err) } @@ -83,7 +83,7 @@ func TestCreateTLSGrpcServerError(t *testing.T) { _, err := NewServer(zap.NewNop(), &querysvc.QueryService{}, nil, &QueryOptions{HTTPHostPort: ":8080", GRPCHostPort: ":8081", TLSGRPC: tlsCfg}, - tenancy.NewManager(&tenancy.Options{}), opentracing.NoopTracer{}) + tenancy.NewManager(&tenancy.Options{}), jtracer.NoOp()) assert.NotNil(t, err) } @@ -97,7 +97,7 @@ func TestCreateTLSHttpServerError(t *testing.T) { _, err := NewServer(zap.NewNop(), &querysvc.QueryService{}, nil, &QueryOptions{HTTPHostPort: ":8080", GRPCHostPort: ":8081", TLSHTTP: tlsCfg}, - tenancy.NewManager(&tenancy.Options{}), opentracing.NoopTracer{}) + tenancy.NewManager(&tenancy.Options{}), jtracer.NoOp()) assert.NotNil(t, err) } @@ -340,7 +340,7 @@ func TestServerHTTPTLS(t *testing.T) { querySvc := querysvc.NewQueryService(spanReader, dependencyReader, querysvc.QueryServiceOptions{}) server, err := NewServer(flagsSvc.Logger, querySvc, nil, serverOptions, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}) + jtracer.NoOp()) assert.Nil(t, err) assert.NoError(t, server.Start()) @@ -500,7 +500,7 @@ func TestServerGRPCTLS(t *testing.T) { querySvc := querysvc.NewQueryService(spanReader, dependencyReader, querysvc.QueryServiceOptions{}) server, err := NewServer(flagsSvc.Logger, querySvc, nil, serverOptions, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}) + jtracer.NoOp()) assert.Nil(t, err) assert.NoError(t, server.Start()) @@ -555,13 +555,13 @@ func TestServerBadHostPort(t *testing.T) { _, err := NewServer(zap.NewNop(), &querysvc.QueryService{}, nil, &QueryOptions{HTTPHostPort: "8080", GRPCHostPort: "127.0.0.1:8081", BearerTokenPropagation: true}, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}) + jtracer.NoOp()) assert.NotNil(t, err) _, err = NewServer(zap.NewNop(), &querysvc.QueryService{}, nil, &QueryOptions{HTTPHostPort: "127.0.0.1:8081", GRPCHostPort: "9123", BearerTokenPropagation: true}, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}) + jtracer.NoOp()) assert.NotNil(t, err) } @@ -592,7 +592,7 @@ func TestServerInUseHostPort(t *testing.T) { BearerTokenPropagation: true, }, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}, + jtracer.NoOp(), ) assert.NoError(t, err) @@ -622,7 +622,7 @@ func TestServerSinglePort(t *testing.T) { server, err := NewServer(flagsSvc.Logger, querySvc, nil, &QueryOptions{GRPCHostPort: hostPort, HTTPHostPort: hostPort, BearerTokenPropagation: true}, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}) + jtracer.NoOp()) assert.Nil(t, err) assert.NoError(t, server.Start()) @@ -668,7 +668,7 @@ func TestServerGracefulExit(t *testing.T) { hostPort := ports.PortToHostPort(ports.QueryAdminHTTP) querySvc := &querysvc.QueryService{} - tracer := opentracing.NoopTracer{} + tracer := jtracer.NoOp() server, err := NewServer(flagsSvc.Logger, querySvc, nil, &QueryOptions{GRPCHostPort: hostPort, HTTPHostPort: hostPort}, tenancy.NewManager(&tenancy.Options{}), tracer) @@ -697,7 +697,7 @@ func TestServerHandlesPortZero(t *testing.T) { flagsSvc.Logger = zap.New(zapCore) querySvc := &querysvc.QueryService{} - tracer := opentracing.NoopTracer{} + tracer := jtracer.NoOp() server, err := NewServer(flagsSvc.Logger, querySvc, nil, &QueryOptions{GRPCHostPort: ":0", HTTPHostPort: ":0"}, tenancy.NewManager(&tenancy.Options{}), @@ -759,7 +759,7 @@ func TestServerHTTPTenancy(t *testing.T) { querySvc := querysvc.NewQueryService(spanReader, dependencyReader, querysvc.QueryServiceOptions{}) server, err := NewServer(zap.NewNop(), querySvc, nil, serverOptions, tenancyMgr, - opentracing.NoopTracer{}) + jtracer.NoOp()) require.Nil(t, err) require.NoError(t, server.Start()) diff --git a/cmd/query/app/token_propagation_test.go b/cmd/query/app/token_propagation_test.go index cf5df81ca1c..a106a2eb487 100644 --- a/cmd/query/app/token_propagation_test.go +++ b/cmd/query/app/token_propagation_test.go @@ -22,7 +22,6 @@ import ( "testing" "github.com/olivere/elastic" - "github.com/opentracing/opentracing-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" @@ -31,6 +30,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/query/app/querysvc" "github.com/jaegertracing/jaeger/pkg/bearertoken" "github.com/jaegertracing/jaeger/pkg/config" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/plugin/storage/es" @@ -93,7 +93,7 @@ func runQueryService(t *testing.T, esURL string) *Server { server, err := NewServer(flagsSvc.Logger, querySvc, nil, &QueryOptions{GRPCHostPort: ":0", HTTPHostPort: ":0", BearerTokenPropagation: true}, tenancy.NewManager(&tenancy.Options{}), - opentracing.NoopTracer{}, + jtracer.NoOp(), ) require.NoError(t, err) require.NoError(t, server.Start()) diff --git a/cmd/query/main.go b/cmd/query/main.go index af6b6116378..ab88bef240e 100644 --- a/cmd/query/main.go +++ b/cmd/query/main.go @@ -37,6 +37,7 @@ import ( "github.com/jaegertracing/jaeger/internal/metrics/jlibadapter" "github.com/jaegertracing/jaeger/pkg/bearertoken" "github.com/jaegertracing/jaeger/pkg/config" + "github.com/jaegertracing/jaeger/pkg/jtracer" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/pkg/version" @@ -96,6 +97,7 @@ func main() { } defer closer.Close() opentracing.SetGlobalTracer(tracer) + jtracer := jtracer.OT(tracer) queryOpts, err := new(app.QueryOptions).InitFromViper(v, logger) if err != nil { logger.Fatal("Failed to configure query service", zap.Error(err)) @@ -126,7 +128,7 @@ func main() { dependencyReader, *queryServiceOptions) tm := tenancy.NewManager(&queryOpts.Tenancy) - server, err := app.NewServer(svc.Logger, queryService, metricsQueryService, queryOpts, tm, tracer) + server, err := app.NewServer(svc.Logger, queryService, metricsQueryService, queryOpts, tm, jtracer) if err != nil { logger.Fatal("Failed to create server", zap.Error(err)) } diff --git a/cmd/tracegen/main.go b/cmd/tracegen/main.go index 3d04c26c194..6c7a07e8158 100644 --- a/cmd/tracegen/main.go +++ b/cmd/tracegen/main.go @@ -16,6 +16,7 @@ package main import ( "context" + "errors" "flag" "fmt" @@ -29,6 +30,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "github.com/jaegertracing/jaeger/internal/jaegerclientenv2otel" @@ -46,22 +48,47 @@ func main() { otel.SetTextMapPropagator(propagation.TraceContext{}) jaegerclientenv2otel.MapJaegerToOtelEnvVars(logger) - exp, err := createOtelExporter(cfg.TraceExporter) - if err != nil { - logger.Sugar().Fatalf("cannot create trace exporter %s: %w", cfg.TraceExporter, err) + tracers, shutdown := createTracers(cfg) + defer shutdown(context.Background()) + + tracegen.Run(cfg, tracers, logger) +} + +func createTracers(cfg *tracegen.Config) ([]trace.Tracer, func(context.Context) error) { + if cfg.Services < 1 { + cfg.Services = 1 } - logger.Sugar().Infof("using %s trace exporter", cfg.TraceExporter) + var shutdown []func(context.Context) error + var tracers []trace.Tracer + for s := 0; s < cfg.Services; s++ { + svc := cfg.Service + if cfg.Services > 1 { + svc = fmt.Sprintf("%s-%02d", svc, s) + } - tp := sdktrace.NewTracerProvider( - sdktrace.WithBatcher(exp), - sdktrace.WithResource(resource.NewWithAttributes( - semconv.SchemaURL, - semconv.ServiceNameKey.String(cfg.Service), - )), - ) - defer tp.Shutdown(context.Background()) + exp, err := createOtelExporter(cfg.TraceExporter) + if err != nil { + logger.Sugar().Fatalf("cannot create trace exporter %s: %w", cfg.TraceExporter, err) + } + logger.Sugar().Infof("using %s trace exporter for service %s", cfg.TraceExporter, svc) - tracegen.Run(cfg, tp.Tracer("tracegen"), logger) + tp := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exp), + sdktrace.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(svc), + )), + ) + tracers = append(tracers, tp.Tracer(cfg.Service)) + shutdown = append(shutdown, tp.Shutdown) + } + return tracers, func(ctx context.Context) error { + var errs []error + for _, f := range shutdown { + errs = append(errs, f(ctx)) + } + return errors.Join(errs...) + } } func createOtelExporter(exporterType string) (sdktrace.SpanExporter, error) { diff --git a/examples/hotrod/pkg/tracing/init.go b/examples/hotrod/pkg/tracing/init.go index 112696bf756..367d328b30d 100644 --- a/examples/hotrod/pkg/tracing/init.go +++ b/examples/hotrod/pkg/tracing/init.go @@ -21,6 +21,7 @@ import ( "os" "strings" "sync" + "time" "github.com/opentracing/opentracing-go" "go.opentelemetry.io/otel" @@ -33,6 +34,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.7.0" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "github.com/jaegertracing/jaeger/examples/hotrod/pkg/log" @@ -42,9 +44,24 @@ import ( var once sync.Once -// Init initializes OpenTelemetry SDK and uses OTel-OpenTracing Bridge -// to return an OpenTracing-compatible tracer. +// InitOTEL initializes OpenTelemetry SDK. +func InitOTEL(serviceName string, exporterType string, metricsFactory metrics.Factory, logger log.Factory) trace.Tracer { + _, oteltp := initBOTH(serviceName, exporterType, metricsFactory, logger) + + logger.Bg().Debug("Created OTEL tracer", zap.String("service-name", serviceName)) + return oteltp.Tracer(serviceName) +} + +// Init returns OTel-OpenTracing Bridge. func Init(serviceName string, exporterType string, metricsFactory metrics.Factory, logger log.Factory) opentracing.Tracer { + otTracer, _ := initBOTH(serviceName, exporterType, metricsFactory, logger) + + logger.Bg().Debug("Created OTEL->OT bridge", zap.String("service-name", serviceName)) + return otTracer +} + +// initBOTH initializes OpenTelemetry SDK and uses OTel-OpenTracing Bridge +func initBOTH(serviceName string, exporterType string, metricsFactory metrics.Factory, logger log.Factory) (opentracing.Tracer, trace.TracerProvider) { once.Do(func() { otel.SetTextMapPropagator( propagation.NewCompositeTextMapPropagator( @@ -62,16 +79,15 @@ func Init(serviceName string, exporterType string, metricsFactory metrics.Factor rpcmetricsObserver := rpcmetrics.NewObserver(metricsFactory, rpcmetrics.DefaultNameNormalizer) tp := sdktrace.NewTracerProvider( - sdktrace.WithBatcher(exp), + sdktrace.WithBatcher(exp, sdktrace.WithBatchTimeout(1000*time.Millisecond)), sdktrace.WithSpanProcessor(rpcmetricsObserver), sdktrace.WithResource(resource.NewWithAttributes( semconv.SchemaURL, semconv.ServiceNameKey.String(serviceName), )), ) - otTracer, _ := otbridge.NewTracerPair(tp.Tracer("")) - logger.Bg().Debug("created OTEL->OT bridge", zap.String("service-name", serviceName)) - return otTracer + otTracer, _ := otbridge.NewTracerPair(tp.Tracer(serviceName)) + return otTracer, tp } // withSecure instructs the client to use HTTPS scheme, instead of hotrod's desired default HTTP diff --git a/examples/hotrod/services/driver/redis.go b/examples/hotrod/services/driver/redis.go index ae29785182b..1199017dfb0 100644 --- a/examples/hotrod/services/driver/redis.go +++ b/examples/hotrod/services/driver/redis.go @@ -22,8 +22,9 @@ import ( "math/rand" "sync" - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "github.com/jaegertracing/jaeger/examples/hotrod/pkg/delay" @@ -35,27 +36,24 @@ import ( // Redis is a simulator of remote Redis cache type Redis struct { - tracer opentracing.Tracer // simulate redis as a separate process + tracer trace.Tracer // simulate redis as a separate process logger log.Factory errorSimulator } func newRedis(otelExporter string, metricsFactory metrics.Factory, logger log.Factory) *Redis { return &Redis{ - tracer: tracing.Init("redis", otelExporter, metricsFactory, logger), + tracer: tracing.InitOTEL("redis-manual", otelExporter, metricsFactory, logger), logger: logger, } } // FindDriverIDs finds IDs of drivers who are near the location. func (r *Redis) FindDriverIDs(ctx context.Context, location string) []string { - if span := opentracing.SpanFromContext(ctx); span != nil { - span := r.tracer.StartSpan("FindDriverIDs", opentracing.ChildOf(span.Context())) - span.SetTag("param.location", location) - ext.SpanKindRPCClient.Set(span) - defer span.Finish() - ctx = opentracing.ContextWithSpan(ctx, span) - } + ctx, span := r.tracer.Start(ctx, "FindDriverIDs", trace.WithSpanKind(trace.SpanKindClient)) + span.SetAttributes(attribute.Key("param.driver.location").String(location)) + defer span.End() + // simulate RPC delay delay.Sleep(config.RedisFindDelay, config.RedisFindDelayStdDev) @@ -70,23 +68,21 @@ func (r *Redis) FindDriverIDs(ctx context.Context, location string) []string { // GetDriver returns driver and the current car location func (r *Redis) GetDriver(ctx context.Context, driverID string) (Driver, error) { - if span := opentracing.SpanFromContext(ctx); span != nil { - span := r.tracer.StartSpan("GetDriver", opentracing.ChildOf(span.Context())) - span.SetTag("param.driverID", driverID) - ext.SpanKindRPCClient.Set(span) - defer span.Finish() - ctx = opentracing.ContextWithSpan(ctx, span) - } + ctx, span := r.tracer.Start(ctx, "GetDriver", trace.WithSpanKind(trace.SpanKindClient)) + span.SetAttributes(attribute.Key("param.driverID").String(driverID)) + defer span.End() + // simulate RPC delay delay.Sleep(config.RedisGetDelay, config.RedisGetDelayStdDev) if err := r.checkError(); err != nil { - if span := opentracing.SpanFromContext(ctx); span != nil { - ext.Error.Set(span, true) - } + span.RecordError(err) + span.SetStatus(codes.Error, "An error occurred") r.logger.For(ctx).Error("redis timeout", zap.String("driver_id", driverID), zap.Error(err)) return Driver{}, err } + r.logger.For(ctx).Info("Got driver's ID", zap.String("driverID", driverID)) + // #nosec return Driver{ DriverID: driverID, diff --git a/examples/memstore-plugin/README.md b/examples/memstore-plugin/README.md new file mode 100644 index 00000000000..566e85c0978 --- /dev/null +++ b/examples/memstore-plugin/README.md @@ -0,0 +1,6 @@ +# memstore-plugin + +This package builds a binary that can be used as an example of a sidecar storage plugin. + +Note that Jaeger now supports remote storages via gRPC API, so using plugins is discouraged. +For example, `memorystore` can be used as a remote backend (https://github.com/jaegertracing/jaeger/issues/3835). diff --git a/go.mod b/go.mod index 095f98abc2c..ad32b2de9ac 100644 --- a/go.mod +++ b/go.mod @@ -31,29 +31,29 @@ require ( github.com/hashicorp/go-plugin v1.4.10 github.com/kr/pretty v0.3.1 github.com/olivere/elastic v6.2.37+incompatible - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.78.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.79.0 github.com/opentracing-contrib/go-grpc v0.0.0-20230205024533-5ced129e5996 github.com/opentracing-contrib/go-stdlib v1.0.0 github.com/opentracing/opentracing-go v1.2.0 - github.com/prometheus/client_golang v1.15.1 + github.com/prometheus/client_golang v1.16.0 github.com/prometheus/client_model v0.4.0 - github.com/prometheus/common v0.43.0 + github.com/prometheus/common v0.44.0 github.com/rs/cors v1.9.0 github.com/soheilhy/cmux v0.1.5 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible github.com/xdg-go/scram v1.1.2 - go.opentelemetry.io/collector v0.78.2 - go.opentelemetry.io/collector/component v0.78.2 - go.opentelemetry.io/collector/consumer v0.78.2 + go.opentelemetry.io/collector v0.79.0 + go.opentelemetry.io/collector/component v0.79.0 + go.opentelemetry.io/collector/consumer v0.79.0 go.opentelemetry.io/collector/pdata v1.0.0-rcv0012 - go.opentelemetry.io/collector/receiver v0.78.2 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.78.2 - go.opentelemetry.io/collector/semconv v0.78.2 + go.opentelemetry.io/collector/receiver v0.79.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.79.0 + go.opentelemetry.io/collector/semconv v0.79.0 go.opentelemetry.io/otel v1.16.0 go.opentelemetry.io/otel/bridge/opentracing v1.16.0 go.opentelemetry.io/otel/exporters/jaeger v1.16.0 @@ -67,9 +67,9 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/automaxprocs v1.5.2 go.uber.org/zap v1.24.0 - golang.org/x/net v0.10.0 - golang.org/x/sys v0.8.0 - google.golang.org/grpc v1.55.0 + golang.org/x/net v0.11.0 + golang.org/x/sys v0.9.0 + google.golang.org/grpc v1.56.0 google.golang.org/protobuf v1.30.0 gopkg.in/yaml.v2 v2.4.0 ) @@ -134,12 +134,12 @@ require ( github.com/oklog/ulid v1.3.1 // indirect github.com/onsi/ginkgo v1.16.4 // indirect github.com/onsi/gomega v1.13.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.78.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.79.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -152,16 +152,16 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect go.mongodb.org/mongo-driver v1.11.6 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector/confmap v0.78.2 // indirect - go.opentelemetry.io/collector/exporter v0.78.2 // indirect + go.opentelemetry.io/collector/confmap v0.79.0 // indirect + go.opentelemetry.io/collector/exporter v0.79.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0-rcv0012 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/crypto v0.10.0 // indirect + golang.org/x/text v0.10.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 0cbca23973e..e8dd8b24234 100644 --- a/go.sum +++ b/go.sum @@ -24,7 +24,7 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= +cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= @@ -115,6 +115,7 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -154,6 +155,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.10.1 h1:c0g45+xCJhdgFGw7a5QAfdS4byAbud7miNWJ1WwEVf8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= @@ -551,10 +553,10 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.78.0 h1:FYcWaMxq71hT96GvjtOHpowV2AW8N20GVSeKlphTYYk= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.78.0/go.mod h1:AKNYrRSBFXQGf67koffJ1cACBz+2eDYbmw8IlI03PGU= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.78.0 h1:+mc0e+e2k/p9mvMOz1gDDQeBeMo/gsSPtpCcaOKIyAA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.78.0/go.mod h1:k3QLd9wrbN3PkOoQOtnS9aZaC44fB5EiZswDoidonGI= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.79.0 h1:OZPeakqoSZ1yRlmGBlWi9kISx/9PJzlNLGLutFPOQY0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.79.0/go.mod h1:VOHKYi1wm+/c2wZA3mY1Grd4eYP8uS//EV0yHBbGfGw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.79.0 h1:litBmOODNZ5k8XE09FD3T1KOIASXqk7ktIyxyM9xLIs= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.79.0/go.mod h1:Zyqr3oq5gK99+nqA6WwHxj1ZnaFj+uj0EFY9BzR9QCU= github.com/opentracing-contrib/go-grpc v0.0.0-20230205024533-5ced129e5996 h1:cNKquGUykT1G88PgdGC8yEB7eU3H3GyuySp/jfJS49w= github.com/opentracing-contrib/go-grpc v0.0.0-20230205024533-5ced129e5996/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= @@ -587,8 +589,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -598,14 +600,14 @@ github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us= -github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -674,8 +676,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= @@ -720,26 +723,26 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.78.2 h1:q8RCyWeS/oXBBilAx4XaWwYSSU5omwkkD2lBrKBNaT0= -go.opentelemetry.io/collector v0.78.2/go.mod h1:MweYHkPHYIY4ncWmeFQH36XjlMLNej/5dB9nTRf1DUg= -go.opentelemetry.io/collector/component v0.78.2 h1:luDNrTiz5KvHgF6Dg7Tpmvgh3xFaOzqdOxB3evvwE34= -go.opentelemetry.io/collector/component v0.78.2/go.mod h1:AoRSBnuMw0O1f1ZhslW7fx1vrP/0/JNgC2RqPIbczW0= -go.opentelemetry.io/collector/confmap v0.78.2 h1:P3IRJ4OC585whSU7NNujK+I+JtJ6bC9DHmmOWiFdQZk= -go.opentelemetry.io/collector/confmap v0.78.2/go.mod h1:nudYcQJDF5zmAd2GKe5PetMF8/Lg1Mc/EjAKQBXHdyg= -go.opentelemetry.io/collector/consumer v0.78.2 h1:KrjSRMb4Qcb+kgQeDql4IQg4C7bLlZ4hV4s/FkXJeL8= -go.opentelemetry.io/collector/consumer v0.78.2/go.mod h1:9QT9HNwBuqLlO8znbXby+UJI04bv7wPw4rD9SrOxAoY= -go.opentelemetry.io/collector/exporter v0.78.2 h1:77HMkPFXAxys+WWpVdmezq2+LZpgTVaBLFecYOiqFH8= -go.opentelemetry.io/collector/exporter v0.78.2/go.mod h1:X+J2XrNPFLq9P6mTJojmX2BCcZvQdTxfAaGrrTiTBfc= +go.opentelemetry.io/collector v0.79.0 h1:Lra7U0ilMor1g5WVkO3YZ0kZYsvzAtGN+Uq+CmC96JY= +go.opentelemetry.io/collector v0.79.0/go.mod h1:O2Vfwykphq9VqdATZiAypjnJMS3WFBXwFSe/0ujo38Q= +go.opentelemetry.io/collector/component v0.79.0 h1:ZKLJ4qa0AngmyGp1RQBJgl6OIP6mxdfrVpbz09h/W34= +go.opentelemetry.io/collector/component v0.79.0/go.mod h1:rX0gixMemcXZTZaML5zUiT+5txZUYkWnACscJkFVj18= +go.opentelemetry.io/collector/confmap v0.79.0 h1:a4XVde3lLP81BiSbt8AzVD6pvQBX8YkrB9ZtMSHKv1A= +go.opentelemetry.io/collector/confmap v0.79.0/go.mod h1:cKr2c7lVtEJCuMOncUPlcROJBbTFaHiPjYp1Y8RbL+Q= +go.opentelemetry.io/collector/consumer v0.79.0 h1:V/4PCvbTw2Bt+lYb/ogac0g/nCCb3oKnmz+jM3t5Dyk= +go.opentelemetry.io/collector/consumer v0.79.0/go.mod h1:VfqIyUI5K20zXx3mfVN+skmA+V3sV5fNorJ5TaIOj/U= +go.opentelemetry.io/collector/exporter v0.79.0 h1:PxhKgWf1AkZvN1PjiJT5xiO+pKZA9Y4fyuMs5aNFuEA= +go.opentelemetry.io/collector/exporter v0.79.0/go.mod h1:qlXiqnOUeHelpAwk03f8nB5+91UIqlA7udSBsj9bJ3M= go.opentelemetry.io/collector/featuregate v1.0.0-rcv0012 h1:pSO81lfikGEgRXHepmOGy2o6WWCly427UJCgMJC5c8g= go.opentelemetry.io/collector/featuregate v1.0.0-rcv0012/go.mod h1:/kVAsGUCyJXIDSgHftCN63QiwAEVHRLX2Kh/S+dqgHY= go.opentelemetry.io/collector/pdata v1.0.0-rcv0012 h1:R+cfEUMyLn9Q1QknyQ4QU77pbfc1aJKYEXFHtnwSbCg= go.opentelemetry.io/collector/pdata v1.0.0-rcv0012/go.mod h1:rEAKFqc1L03lidKtra/2/dJtI0Hp+JsQxuPEIkj/2Vg= -go.opentelemetry.io/collector/receiver v0.78.2 h1:nTaGoVoN1FqA8nIJOZi/Ww4cx32MsTwA4BjyN6VQII4= -go.opentelemetry.io/collector/receiver v0.78.2/go.mod h1:NUedvs1RRvVVvCnfMBnS2SG2m/s91niUQJuNjc2aASM= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.78.2 h1:3HTS18QpKTwr+fD5bIsSEYt2N/NUbassXWL/sh0Di2A= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.78.2/go.mod h1:EI+/s94xzPankztBir0FSU4wVz/MoKu4G44ljuW9coE= -go.opentelemetry.io/collector/semconv v0.78.2 h1:o1tymN831Lqc+7sPxq2FW/2E8fehqLDKMyEELtiYquU= -go.opentelemetry.io/collector/semconv v0.78.2/go.mod h1:lazBA42nqZPNPWDMiqWfr5eIVeNgRmoLDbQmjXKcm70= +go.opentelemetry.io/collector/receiver v0.79.0 h1:Ag4hciAYklQWDpKbnmqhfh9zJlUskWvThpCpphp12b4= +go.opentelemetry.io/collector/receiver v0.79.0/go.mod h1:+/xe0VoYl6Mli+KQTZWBR2apqFsbioAAqu7abzKDskI= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.79.0 h1:LWYxlRuczwT5+YwBGDzA7Sb4rM5RpdeO/CzO4qQ6lVE= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.79.0/go.mod h1:Zd+Ks3E1Z/YHFSGk/M0E6RqeV4cJIHruFjdr+XVy6S8= +go.opentelemetry.io/collector/semconv v0.79.0 h1:74pzP4c7xWk9Eihs14kEQvE4m4hHgXrQ/YbWkdn1bVY= +go.opentelemetry.io/collector/semconv v0.79.0/go.mod h1:TlYPtzvsXyHOgr5eATi43qEMqwSmIziivJB2uctKswo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= @@ -758,14 +761,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= -go.opentelemetry.io/otel/exporters/prometheus v0.38.1 h1:GwalIvFIx91qIA8qyAyqYj9lql5Ba2Oxj/jDG6+3UoU= +go.opentelemetry.io/otel/exporters/prometheus v0.39.0 h1:whAaiHxOatgtKd+w0dOi//1KUxj3KoPINZdtDaDj3IA= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/sdk/metric v0.38.1 h1:EkO5wI4NT/fUaoPMGc0fKV28JaWe7q4vfVpEVasGb+8= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -801,8 +804,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -891,8 +894,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -903,7 +906,7 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -992,8 +995,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1007,8 +1010,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1175,8 +1178,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= -google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.0 h1:+y7Bs8rtMd07LeXmL3NxcTLn7mUkbKZqEpPhMNkwJEE= +google.golang.org/grpc v1.56.0/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/internal/tracegen/config.go b/internal/tracegen/config.go index 40ae8d9521a..7ccb574dd2e 100644 --- a/internal/tracegen/config.go +++ b/internal/tracegen/config.go @@ -28,7 +28,11 @@ import ( // Config describes the test scenario. type Config struct { Workers int + Services int Traces int + ChildSpans int + Attributes int + AttrValues int Marshal bool Debug bool Firehose bool @@ -41,17 +45,21 @@ type Config struct { // Flags registers config flags. func (c *Config) Flags(fs *flag.FlagSet) { fs.IntVar(&c.Workers, "workers", 1, "Number of workers (goroutines) to run") - fs.IntVar(&c.Traces, "traces", 1, "Number of traces to generate in each worker (ignored if duration is provided") + fs.IntVar(&c.Traces, "traces", 1, "Number of traces to generate in each worker (ignored if duration is provided)") + fs.IntVar(&c.ChildSpans, "spans", 1, "Number of child spans to generate for each trace") + fs.IntVar(&c.Attributes, "attrs", 1, "Number of attributes to generate for each child span") + fs.IntVar(&c.AttrValues, "attr-values", 5, "Number of distinct values to allow for each attribute") fs.BoolVar(&c.Debug, "debug", false, "Whether to set DEBUG flag on the spans to force sampling") fs.BoolVar(&c.Firehose, "firehose", false, "Whether to set FIREHOSE flag on the spans to skip indexing") - fs.DurationVar(&c.Pause, "pause", time.Microsecond, "How long to pause before finishing trace") - fs.DurationVar(&c.Duration, "duration", 0, "For how long to run the test") - fs.StringVar(&c.Service, "service", "tracegen", "Service name to use") + fs.DurationVar(&c.Pause, "pause", time.Microsecond, "How long to sleep before finishing each span. If set to 0s then a fake 123µs duration is used.") + fs.DurationVar(&c.Duration, "duration", 0, "For how long to run the test if greater than 0s (overrides -traces).") + fs.StringVar(&c.Service, "service", "tracegen", "Service name prefix to use") + fs.IntVar(&c.Services, "services", 1, "Number of unique suffixes to add to service name when generating traces, e.g. tracegen-01 (but only one service per trace)") fs.StringVar(&c.TraceExporter, "trace-exporter", "jaeger", "Trace exporter (jaeger|otlp/otlp-http|otlp-grpc|stdout). Exporters can be additionally configured via environment variables, see https://github.com/jaegertracing/jaeger/blob/main/cmd/tracegen/README.md") } // Run executes the test scenario. -func Run(c *Config, tracer trace.Tracer, logger *zap.Logger) error { +func Run(c *Config, tracers []trace.Tracer, logger *zap.Logger) error { if c.Duration > 0 { c.Traces = 0 } else if c.Traces <= 0 { @@ -63,17 +71,12 @@ func Run(c *Config, tracer trace.Tracer, logger *zap.Logger) error { for i := 0; i < c.Workers; i++ { wg.Add(1) w := worker{ - id: i, - tracer: tracer, - traces: c.Traces, - marshal: c.Marshal, - debug: c.Debug, - firehose: c.Firehose, - pause: c.Pause, - duration: c.Duration, - running: &running, - wg: &wg, - logger: logger.With(zap.Int("worker", i)), + id: i, + tracers: tracers, + Config: *c, + running: &running, + wg: &wg, + logger: logger.With(zap.Int("worker", i)), } go w.simulateTraces() diff --git a/internal/tracegen/worker.go b/internal/tracegen/worker.go index 6125ed5cb18..8eeb5373263 100644 --- a/internal/tracegen/worker.go +++ b/internal/tracegen/worker.go @@ -27,76 +27,98 @@ import ( ) type worker struct { - tracer trace.Tracer - running *uint32 // pointer to shared flag that indicates it's time to stop the test - id int // worker id - traces int // how many traces the worker has to generate (only when duration==0) - marshal bool // whether the worker needs to marshal trace context via HTTP headers - debug bool // whether to set DEBUG flag on the spans - firehose bool // whether to set FIREHOSE flag on the spans - duration time.Duration // how long to run the test for (overrides `traces`) - pause time.Duration // how long to pause before finishing the trace - wg *sync.WaitGroup // notify when done - logger *zap.Logger + tracers []trace.Tracer + running *uint32 // pointer to shared flag that indicates it's time to stop the test + id int // worker id + Config + wg *sync.WaitGroup // notify when done + logger *zap.Logger + + // internal counters + traceNo int + attrValNo int } const ( fakeSpanDuration = 123 * time.Microsecond ) -func (w worker) simulateTraces() { - var i int +func (w *worker) simulateTraces() { for atomic.LoadUint32(w.running) == 1 { - w.simulateOneTrace() - i++ - if w.traces != 0 { - if i >= w.traces { + svcNo := w.traceNo % len(w.tracers) + w.simulateOneTrace(w.tracers[svcNo]) + w.traceNo++ + if w.Traces != 0 { + if w.traceNo >= w.Traces { break } } } - w.logger.Info(fmt.Sprintf("Worker %d generated %d traces", w.id, i)) + w.logger.Info(fmt.Sprintf("Worker %d generated %d traces", w.id, w.traceNo)) w.wg.Done() } -func (w worker) simulateOneTrace() { +func (w *worker) simulateOneTrace(tracer trace.Tracer) { ctx := context.Background() attrs := []attribute.KeyValue{ attribute.String("peer.service", "tracegen-server"), attribute.String("peer.host.ipv4", "1.1.1.1"), } - if w.debug { + if w.Debug { attrs = append(attrs, attribute.Bool("jaeger.debug", true)) } - if w.firehose { + if w.Firehose { attrs = append(attrs, attribute.Bool("jaeger.firehose", true)) } start := time.Now() - ctx, sp := w.tracer.Start( + ctx, parent := tracer.Start( ctx, "lets-go", - trace.WithSpanKind(trace.SpanKindClient), + trace.WithSpanKind(trace.SpanKindServer), trace.WithAttributes(attrs...), trace.WithTimestamp(start), ) + w.simulateChildSpans(ctx, start, tracer) - _, child := w.tracer.Start( - ctx, - "okey-dokey", - trace.WithSpanKind(trace.SpanKindServer), - ) - - time.Sleep(w.pause) - - if w.pause != 0 { - child.End() - sp.End() + if w.Pause != 0 { + parent.End() } else { - child.End( - trace.WithTimestamp(start.Add(fakeSpanDuration)), + totalDuration := time.Duration(w.ChildSpans) * fakeSpanDuration + parent.End( + trace.WithTimestamp(start.Add(totalDuration)), ) - sp.End( - trace.WithTimestamp(start.Add(fakeSpanDuration)), + } +} + +func (w *worker) simulateChildSpans(ctx context.Context, start time.Time, tracer trace.Tracer) { + for c := 0; c < w.ChildSpans; c++ { + var attrs []attribute.KeyValue + for a := 0; a < w.Attributes; a++ { + key := fmt.Sprintf("attr_%02d", a) + val := fmt.Sprintf("val_%02d", w.attrValNo) + w.attrValNo = (w.attrValNo + 1) % w.AttrValues + attrs = append(attrs, attribute.String(key, val)) + } + opts := []trace.SpanStartOption{ + trace.WithSpanKind(trace.SpanKindClient), + trace.WithAttributes(attrs...), + } + childStart := start.Add(time.Duration(c) * fakeSpanDuration) + if w.Pause == 0 { + opts = append(opts, trace.WithTimestamp(childStart)) + } + _, child := tracer.Start( + ctx, + fmt.Sprintf("child-span-%02d", c), + opts..., ) + if w.Pause != 0 { + time.Sleep(w.Pause) + child.End() + } else { + child.End( + trace.WithTimestamp(childStart.Add(fakeSpanDuration)), + ) + } } } diff --git a/pkg/cassandra/config/config.go b/pkg/cassandra/config/config.go index cea7ac0d6e9..e960af81490 100644 --- a/pkg/cassandra/config/config.go +++ b/pkg/cassandra/config/config.go @@ -163,6 +163,10 @@ func (c *Configuration) NewCluster(logger *zap.Logger) (*gocql.ClusterConfig, er return cluster, nil } +func (c *Configuration) Close() error { + return c.TLS.Close() +} + func (c *Configuration) String() string { return fmt.Sprintf("%+v", *c) } diff --git a/pkg/jtracer/jtracer.go b/pkg/jtracer/jtracer.go new file mode 100644 index 00000000000..d502767dc86 --- /dev/null +++ b/pkg/jtracer/jtracer.go @@ -0,0 +1,29 @@ +// Copyright (c) 2023 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jtracer + +import "github.com/opentracing/opentracing-go" + +type JTracer struct { + OT opentracing.Tracer +} + +func OT(t opentracing.Tracer) JTracer { + return JTracer{OT: t} +} + +func NoOp() JTracer { + return JTracer{OT: opentracing.NoopTracer{}} +} diff --git a/pkg/jtracer/jtracer_test.go b/pkg/jtracer/jtracer_test.go new file mode 100644 index 00000000000..e4bffa19937 --- /dev/null +++ b/pkg/jtracer/jtracer_test.go @@ -0,0 +1,31 @@ +// Copyright (c) 2023 The Jaeger Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package jtracer_test + +import ( + "testing" + + "github.com/opentracing/opentracing-go" + "github.com/stretchr/testify/assert" + + "github.com/jaegertracing/jaeger/pkg/jtracer" +) + +func TestOT(t *testing.T) { + mockTracer := opentracing.NoopTracer{} + jtracer := jtracer.OT(opentracing.NoopTracer{}) + + assert.Equal(t, mockTracer, jtracer.OT) +} diff --git a/pkg/kafka/auth/config.go b/pkg/kafka/auth/config.go index a96240a712c..8292792da3b 100644 --- a/pkg/kafka/auth/config.go +++ b/pkg/kafka/auth/config.go @@ -84,6 +84,7 @@ func (config *AuthenticationConfig) InitFromViper(configPrefix string, v *viper. config.Kerberos.Password = v.GetString(configPrefix + kerberosPrefix + suffixKerberosPassword) config.Kerberos.ConfigPath = v.GetString(configPrefix + kerberosPrefix + suffixKerberosConfig) config.Kerberos.KeyTabPath = v.GetString(configPrefix + kerberosPrefix + suffixKerberosKeyTab) + config.Kerberos.DisablePAFXFast = v.GetBool(configPrefix + kerberosPrefix + suffixKerberosDisablePAFXFAST) tlsClientConfig := tlscfg.ClientFlagsConfig{ Prefix: configPrefix, diff --git a/pkg/kafka/auth/kerberos.go b/pkg/kafka/auth/kerberos.go index 0414b4014fd..c8a83cdcdfb 100644 --- a/pkg/kafka/auth/kerberos.go +++ b/pkg/kafka/auth/kerberos.go @@ -20,13 +20,14 @@ import ( // KerberosConfig describes the configuration properties needed for Kerberos authentication with kafka consumer type KerberosConfig struct { - ServiceName string `mapstructure:"service_name"` - Realm string `mapstructure:"realm"` - UseKeyTab bool `mapstructure:"use_keytab"` - Username string `mapstructure:"username"` - Password string `mapstructure:"password" json:"-"` - ConfigPath string `mapstructure:"config_file"` - KeyTabPath string `mapstructure:"keytab_file"` + ServiceName string `mapstructure:"service_name"` + Realm string `mapstructure:"realm"` + UseKeyTab bool `mapstructure:"use_keytab"` + Username string `mapstructure:"username"` + Password string `mapstructure:"password" json:"-"` + ConfigPath string `mapstructure:"config_file"` + KeyTabPath string `mapstructure:"keytab_file"` + DisablePAFXFast bool `mapstructure:"disable_pa_fx_fast"` } func setKerberosConfiguration(config *KerberosConfig, saramaConfig *sarama.Config) { @@ -43,4 +44,5 @@ func setKerberosConfiguration(config *KerberosConfig, saramaConfig *sarama.Confi saramaConfig.Net.SASL.GSSAPI.Username = config.Username saramaConfig.Net.SASL.GSSAPI.Realm = config.Realm saramaConfig.Net.SASL.GSSAPI.ServiceName = config.ServiceName + saramaConfig.Net.SASL.GSSAPI.DisablePAFXFAST = config.DisablePAFXFast } diff --git a/pkg/kafka/auth/options.go b/pkg/kafka/auth/options.go index d3b2d860da1..5a484a13eca 100644 --- a/pkg/kafka/auth/options.go +++ b/pkg/kafka/auth/options.go @@ -26,22 +26,24 @@ const ( defaultAuthentication = none // Kerberos configuration options - kerberosPrefix = ".kerberos" - suffixKerberosServiceName = ".service-name" - suffixKerberosRealm = ".realm" - suffixKerberosUseKeyTab = ".use-keytab" - suffixKerberosUsername = ".username" - suffixKerberosPassword = ".password" - suffixKerberosConfig = ".config-file" - suffixKerberosKeyTab = ".keytab-file" + kerberosPrefix = ".kerberos" + suffixKerberosServiceName = ".service-name" + suffixKerberosRealm = ".realm" + suffixKerberosUseKeyTab = ".use-keytab" + suffixKerberosUsername = ".username" + suffixKerberosPassword = ".password" + suffixKerberosConfig = ".config-file" + suffixKerberosKeyTab = ".keytab-file" + suffixKerberosDisablePAFXFAST = ".disable-fast-negotiation" - defaultKerberosConfig = "/etc/krb5.conf" - defaultKerberosUseKeyTab = false - defaultKerberosServiceName = "kafka" - defaultKerberosRealm = "" - defaultKerberosPassword = "" - defaultKerberosUsername = "" - defaultKerberosKeyTab = "/etc/security/kafka.keytab" + defaultKerberosConfig = "/etc/krb5.conf" + defaultKerberosUseKeyTab = false + defaultKerberosServiceName = "kafka" + defaultKerberosRealm = "" + defaultKerberosPassword = "" + defaultKerberosUsername = "" + defaultKerberosKeyTab = "/etc/security/kafka.keytab" + defaultKerberosDisablePAFXFast = false plainTextPrefix = ".plaintext" suffixPlainTextUsername = ".username" @@ -82,6 +84,10 @@ func addKerberosFlags(configPrefix string, flagSet *flag.FlagSet) { configPrefix+kerberosPrefix+suffixKerberosKeyTab, defaultKerberosKeyTab, "Path to keytab file. i.e /etc/security/kafka.keytab") + flagSet.Bool( + configPrefix+kerberosPrefix+suffixKerberosDisablePAFXFAST, + defaultKerberosDisablePAFXFast, + "Disable FAST negotiation when not supported by KDC's like Active Directory. See https://github.com/jcmturner/gokrb5/blob/master/USAGE.md#active-directory-kdc-and-fast-negotiation.") } func addPlainTextFlags(configPrefix string, flagSet *flag.FlagSet) { diff --git a/scripts/rebuild-ui.sh b/scripts/rebuild-ui.sh index 05acafdd0cf..d395f1b3943 100644 --- a/scripts/rebuild-ui.sh +++ b/scripts/rebuild-ui.sh @@ -4,13 +4,13 @@ set -euxf -o pipefail cd jaeger-ui -LAST_TAG=$(git describe --abbrev=0 --tags 2>/dev/null) -BRANCH_HASH=$(git rev-parse HEAD) -LAST_TAG_HASH=$(git rev-parse $LAST_TAG) +LAST_TAG=$(git describe --tags --dirty 2>/dev/null) -if [[ "$BRANCH_HASH" == "$LAST_TAG_HASH" ]]; then - - if [[ "$LAST_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then +if [[ "$LAST_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + BRANCH_HASH=$(git rev-parse HEAD) + LAST_TAG_HASH=$(git rev-parse $LAST_TAG) + + if [[ "$BRANCH_HASH" == "$LAST_TAG_HASH" ]]; then temp_file=$(mktemp) trap "rm -f ${temp_file}" EXIT release_url="https://github.com/jaegertracing/jaeger-ui/releases/download/${LAST_TAG}/assets.tar.gz" @@ -20,16 +20,9 @@ if [[ "$BRANCH_HASH" == "$LAST_TAG_HASH" ]]; then rm -r -f packages/jaeger-ui/build/ tar -zxvf "$temp_file" packages/jaeger-ui/build/ exit 0 - fi fi - fi # do a regular full build yarn install --frozen-lockfile && cd packages/jaeger-ui && yarn build - - - - - From 93f31517e5ece7b8ea16780d7aae24629dd4a829 Mon Sep 17 00:00:00 2001 From: KevinSchneider Date: Thu, 29 Jun 2023 12:16:11 -0500 Subject: [PATCH 4/4] fix: remove deprecated es param when testing v8+ Signed-off-by: KevinSchneider --- scripts/es-integration-test.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/es-integration-test.sh b/scripts/es-integration-test.sh index ce3b4c30f0b..054c9a63b28 100755 --- a/scripts/es-integration-test.sh +++ b/scripts/es-integration-test.sh @@ -27,8 +27,13 @@ setup_es() { --env "http.host=0.0.0.0" --env "transport.host=127.0.0.1" --env "xpack.security.enabled=false" - --env "xpack.monitoring.enabled=false" ) + local major_version=${tag%%.*} + if (( major_version < 8 )); then + params+=( + --env "xpack.monitoring.enabled=false" + ) + fi local cid=$(docker run ${params[@]} ${image}:${tag}) echo ${cid} }