diff --git a/CHANGELOG.md b/CHANGELOG.md index d1bd80a71e7..c40e258e24c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,94 @@ copy from UI changelog +next release v1.65.0 / v2.2.0 (2025-01-08) +------------------------------- + +### Backend Changes + +#### ⛔ Breaking Changes + +* [sampling] inherit default per-operation strategies ([@yurishkuro](https://github.com/yurishkuro) in [#6441](https://github.com/jaegertracing/jaeger/pull/6441)) +* [query] enable trace adjusters in api_v2 and api_v3 handlers ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6423](https://github.com/jaegertracing/jaeger/pull/6423)) + +#### ✨ New Features + +* [feat] add time window for gettrace in span store interface ([@rim99](https://github.com/rim99) in [#6242](https://github.com/jaegertracing/jaeger/pull/6242)) + +#### 🐞 Bug fixes, Minor Improvements + +* Return errors from span processor creation ([@yurishkuro](https://github.com/yurishkuro) in [#6488](https://github.com/jaegertracing/jaeger/pull/6488)) +* Change collector's queue to use generics ([@yurishkuro](https://github.com/yurishkuro) in [#6486](https://github.com/jaegertracing/jaeger/pull/6486)) +* Refactor collector pipeline to allow v1/v2 data model ([@yurishkuro](https://github.com/yurishkuro) in [#6484](https://github.com/jaegertracing/jaeger/pull/6484)) +* [v2][storage] implement reverse adapter to translate v2 storage api to v1 ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6485](https://github.com/jaegertracing/jaeger/pull/6485)) +* [refractor] remove dependency on tlscfg.options ([@Saumya40-codes](https://github.com/Saumya40-codes) in [#6478](https://github.com/jaegertracing/jaeger/pull/6478)) +* [query] update v1 query service to check for adapter at construction ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6482](https://github.com/jaegertracing/jaeger/pull/6482)) +* [api_v3][query] change api_v3 http handler to use v2 query service ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6459](https://github.com/jaegertracing/jaeger/pull/6459)) +* [api_v3][query] change api_v3 grpc handler to use query service v2 ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6452](https://github.com/jaegertracing/jaeger/pull/6452)) +* [v2][storage] create v2 query service to operate on otlp data model ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6343](https://github.com/jaegertracing/jaeger/pull/6343)) +* Support sampling file reload interval ([@yurishkuro](https://github.com/yurishkuro) in [#6440](https://github.com/jaegertracing/jaeger/pull/6440)) +* [jptrace] add spaniter helper function ([@yurishkuro](https://github.com/yurishkuro) in [#6407](https://github.com/jaegertracing/jaeger/pull/6407)) +* [refactor][query] propagate `rawtraces` flag to query service ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6438](https://github.com/jaegertracing/jaeger/pull/6438)) +* [v1][adjuster] change v1 adjuster interface to not return error and modify trace in place ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6426](https://github.com/jaegertracing/jaeger/pull/6426)) +* [chore] move es/spanstore/dbmodel to internal directory ([@zzzk1](https://github.com/zzzk1) in [#6428](https://github.com/jaegertracing/jaeger/pull/6428)) +* [refactor] move model<->otlp translation from `jptrace` to `v1adapter` ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6414](https://github.com/jaegertracing/jaeger/pull/6414)) +* Enable udp ports in all-in-one ([@yurishkuro](https://github.com/yurishkuro) in [#6413](https://github.com/jaegertracing/jaeger/pull/6413)) +* [refactor] introduce helper for creating map of spans ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6406](https://github.com/jaegertracing/jaeger/pull/6406)) +* [fix] fix incorrect usage of iter package in aggregator ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6403](https://github.com/jaegertracing/jaeger/pull/6403)) +* [v2][query] implement helper to buffer sequence of traces ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6401](https://github.com/jaegertracing/jaeger/pull/6401)) +* [v2][adjuster] implement model to otlp translator with post processing ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6397](https://github.com/jaegertracing/jaeger/pull/6397)) +* [v2][adjuster] implement function to get standard adjusters to operate on otlp format ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6396](https://github.com/jaegertracing/jaeger/pull/6396)) +* [v2][adjuster] implement otlp to model translator with post processing ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6394](https://github.com/jaegertracing/jaeger/pull/6394)) +* [v2][adjuster] implement adjuster for correct timestamps for clockskew ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6392](https://github.com/jaegertracing/jaeger/pull/6392)) +* [v2][adjuster] implement adjuster for deduplicating spans ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6391](https://github.com/jaegertracing/jaeger/pull/6391)) +* Add optional time window for gettrace & searchtrace of http_handler ([@rim99](https://github.com/rim99) in [#6159](https://github.com/jaegertracing/jaeger/pull/6159)) +* [v2][adjuster] implement adjuster for sorting attributes and events ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6389](https://github.com/jaegertracing/jaeger/pull/6389)) +* Support extra custom query parameters in requests to prometheus backend ([@akstron](https://github.com/akstron) in [#6360](https://github.com/jaegertracing/jaeger/pull/6360)) +* [v2][adjuster] remove error return from adjuster interface ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6383](https://github.com/jaegertracing/jaeger/pull/6383)) +* [fix][query] filter out tracing for access to static ui assets ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6374](https://github.com/jaegertracing/jaeger/pull/6374)) +* [v2][adjuster] implement span id uniquifier adjuster to operate on otlp data model ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6367](https://github.com/jaegertracing/jaeger/pull/6367)) +* [api_v3] add time window for gettrace http_gateway ([@rim99](https://github.com/rim99) in [#6372](https://github.com/jaegertracing/jaeger/pull/6372)) +* [v2][adjuster] add warning to span links adjuster ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6381](https://github.com/jaegertracing/jaeger/pull/6381)) +* Feat: add time window for gettrace of anonymizer ([@rim99](https://github.com/rim99) in [#6368](https://github.com/jaegertracing/jaeger/pull/6368)) +* [v2][adjuster] rework adjuster interface and refactor adjusters to return implemented struct ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6362](https://github.com/jaegertracing/jaeger/pull/6362)) +* [v2][adjuster] implement otel attribute adjuster to operate on otlp data model ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6358](https://github.com/jaegertracing/jaeger/pull/6358)) +* Respond correctly to stream send error ([@yurishkuro](https://github.com/yurishkuro) in [#6357](https://github.com/jaegertracing/jaeger/pull/6357)) +* [v2][adjuster] implement ip attribute adjuster to operate on otlp data model ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6355](https://github.com/jaegertracing/jaeger/pull/6355)) +* Remove tls loading and replace with otel configtls ([@yurishkuro](https://github.com/yurishkuro) in [#6345](https://github.com/jaegertracing/jaeger/pull/6345)) +* [jaeger][v2] implement span links adjuster to operate on otlp data model ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6354](https://github.com/jaegertracing/jaeger/pull/6354)) +* [remote-storage] use otel helper instead of tlscfg ([@chahatsagarmain](https://github.com/chahatsagarmain) in [#6351](https://github.com/jaegertracing/jaeger/pull/6351)) +* Add go leak check for badgerstore, grpc and memstore e2e tests ([@Manik2708](https://github.com/Manik2708) in [#6347](https://github.com/jaegertracing/jaeger/pull/6347)) +* [v2][query] add interface for adjuster to operate on otlp data format ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6346](https://github.com/jaegertracing/jaeger/pull/6346)) + +#### 🚧 Experimental Features + +* Change storage_v2 gettrace to gettraces plural ([@yurishkuro](https://github.com/yurishkuro) in [#6361](https://github.com/jaegertracing/jaeger/pull/6361)) +* Change storage v2 api to use streaming ([@yurishkuro](https://github.com/yurishkuro) in [#6359](https://github.com/jaegertracing/jaeger/pull/6359)) + +#### 👷 CI Improvements + +* Upgrade storage integration tests: `dependencyreader` to v2 ([@zzzk1](https://github.com/zzzk1) in [#6477](https://github.com/jaegertracing/jaeger/pull/6477)) +* Move remaining util scripts ([@danish9039](https://github.com/danish9039) in [#6472](https://github.com/jaegertracing/jaeger/pull/6472)) +* Move lint scripts to scripts/lint ([@danish9039](https://github.com/danish9039) in [#6449](https://github.com/jaegertracing/jaeger/pull/6449)) +* Move util scripts to scripts/util ([@danish9039](https://github.com/danish9039) in [#6463](https://github.com/jaegertracing/jaeger/pull/6463)) +* Upgrade storage integration test: use `tracewriter` ([@ekefan](https://github.com/ekefan) in [#6437](https://github.com/jaegertracing/jaeger/pull/6437)) +* Move e2e scripts to scripts/e2e ([@danish9039](https://github.com/danish9039) in [#6448](https://github.com/jaegertracing/jaeger/pull/6448)) +* Move build scripts under scripts/build/ ([@danish9039](https://github.com/danish9039) in [#6446](https://github.com/jaegertracing/jaeger/pull/6446)) +* Replace apiv2 with apiv3 client in e2e tests ([@yurishkuro](https://github.com/yurishkuro) in [#6424](https://github.com/jaegertracing/jaeger/pull/6424)) +* Do not test with kafka 2.x ([@yurishkuro](https://github.com/yurishkuro) in [#6427](https://github.com/jaegertracing/jaeger/pull/6427)) +* Upgrade storage integration test to v2 trace reader ([@ekefan](https://github.com/ekefan) in [#6388](https://github.com/jaegertracing/jaeger/pull/6388)) +* Enhance kafka integration tests to support multiple kafka versions ([@zzzk1](https://github.com/zzzk1) in [#6400](https://github.com/jaegertracing/jaeger/pull/6400)) +* [fix] fix test expectations for translator to avoid depending on order ([@mahadzaryab1](https://github.com/mahadzaryab1) in [#6404](https://github.com/jaegertracing/jaeger/pull/6404)) + + +### 📊 UI Changes + +#### 🐞 Bug fixes, Minor Improvements + +* [clean-up]: remove deprecated plexus/directedgraph ([@hari45678](https://github.com/hari45678) in [#2548](https://github.com/jaegertracing/jaeger-ui/pull/2548)) +* [fix]: make plexus demo work again ([@hari45678](https://github.com/hari45678) in [#2538](https://github.com/jaegertracing/jaeger-ui/pull/2538)) +* Upgrade from raven-js to sentry/browser ([@avinpy-255](https://github.com/avinpy-255) in [#2509](https://github.com/jaegertracing/jaeger-ui/pull/2509)) + v1.64.0 / v2.1.0 (2024-12-06) ------------------------------- diff --git a/CONTRIBUTING_GUIDELINES.md b/CONTRIBUTING_GUIDELINES.md index e29bd5ed2f6..4e93d61c50b 100644 --- a/CONTRIBUTING_GUIDELINES.md +++ b/CONTRIBUTING_GUIDELINES.md @@ -46,17 +46,36 @@ If you are new to GitHub's contribution workflow, we recommend the following set * Go to the respective Jaeger repo on GitHub and create a fork using the button at the top. Select a destination org where you have write permissions (usually it is your personal "org"). * Clone the fork into your workspace. * (Recommended): register upstream repo as remote - * After you clone your forked repo, `git remote -v` will show `origin`, e.g. `origin git@github.com:{username}/jaeger.git` - * Add `upstream` remote: `git remote add upstream git@github.com:jaegertracing/jaeger.git` - * Fetch it: `git fetch upstream main` - * Repoint your main branch: `git branch --set-upstream-to=upstream/main main` + * After you clone your forked repo, running below command + ```bash + git remote -v + ``` + will show `origin`, e.g. `origin git@github.com:{username}/jaeger.git` + * Add `upstream` remote: + ```bash + git remote add upstream git@github.com:jaegertracing/jaeger.git + ``` + * Fetch it: + ```bash + git fetch upstream main + ``` + * Repoint your main branch: + ```bash + git branch --set-upstream-to=upstream/main main + ``` * With this setup, you will not need to keep your main branch in the fork in sync with the upstream repo. Once you're ready to make changes: * Create a new local branch (DO NOT make changes to `main`, it will cause CI errors). - * Commit your changes, making sure **each commit is signed**, e.g. `git commit -s ...` ([see below](#certificate-of-origin---sign-your-work)). + * Commit your changes, making sure **each commit is signed** ([see below](#certificate-of-origin---sign-your-work)): + ```bash + git commit -s -m "Your commit message" + ``` * You do not need to squash the commits, it will happen once the PR is merged into the official repo (but each individual commit must be signed). - * When satisfied, push the changes. Git will likely ask for upstream destination: `git push --set-upstream origin {branch-name}`. + * When satisfied, push the changes. Git will likely ask for upstream destination, so you push commits like this: + ```bash + git push --set-upstream origin {branch-name} + ``` * After you push, look for the output, it usually contains a URL to create a pull request. Each PR should have: diff --git a/RELEASE.md b/RELEASE.md index 9075e84481c..305541e0158 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -78,9 +78,9 @@ Here are the release managers for future versions with the tentative release dat | Version | Release Manager | Tentative release date | |---------|-----------------|------------------------| -| 1.65.0 | @mahadzaryab1 | 8 January 2025 | | 1.66.0 | @jkowall | 3 February 2025 | | 1.67.0 | @yurishkuro | 5 March 2025 | | 1.68.0 | @albertteoh | 5 April 2025 | | 1.69.0 | @pavolloffay | 7 May 2025 | | 1.70.0 | @joe-elliott | 5 June 2025 | +| 1.65.0 | @mahadzaryab1 | 2 July 2025 | diff --git a/cmd/all-in-one/main.go b/cmd/all-in-one/main.go index c0d0c43c119..7bf7879b145 100644 --- a/cmd/all-in-one/main.go +++ b/cmd/all-in-one/main.go @@ -157,7 +157,7 @@ by default uses only in-memory database.`, ServiceName: "jaeger-collector", Logger: logger, MetricsFactory: collectorMetricsFactory, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, SamplingAggregator: samplingAggregator, HealthCheck: svc.HC(), diff --git a/cmd/collector/app/collector.go b/cmd/collector/app/collector.go index a443f7e115e..f7e783e06aa 100644 --- a/cmd/collector/app/collector.go +++ b/cmd/collector/app/collector.go @@ -23,7 +23,7 @@ import ( "github.com/jaegertracing/jaeger/pkg/healthcheck" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" - "github.com/jaegertracing/jaeger/storage/spanstore" + "github.com/jaegertracing/jaeger/storage_v2/tracestore" ) const ( @@ -37,7 +37,7 @@ type Collector struct { serviceName string logger *zap.Logger metricsFactory metrics.Factory - spanWriter spanstore.Writer + traceWriter tracestore.Writer samplingProvider samplingstrategy.Provider samplingAggregator samplingstrategy.Aggregator hCheck *healthcheck.HealthCheck @@ -57,7 +57,7 @@ type CollectorParams struct { ServiceName string Logger *zap.Logger MetricsFactory metrics.Factory - SpanWriter spanstore.Writer + TraceWriter tracestore.Writer SamplingProvider samplingstrategy.Provider SamplingAggregator samplingstrategy.Aggregator HealthCheck *healthcheck.HealthCheck @@ -70,7 +70,7 @@ func New(params *CollectorParams) *Collector { serviceName: params.ServiceName, logger: params.Logger, metricsFactory: params.MetricsFactory, - spanWriter: params.SpanWriter, + traceWriter: params.TraceWriter, samplingProvider: params.SamplingProvider, samplingAggregator: params.SamplingAggregator, hCheck: params.HealthCheck, @@ -81,7 +81,7 @@ func New(params *CollectorParams) *Collector { // Start the component and underlying dependencies func (c *Collector) Start(options *flags.CollectorOptions) error { handlerBuilder := &SpanHandlerBuilder{ - SpanWriter: c.spanWriter, + TraceWriter: c.traceWriter, CollectorOpts: options, Logger: c.logger, MetricsFactory: c.metricsFactory, diff --git a/cmd/collector/app/collector_test.go b/cmd/collector/app/collector_test.go index 4e42109a2e0..c5ce962fa68 100644 --- a/cmd/collector/app/collector_test.go +++ b/cmd/collector/app/collector_test.go @@ -26,6 +26,7 @@ import ( "github.com/jaegertracing/jaeger/pkg/healthcheck" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/proto-gen/api_v2" + "github.com/jaegertracing/jaeger/storage_v2/v1adapter" ) var _ (io.Closer) = (*Collector)(nil) @@ -116,7 +117,7 @@ func TestNewCollector(t *testing.T) { ServiceName: "collector", Logger: logger, MetricsFactory: baseMetrics, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, HealthCheck: hc, TenancyMgr: tm, @@ -143,7 +144,7 @@ func TestCollector_StartErrors(t *testing.T) { ServiceName: "collector", Logger: logger, MetricsFactory: baseMetrics, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, HealthCheck: hc, TenancyMgr: tm, @@ -201,7 +202,7 @@ func TestCollector_PublishOpts(t *testing.T) { ServiceName: "collector", Logger: logger, MetricsFactory: metricsFactory, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, HealthCheck: hc, TenancyMgr: tm, @@ -232,7 +233,7 @@ func TestAggregator(t *testing.T) { ServiceName: "collector", Logger: logger, MetricsFactory: baseMetrics, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, HealthCheck: hc, SamplingAggregator: agg, @@ -262,7 +263,7 @@ func TestAggregator(t *testing.T) { }, }, } - _, err := c.spanProcessor.ProcessSpans(processor.SpansV1{ + _, err := c.spanProcessor.ProcessSpans(context.Background(), processor.SpansV1{ Spans: spans, Details: processor.Details{ SpanFormat: processor.JaegerSpanFormat, diff --git a/cmd/collector/app/flags/flags.go b/cmd/collector/app/flags/flags.go index 1a086752c80..30af64b7c3d 100644 --- a/cmd/collector/app/flags/flags.go +++ b/cmd/collector/app/flags/flags.go @@ -77,15 +77,13 @@ var otlpServerFlagsCfg = struct { GRPC: serverFlagsConfig{ prefix: "collector.otlp.grpc", tls: tlscfg.ServerFlagsConfig{ - Prefix: "collector.otlp.grpc", - EnableCertReloadInterval: true, + Prefix: "collector.otlp.grpc", }, }, HTTP: serverFlagsConfig{ prefix: "collector.otlp.http", tls: tlscfg.ServerFlagsConfig{ - Prefix: "collector.otlp.http", - EnableCertReloadInterval: true, + Prefix: "collector.otlp.http", }, corsCfg: corscfg.Flags{ Prefix: "collector.otlp.http", diff --git a/cmd/collector/app/flags/flags_test.go b/cmd/collector/app/flags/flags_test.go index 39727d1bce8..003ce66487e 100644 --- a/cmd/collector/app/flags/flags_test.go +++ b/cmd/collector/app/flags/flags_test.go @@ -70,34 +70,6 @@ func TestCollectorOptionsWithFailedTLSFlags(t *testing.T) { } } -func TestCollectorOptionsWithFlags_CheckTLSReloadInterval(t *testing.T) { - prefixes := []string{ - "--collector.http", - "--collector.grpc", - "--collector.zipkin", - "--collector.otlp.http", - "--collector.otlp.grpc", - } - otlpPrefixes := map[string]struct{}{ - "--collector.otlp.http": {}, - "--collector.otlp.grpc": {}, - } - for _, prefix := range prefixes { - t.Run(prefix, func(t *testing.T) { - _, command := config.Viperize(AddFlags) - err := command.ParseFlags([]string{ - prefix + ".tls.enabled=true", - prefix + ".tls.reload-interval=24h", - }) - if _, ok := otlpPrefixes[prefix]; !ok { - assert.ErrorContains(t, err, "unknown flag") - } else { - require.NoError(t, err) - } - }) - } -} - func TestCollectorOptionsWithFlags_CheckMaxReceiveMessageLength(t *testing.T) { c := &CollectorOptions{} v, command := config.Viperize(AddFlags) diff --git a/cmd/collector/app/handler/grpc_handler.go b/cmd/collector/app/handler/grpc_handler.go index f88343a3de1..4f63f3e0b83 100644 --- a/cmd/collector/app/handler/grpc_handler.go +++ b/cmd/collector/app/handler/grpc_handler.go @@ -75,7 +75,7 @@ func (c *batchConsumer) consume(ctx context.Context, batch *model.Batch) error { span.Process = batch.Process } } - _, err = c.spanProcessor.ProcessSpans(processor.SpansV1{ + _, err = c.spanProcessor.ProcessSpans(ctx, processor.SpansV1{ Spans: batch.Spans, Details: processor.Details{ InboundTransport: c.spanOptions.InboundTransport, diff --git a/cmd/collector/app/handler/grpc_handler_test.go b/cmd/collector/app/handler/grpc_handler_test.go index e7940e916ed..ad13e914730 100644 --- a/cmd/collector/app/handler/grpc_handler_test.go +++ b/cmd/collector/app/handler/grpc_handler_test.go @@ -25,6 +25,8 @@ import ( "github.com/jaegertracing/jaeger/proto-gen/api_v2" ) +var _ processor.SpanProcessor = (*mockSpanProcessor)(nil) + type mockSpanProcessor struct { expectedError error mux sync.Mutex @@ -34,7 +36,7 @@ type mockSpanProcessor struct { spanFormat processor.SpanFormat } -func (p *mockSpanProcessor) ProcessSpans(batch processor.Batch) ([]bool, error) { +func (p *mockSpanProcessor) ProcessSpans(_ context.Context, batch processor.Batch) ([]bool, error) { p.mux.Lock() defer p.mux.Unlock() batch.GetSpans(func(spans []*model.Span) { diff --git a/cmd/collector/app/handler/http_thrift_handler.go b/cmd/collector/app/handler/http_thrift_handler.go index 28b65e51e27..40d6fbcf494 100644 --- a/cmd/collector/app/handler/http_thrift_handler.go +++ b/cmd/collector/app/handler/http_thrift_handler.go @@ -75,7 +75,7 @@ func (aH *APIHandler) SaveSpan(w http.ResponseWriter, r *http.Request) { } batches := []*tJaeger.Batch{batch} opts := SubmitBatchOptions{InboundTransport: processor.HTTPTransport} - if _, err = aH.jaegerBatchesHandler.SubmitBatches(batches, opts); err != nil { + if _, err = aH.jaegerBatchesHandler.SubmitBatches(r.Context(), batches, opts); err != nil { http.Error(w, fmt.Sprintf("Cannot submit Jaeger batch: %v", err), http.StatusInternalServerError) return } diff --git a/cmd/collector/app/handler/http_thrift_handler_test.go b/cmd/collector/app/handler/http_thrift_handler_test.go index 08fa4d516dc..743a9af5f73 100644 --- a/cmd/collector/app/handler/http_thrift_handler_test.go +++ b/cmd/collector/app/handler/http_thrift_handler_test.go @@ -25,7 +25,10 @@ import ( "github.com/jaegertracing/jaeger/thrift-gen/jaeger" ) -var httpClient = &http.Client{Timeout: 2 * time.Second} +var ( + httpClient = &http.Client{Timeout: 2 * time.Second} + _ JaegerBatchesHandler = (*mockJaegerHandler)(nil) +) type mockJaegerHandler struct { err error @@ -33,7 +36,7 @@ type mockJaegerHandler struct { batches []*jaeger.Batch } -func (p *mockJaegerHandler) SubmitBatches(batches []*jaeger.Batch, _ SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) { +func (p *mockJaegerHandler) SubmitBatches(_ context.Context, batches []*jaeger.Batch, _ SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) { p.mux.Lock() defer p.mux.Unlock() p.batches = append(p.batches, batches...) diff --git a/cmd/collector/app/handler/thrift_span_handler.go b/cmd/collector/app/handler/thrift_span_handler.go index 24f4061d1c2..62fe3fdc05a 100644 --- a/cmd/collector/app/handler/thrift_span_handler.go +++ b/cmd/collector/app/handler/thrift_span_handler.go @@ -5,6 +5,8 @@ package handler import ( + "context" + "go.uber.org/zap" "github.com/jaegertracing/jaeger/cmd/collector/app/processor" @@ -24,13 +26,13 @@ type SubmitBatchOptions struct { // ZipkinSpansHandler consumes and handles zipkin spans type ZipkinSpansHandler interface { // SubmitZipkinBatch records a batch of spans in Zipkin Thrift format - SubmitZipkinBatch(spans []*zipkincore.Span, options SubmitBatchOptions) ([]*zipkincore.Response, error) + SubmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span, options SubmitBatchOptions) ([]*zipkincore.Response, error) } // JaegerBatchesHandler consumes and handles Jaeger batches type JaegerBatchesHandler interface { // SubmitBatches records a batch of spans in Jaeger Thrift format - SubmitBatches(batches []*jaeger.Batch, options SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) + SubmitBatches(ctx context.Context, batches []*jaeger.Batch, options SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) } type jaegerBatchesHandler struct { @@ -46,7 +48,7 @@ func NewJaegerSpanHandler(logger *zap.Logger, modelProcessor processor.SpanProce } } -func (jbh *jaegerBatchesHandler) SubmitBatches(batches []*jaeger.Batch, options SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) { +func (jbh *jaegerBatchesHandler) SubmitBatches(ctx context.Context, batches []*jaeger.Batch, options SubmitBatchOptions) ([]*jaeger.BatchSubmitResponse, error) { responses := make([]*jaeger.BatchSubmitResponse, 0, len(batches)) for _, batch := range batches { mSpans := make([]*model.Span, 0, len(batch.Spans)) @@ -54,7 +56,7 @@ func (jbh *jaegerBatchesHandler) SubmitBatches(batches []*jaeger.Batch, options mSpan := jConv.ToDomainSpan(span, batch.Process) mSpans = append(mSpans, mSpan) } - oks, err := jbh.modelProcessor.ProcessSpans(processor.SpansV1{ + oks, err := jbh.modelProcessor.ProcessSpans(ctx, processor.SpansV1{ Spans: mSpans, Details: processor.Details{ InboundTransport: options.InboundTransport, @@ -98,7 +100,7 @@ func NewZipkinSpanHandler(logger *zap.Logger, modelHandler processor.SpanProcess } // SubmitZipkinBatch records a batch of spans already in Zipkin Thrift format. -func (h *zipkinSpanHandler) SubmitZipkinBatch(spans []*zipkincore.Span, options SubmitBatchOptions) ([]*zipkincore.Response, error) { +func (h *zipkinSpanHandler) SubmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span, options SubmitBatchOptions) ([]*zipkincore.Response, error) { mSpans := make([]*model.Span, 0, len(spans)) convCount := make([]int, len(spans)) for i, span := range spans { @@ -108,7 +110,7 @@ func (h *zipkinSpanHandler) SubmitZipkinBatch(spans []*zipkincore.Span, options convCount[i] = len(converted) mSpans = append(mSpans, converted...) } - bools, err := h.modelProcessor.ProcessSpans(processor.SpansV1{ + bools, err := h.modelProcessor.ProcessSpans(ctx, processor.SpansV1{ Spans: mSpans, Details: processor.Details{ InboundTransport: options.InboundTransport, diff --git a/cmd/collector/app/handler/thrift_span_handler_test.go b/cmd/collector/app/handler/thrift_span_handler_test.go index 16e5f5fe7c2..37f268947c9 100644 --- a/cmd/collector/app/handler/thrift_span_handler_test.go +++ b/cmd/collector/app/handler/thrift_span_handler_test.go @@ -5,6 +5,7 @@ package handler import ( + "context" "encoding/json" "errors" "os" @@ -36,7 +37,7 @@ func TestJaegerSpanHandler(t *testing.T) { for _, tc := range testChunks { logger := zap.NewNop() h := NewJaegerSpanHandler(logger, &shouldIErrorProcessor{tc.expectedErr != nil}) - res, err := h.SubmitBatches([]*jaeger.Batch{ + res, err := h.SubmitBatches(context.Background(), []*jaeger.Batch{ { Process: &jaeger.Process{ServiceName: "someServiceName"}, Spans: []*jaeger.Span{{SpanId: 21345}}, @@ -57,9 +58,12 @@ type shouldIErrorProcessor struct { shouldError bool } -var errTestError = errors.New("Whoops") +var ( + _ processor.SpanProcessor = (*shouldIErrorProcessor)(nil) + errTestError = errors.New("Whoops") +) -func (s *shouldIErrorProcessor) ProcessSpans(batch processor.Batch) ([]bool, error) { +func (s *shouldIErrorProcessor) ProcessSpans(_ context.Context, batch processor.Batch) ([]bool, error) { if s.shouldError { return nil, errTestError } @@ -121,7 +125,7 @@ func TestZipkinSpanHandler(t *testing.T) { }, } } - res, err := h.SubmitZipkinBatch(spans, SubmitBatchOptions{}) + res, err := h.SubmitZipkinBatch(context.Background(), spans, SubmitBatchOptions{}) if tc.expectedErr != nil { assert.Nil(t, res) assert.Equal(t, tc.expectedErr, err) diff --git a/cmd/collector/app/metrics.go b/cmd/collector/app/metrics.go index 455a577aa0a..85b7912d3f4 100644 --- a/cmd/collector/app/metrics.go +++ b/cmd/collector/app/metrics.go @@ -8,10 +8,14 @@ import ( "strings" "sync" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/ptrace" + "github.com/jaegertracing/jaeger/cmd/collector/app/processor" "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/normalizer" + "github.com/jaegertracing/jaeger/pkg/otelsemconv" ) const ( @@ -24,10 +28,10 @@ const ( // samplerTypeKey is the name of the metric tag showing sampler type samplerTypeKey = "sampler_type" - // // types of samplers: const, probabilistic, ratelimiting, lowerbound - // numOfSamplerTypes = 4 - concatenation = "$_$" + + // unknownServiceName is used when a span has no service name + unknownServiceName = "__unknown" ) var otherServicesSamplers map[model.SamplerType]string = initOtherServicesSamplers() @@ -224,12 +228,12 @@ func (m *SpanProcessorMetrics) GetCountsForFormat(spanFormat processor.SpanForma return t } -// reportServiceNameForSpan determines the name of the service that emitted +// ForSpanV1 determines the name of the service that emitted // the span and reports a counter stat. -func (m metricsBySvc) ReportServiceNameForSpan(span *model.Span) { +func (m metricsBySvc) ForSpanV1(span *model.Span) { var serviceName string if nil == span.Process || len(span.Process.ServiceName) == 0 { - serviceName = "__unknown" + serviceName = unknownServiceName } else { serviceName = span.Process.ServiceName } @@ -241,6 +245,20 @@ func (m metricsBySvc) ReportServiceNameForSpan(span *model.Span) { } } +// ForSpanV2 determines the name of the service that emitted +// the span and reports a counter stat. +func (m metricsBySvc) ForSpanV2(resource pcommon.Resource, span ptrace.Span) { + serviceName := unknownServiceName + if v, ok := resource.Attributes().Get(string(otelsemconv.ServiceNameKey)); ok { + serviceName = v.AsString() + } + + m.countSpansByServiceName(serviceName, false) + if span.ParentSpanID().IsEmpty() { + m.countTracesByServiceName(serviceName, false, model.SamplerTypeUnrecognized) + } +} + // countSpansByServiceName counts how many spans are received per service. func (m metricsBySvc) countSpansByServiceName(serviceName string, isDebug bool) { m.spans.countByServiceName(serviceName, isDebug) diff --git a/cmd/collector/app/metrics_test.go b/cmd/collector/app/metrics_test.go index d0d23a5a7f2..12c16dc76c3 100644 --- a/cmd/collector/app/metrics_test.go +++ b/cmd/collector/app/metrics_test.go @@ -9,6 +9,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "go.opentelemetry.io/collector/pdata/ptrace" "github.com/jaegertracing/jaeger/cmd/collector/app/processor" "github.com/jaegertracing/jaeger/internal/metricstest" @@ -29,7 +30,7 @@ func TestProcessorMetrics(t *testing.T) { grpcChannelFormat := spm.GetCountsForFormat(processor.JaegerSpanFormat, processor.GRPCTransport) assert.NotNil(t, grpcChannelFormat) - grpcChannelFormat.ReceivedBySvc.ReportServiceNameForSpan(&model.Span{ + grpcChannelFormat.ReceivedBySvc.ForSpanV1(&model.Span{ Process: &model.Process{}, }) mSpan := model.Span{ @@ -37,16 +38,26 @@ func TestProcessorMetrics(t *testing.T) { ServiceName: "fry", }, } - grpcChannelFormat.ReceivedBySvc.ReportServiceNameForSpan(&mSpan) + grpcChannelFormat.ReceivedBySvc.ForSpanV1(&mSpan) mSpan.Flags.SetDebug() - grpcChannelFormat.ReceivedBySvc.ReportServiceNameForSpan(&mSpan) + grpcChannelFormat.ReceivedBySvc.ForSpanV1(&mSpan) mSpan.ReplaceParentID(1234) - grpcChannelFormat.ReceivedBySvc.ReportServiceNameForSpan(&mSpan) + grpcChannelFormat.ReceivedBySvc.ForSpanV1(&mSpan) + + pd := ptrace.NewTraces() + rs := pd.ResourceSpans().AppendEmpty() + resource := rs.Resource() + resource.Attributes().PutStr("service.name", "fry") + sp := rs.ScopeSpans().AppendEmpty().Spans().AppendEmpty() + grpcChannelFormat.ReceivedBySvc.ForSpanV2(resource, sp) + sp.SetParentSpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8}) + grpcChannelFormat.ReceivedBySvc.ForSpanV2(resource, sp) + counters, gauges := baseMetrics.Backend.Snapshot() - assert.EqualValues(t, 1, counters["service.spans.received|debug=false|format=jaeger|svc=fry|transport=grpc"]) + assert.EqualValues(t, 3, counters["service.spans.received|debug=false|format=jaeger|svc=fry|transport=grpc"]) assert.EqualValues(t, 2, counters["service.spans.received|debug=true|format=jaeger|svc=fry|transport=grpc"]) - assert.EqualValues(t, 1, counters["service.traces.received|debug=false|format=jaeger|sampler_type=unrecognized|svc=fry|transport=grpc"]) + assert.EqualValues(t, 2, counters["service.traces.received|debug=false|format=jaeger|sampler_type=unrecognized|svc=fry|transport=grpc"]) assert.EqualValues(t, 1, counters["service.traces.received|debug=true|format=jaeger|sampler_type=unrecognized|svc=fry|transport=grpc"]) assert.Empty(t, gauges) } diff --git a/cmd/collector/app/processor/processor.go b/cmd/collector/app/processor/processor.go index 363a27d20de..1ec0ae90b32 100644 --- a/cmd/collector/app/processor/processor.go +++ b/cmd/collector/app/processor/processor.go @@ -4,6 +4,7 @@ package processor import ( + "context" "io" "go.opentelemetry.io/collector/pdata/ptrace" @@ -29,7 +30,7 @@ type Batch interface { // SpanProcessor handles spans type SpanProcessor interface { // ProcessSpans processes spans and return with either a list of true/false success or an error - ProcessSpans(spans Batch) ([]bool, error) + ProcessSpans(ctx context.Context, spans Batch) ([]bool, error) io.Closer } diff --git a/cmd/collector/app/sanitizer/service_name_sanitizer.go b/cmd/collector/app/sanitizer/service_name_sanitizer.go index dcffe0c6215..3c7950e3c3d 100644 --- a/cmd/collector/app/sanitizer/service_name_sanitizer.go +++ b/cmd/collector/app/sanitizer/service_name_sanitizer.go @@ -15,7 +15,7 @@ func NewServiceNameSanitizer(c cache.Cache) SanitizeSpan { return sanitizer.Sanitize } -// ServiceNameSanitizer sanitizes the service names in span annotations given a source of truth alias to service cache. +// serviceNameSanitizer sanitizes the service names in span annotations given a source of truth alias to service cache. type serviceNameSanitizer struct { cache cache.Cache } diff --git a/cmd/collector/app/server/grpc.go b/cmd/collector/app/server/grpc.go index dbdedce6f26..8e10e78bf6d 100644 --- a/cmd/collector/app/server/grpc.go +++ b/cmd/collector/app/server/grpc.go @@ -17,8 +17,8 @@ import ( "google.golang.org/grpc/reflection" "github.com/jaegertracing/jaeger/cmd/collector/app/handler" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling" "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" + samplinggrpc "github.com/jaegertracing/jaeger/internal/sampling/grpc" "github.com/jaegertracing/jaeger/pkg/telemetry" "github.com/jaegertracing/jaeger/proto-gen/api_v2" ) @@ -65,7 +65,7 @@ func serveGRPC(server *grpc.Server, listener net.Listener, params *GRPCServerPar healthServer := health.NewServer() api_v2.RegisterCollectorServiceServer(server, params.Handler) - api_v2.RegisterSamplingManagerServer(server, sampling.NewGRPCHandler(params.SamplingProvider)) + api_v2.RegisterSamplingManagerServer(server, samplinggrpc.NewHandler(params.SamplingProvider)) healthServer.SetServingStatus("jaeger.api_v2.CollectorService", grpc_health_v1.HealthCheckResponse_SERVING) healthServer.SetServingStatus("jaeger.api_v2.SamplingManager", grpc_health_v1.HealthCheckResponse_SERVING) diff --git a/cmd/collector/app/server/test.go b/cmd/collector/app/server/test.go index a047191f6b1..115c78821f7 100644 --- a/cmd/collector/app/server/test.go +++ b/cmd/collector/app/server/test.go @@ -26,6 +26,6 @@ func (*mockSpanProcessor) Close() error { return nil } -func (*mockSpanProcessor) ProcessSpans(_ processor.Batch) ([]bool, error) { +func (*mockSpanProcessor) ProcessSpans(_ context.Context, _ processor.Batch) ([]bool, error) { return []bool{}, nil } diff --git a/cmd/collector/app/span_handler_builder.go b/cmd/collector/app/span_handler_builder.go index e7d690288aa..9bcb9fc7d26 100644 --- a/cmd/collector/app/span_handler_builder.go +++ b/cmd/collector/app/span_handler_builder.go @@ -16,12 +16,12 @@ import ( "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" - "github.com/jaegertracing/jaeger/storage/spanstore" + "github.com/jaegertracing/jaeger/storage_v2/tracestore" ) // SpanHandlerBuilder holds configuration required for handlers type SpanHandlerBuilder struct { - SpanWriter spanstore.Writer + TraceWriter tracestore.Writer CollectorOpts *flags.CollectorOptions Logger *zap.Logger MetricsFactory metrics.Factory @@ -42,7 +42,7 @@ func (b *SpanHandlerBuilder) BuildSpanProcessor(additional ...ProcessSpan) (proc hostMetrics := svcMetrics.Namespace(metrics.NSOptions{Tags: map[string]string{"host": hostname}}) return NewSpanProcessor( - b.SpanWriter, + b.TraceWriter, additional, Options.ServiceMetrics(svcMetrics), Options.HostMetrics(hostMetrics), diff --git a/cmd/collector/app/span_handler_builder_test.go b/cmd/collector/app/span_handler_builder_test.go index 70cdc08fd87..4cf0e1c4af0 100644 --- a/cmd/collector/app/span_handler_builder_test.go +++ b/cmd/collector/app/span_handler_builder_test.go @@ -17,6 +17,7 @@ import ( "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/plugin/storage/memory" + "github.com/jaegertracing/jaeger/storage_v2/v1adapter" ) func TestNewSpanHandlerBuilder(t *testing.T) { @@ -29,7 +30,7 @@ func TestNewSpanHandlerBuilder(t *testing.T) { spanWriter := memory.NewStore() builder := &SpanHandlerBuilder{ - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), CollectorOpts: cOpts, TenancyMgr: &tenancy.Manager{}, } @@ -37,7 +38,7 @@ func TestNewSpanHandlerBuilder(t *testing.T) { assert.NotNil(t, builder.metricsFactory()) builder = &SpanHandlerBuilder{ - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), CollectorOpts: cOpts, Logger: zap.NewNop(), MetricsFactory: metrics.NullFactory, diff --git a/cmd/collector/app/span_processor.go b/cmd/collector/app/span_processor.go index e040301dde2..83811f68fe6 100644 --- a/cmd/collector/app/span_processor.go +++ b/cmd/collector/app/span_processor.go @@ -6,19 +6,26 @@ package app import ( "context" + "fmt" "sync" "sync/atomic" "time" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterhelper" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "github.com/jaegertracing/jaeger/cmd/collector/app/processor" "github.com/jaegertracing/jaeger/cmd/collector/app/sanitizer" + sanitizerv2 "github.com/jaegertracing/jaeger/cmd/jaeger/sanitizer" + "github.com/jaegertracing/jaeger/internal/jptrace" "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/pkg/queue" + "github.com/jaegertracing/jaeger/pkg/telemetry" "github.com/jaegertracing/jaeger/pkg/tenancy" - "github.com/jaegertracing/jaeger/storage/spanstore" + "github.com/jaegertracing/jaeger/storage_v2/tracestore" + "github.com/jaegertracing/jaeger/storage_v2/v1adapter" ) const ( @@ -29,16 +36,20 @@ const ( minRequiredChange = 1.2 ) +var _ processor.SpanProcessor = (*spanProcessor)(nil) + type spanProcessor struct { queue *queue.BoundedQueue[queueItem] + otelExporter exporter.Traces queueResizeMu sync.Mutex metrics *SpanProcessorMetrics + telset telemetry.Settings preProcessSpans ProcessSpans filterSpan FilterSpan // filter is called before the sanitizer but after preProcessSpans sanitizer sanitizer.SanitizeSpan // sanitizer is called before processSpan processSpan ProcessSpan logger *zap.Logger - spanWriter spanstore.Writer + traceWriter tracestore.Writer reportBusy bool numWorkers int collectorTags map[string]string @@ -57,19 +68,24 @@ type queueItem struct { // NewSpanProcessor returns a SpanProcessor that preProcesses, filters, queues, sanitizes, and processes spans. func NewSpanProcessor( - spanWriter spanstore.Writer, + traceWriter tracestore.Writer, additional []ProcessSpan, opts ...Option, ) (processor.SpanProcessor, error) { - sp, err := newSpanProcessor(spanWriter, additional, opts...) + sp, err := newSpanProcessor(traceWriter, additional, opts...) if err != nil { - return nil, err + return nil, fmt.Errorf("could not create span processor: %w", err) } sp.queue.StartConsumers(sp.numWorkers, func(item queueItem) { sp.processItemFromQueue(item) }) + err = sp.otelExporter.Start(context.Background(), sp.telset.Host) + if err != nil { + return nil, fmt.Errorf("could not start exporter: %w", err) + } + sp.background(1*time.Second, sp.updateGauges) if sp.dynQueueSizeMemory > 0 { @@ -79,7 +95,7 @@ func NewSpanProcessor( return sp, nil } -func newSpanProcessor(spanWriter spanstore.Writer, additional []ProcessSpan, opts ...Option) (*spanProcessor, error) { +func newSpanProcessor(traceWriter tracestore.Writer, additional []ProcessSpan, opts ...Option) (*spanProcessor, error) { options := Options.apply(opts...) handlerMetrics := NewSpanProcessorMetrics( options.serviceMetrics, @@ -101,13 +117,14 @@ func newSpanProcessor(spanWriter spanstore.Writer, additional []ProcessSpan, opt sp := spanProcessor{ queue: boundedQueue, metrics: handlerMetrics, + telset: telemetry.NoopSettings(), // TODO get real settings logger: options.logger, preProcessSpans: options.preProcessSpans, filterSpan: options.spanFilter, sanitizer: sanitizer.NewChainedSanitizer(sanitizers...), reportBusy: options.reportBusy, numWorkers: options.numWorkers, - spanWriter: spanWriter, + traceWriter: traceWriter, collectorTags: options.collectorTags, stopCh: make(chan struct{}), dynQueueSizeMemory: options.dynQueueSizeMemory, @@ -121,27 +138,75 @@ func newSpanProcessor(spanWriter spanstore.Writer, additional []ProcessSpan, opt zap.Uint("queue-size-warmup", options.dynQueueSizeWarmup)) } if options.dynQueueSizeMemory > 0 || options.spanSizeMetricsEnabled { - // add to processSpanFuncs - processSpanFuncs = append(processSpanFuncs, sp.countSpan) + processSpanFuncs = append(processSpanFuncs, sp.countSpansInQueue) } + sp.processSpan = ChainedProcessSpan(append(processSpanFuncs, additional...)...) + + otelExporter, err := exporterhelper.NewTraces( + context.Background(), + exporter.Settings{ + TelemetrySettings: sp.telset.ToOtelComponent(), + }, + struct{}{}, // exporterhelper requires not-nil config, but then ignores it + sp.pushTraces, + exporterhelper.WithQueue(exporterhelper.NewDefaultQueueConfig()), + // exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}), + // exporterhelper.WithTimeout(oCfg.TimeoutConfig), + // exporterhelper.WithRetry(oCfg.RetryConfig), + // exporterhelper.WithBatcher(oCfg.BatcherConfig), + // exporterhelper.WithStart(oce.start), + // exporterhelper.WithShutdown(oce.shutdown), + ) + if err != nil { + return nil, fmt.Errorf("could not create exporterhelper: %w", err) + } + sp.otelExporter = otelExporter - processSpanFuncs = append(processSpanFuncs, additional...) - - sp.processSpan = ChainedProcessSpan(processSpanFuncs...) return &sp, nil } func (sp *spanProcessor) Close() error { close(sp.stopCh) sp.queue.Stop() - + sp.otelExporter.Shutdown(context.Background()) return nil } +// pushTraces is called by exporterhelper's concurrent queue consumers. +func (sp *spanProcessor) pushTraces(ctx context.Context, td ptrace.Traces) error { + td = sanitizerv2.Sanitize(td) + + if len(sp.collectorTags) > 0 { + for i := 0; i < td.ResourceSpans().Len(); i++ { + resource := td.ResourceSpans().At(i).Resource() + for k, v := range sp.collectorTags { + if _, ok := resource.Attributes().Get(k); ok { + continue // don't override existing keys + } + resource.Attributes().PutStr(k, v) + } + } + } + + err := sp.traceWriter.WriteTraces(ctx, td) + + sp.metrics.BatchSize.Update(int64(td.SpanCount())) + jptrace.SpanIter(td)(func(i jptrace.SpanIterPos, span ptrace.Span) bool { + if err != nil { + sp.metrics.SavedErrBySvc.ForSpanV2(i.Resource.Resource(), span) + } else { + sp.metrics.SavedOkBySvc.ForSpanV2(i.Resource.Resource(), span) + } + return true + }) + + return err +} + func (sp *spanProcessor) saveSpan(span *model.Span, tenant string) { - if nil == span.Process { + if span.Process == nil { sp.logger.Error("process is empty for the span") - sp.metrics.SavedErrBySvc.ReportServiceNameForSpan(span) + sp.metrics.SavedErrBySvc.ForSpanV1(span) return } @@ -150,31 +215,59 @@ func (sp *spanProcessor) saveSpan(span *model.Span, tenant string) { // the inbound Context, as it may be cancelled by the time we reach this point, // so we need to start a new Context. ctx := tenancy.WithTenant(context.Background(), tenant) - if err := sp.spanWriter.WriteSpan(ctx, span); err != nil { + if err := sp.writeSpan(ctx, span); err != nil { sp.logger.Error("Failed to save span", zap.Error(err)) - sp.metrics.SavedErrBySvc.ReportServiceNameForSpan(span) + sp.metrics.SavedErrBySvc.ForSpanV1(span) } else { sp.logger.Debug("Span written to the storage by the collector", zap.Stringer("trace-id", span.TraceID), zap.Stringer("span-id", span.SpanID)) - sp.metrics.SavedOkBySvc.ReportServiceNameForSpan(span) + sp.metrics.SavedOkBySvc.ForSpanV1(span) } sp.metrics.SaveLatency.Record(time.Since(startTime)) } -func (sp *spanProcessor) countSpan(span *model.Span, _ string /* tenant */) { +func (sp *spanProcessor) writeSpan(ctx context.Context, span *model.Span) error { + spanWriter, err := v1adapter.GetV1Writer(sp.traceWriter) + if err == nil { + return spanWriter.WriteSpan(ctx, span) + } + traces := v1adapter.V1BatchesToTraces([]*model.Batch{{Spans: []*model.Span{span}}}) + return sp.traceWriter.WriteTraces(ctx, traces) +} + +func (sp *spanProcessor) countSpansInQueue(span *model.Span, _ string /* tenant */) { //nolint: gosec // G115 sp.bytesProcessed.Add(uint64(span.Size())) sp.spansProcessed.Add(1) } -func (sp *spanProcessor) ProcessSpans(batch processor.Batch) ([]bool, error) { +func (sp *spanProcessor) ProcessSpans(ctx context.Context, batch processor.Batch) ([]bool, error) { + // We call preProcessSpans on a batch, it's responsibility of implementation + // to understand v1/v2 distinction. Jaeger itself does not use pre-processors. sp.preProcessSpans(batch) - var spans []*model.Span - batch.GetSpans(func(spansV1 []*model.Span) { - spans = spansV1 - }, func(_ ptrace.Traces) { - panic("not implemented") + + var batchOks []bool + var batchErr error + batch.GetSpans(func(spans []*model.Span) { + batchOks, batchErr = sp.processSpans(ctx, batch, spans) + }, func(traces ptrace.Traces) { + // TODO verify if the context will survive all the way to the consumer threads. + ctx := tenancy.WithTenant(ctx, batch.GetTenant()) + + // the exporter will eventually call pushTraces from consumer threads. + if err := sp.otelExporter.ConsumeTraces(ctx, traces); err != nil { + batchErr = err + } else { + batchOks = make([]bool, traces.SpanCount()) + for i := range batchOks { + batchOks[i] = true + } + } }) + return batchOks, batchErr +} + +func (sp *spanProcessor) processSpans(_ context.Context, batch processor.Batch, spans []*model.Span) ([]bool, error) { sp.metrics.BatchSize.Update(int64(len(spans))) retMe := make([]bool, len(spans)) @@ -188,7 +281,6 @@ func (sp *spanProcessor) ProcessSpans(batch processor.Batch) ([]bool, error) { } for i, mSpan := range spans { - // TODO does this have to be one span at a time? ok := sp.enqueueSpan(mSpan, batch.GetSpanFormat(), batch.GetInboundTransport(), batch.GetTenant()) if !ok && sp.reportBusy { return nil, processor.ErrBusy @@ -229,15 +321,15 @@ func (sp *spanProcessor) addCollectorTags(span *model.Span) { // in this function as it may cause race conditions. func (sp *spanProcessor) enqueueSpan(span *model.Span, originalFormat processor.SpanFormat, transport processor.InboundTransport, tenant string) bool { spanCounts := sp.metrics.GetCountsForFormat(originalFormat, transport) - spanCounts.ReceivedBySvc.ReportServiceNameForSpan(span) + spanCounts.ReceivedBySvc.ForSpanV1(span) if !sp.filterSpan(span) { - spanCounts.RejectedBySvc.ReportServiceNameForSpan(span) + spanCounts.RejectedBySvc.ForSpanV1(span) return true // as in "not dropped", because it's actively rejected } // add format tag - span.Tags = append(span.Tags, model.String("internal.span.format", string(originalFormat))) + span.Tags = append(span.Tags, model.String(jptrace.FormatAttribute, string(originalFormat))) item := queueItem{ queuedTime: time.Now(), diff --git a/cmd/collector/app/span_processor_test.go b/cmd/collector/app/span_processor_test.go index 87f991b6b07..298e46b8b47 100644 --- a/cmd/collector/app/span_processor_test.go +++ b/cmd/collector/app/span_processor_test.go @@ -5,16 +5,19 @@ package app import ( + "bytes" "context" "errors" "fmt" "io" "reflect" + "slices" "sync" "sync/atomic" "testing" "time" + "github.com/gogo/protobuf/jsonpb" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -27,6 +30,7 @@ import ( "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/tenancy" "github.com/jaegertracing/jaeger/pkg/testutils" + "github.com/jaegertracing/jaeger/storage_v2/v1adapter" "github.com/jaegertracing/jaeger/thrift-gen/jaeger" zc "github.com/jaegertracing/jaeger/thrift-gen/zipkincore" ) @@ -78,7 +82,7 @@ func TestBySvcMetrics(t *testing.T) { serviceMetrics := mb.Namespace(metrics.NSOptions{Name: "service", Tags: nil}) hostMetrics := mb.Namespace(metrics.NSOptions{Name: "host", Tags: nil}) sp, err := newSpanProcessor( - &fakeSpanWriter{}, + v1adapter.NewTraceWriter(&fakeSpanWriter{}), nil, Options.ServiceMetrics(serviceMetrics), Options.HostMetrics(hostMetrics), @@ -95,13 +99,13 @@ func TestBySvcMetrics(t *testing.T) { span := makeZipkinSpan(test.serviceName, test.rootSpan, test.debug) sanitizer := zipkinsanitizer.NewChainedSanitizer(zipkinsanitizer.NewStandardSanitizers()...) zHandler := handler.NewZipkinSpanHandler(logger, sp, sanitizer) - zHandler.SubmitZipkinBatch([]*zc.Span{span, span}, handler.SubmitBatchOptions{}) + zHandler.SubmitZipkinBatch(context.Background(), []*zc.Span{span, span}, handler.SubmitBatchOptions{}) metricPrefix = "service" format = "zipkin" case processor.JaegerSpanFormat: span, process := makeJaegerSpan(test.serviceName, test.rootSpan, test.debug) jHandler := handler.NewJaegerSpanHandler(logger, sp) - jHandler.SubmitBatches([]*jaeger.Batch{ + jHandler.SubmitBatches(context.Background(), []*jaeger.Batch{ { Spans: []*jaeger.Span{ span, @@ -167,6 +171,7 @@ func isSpanAllowed(span *model.Span) bool { } type fakeSpanWriter struct { + t *testing.T spansLock sync.Mutex spans []*model.Span err error @@ -174,6 +179,9 @@ type fakeSpanWriter struct { } func (n *fakeSpanWriter) WriteSpan(ctx context.Context, span *model.Span) error { + if n.t != nil { + n.t.Logf("Capturing span %+v", span) + } n.spansLock.Lock() defer n.spansLock.Unlock() n.spans = append(n.spans, span) @@ -236,10 +244,11 @@ func makeJaegerSpan(service string, rootSpan bool, debugEnabled bool) (*jaeger.S func TestSpanProcessor(t *testing.T) { w := &fakeSpanWriter{} - p, err := NewSpanProcessor(w, nil, Options.QueueSize(1)) + p, err := NewSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(1)) require.NoError(t, err) res, err := p.ProcessSpans( + context.Background(), processor.SpansV1{ Spans: []*model.Span{{}}, // empty span should be enriched by sanitizers Details: processor.Details{ @@ -262,7 +271,8 @@ func TestSpanProcessorErrors(t *testing.T) { mb := metricstest.NewFactory(time.Hour) defer mb.Backend.Stop() serviceMetrics := mb.Namespace(metrics.NSOptions{Name: "service", Tags: nil}) - pp, err := NewSpanProcessor(w, + pp, err := NewSpanProcessor( + v1adapter.NewTraceWriter(w), nil, Options.Logger(logger), Options.ServiceMetrics(serviceMetrics), @@ -271,7 +281,7 @@ func TestSpanProcessorErrors(t *testing.T) { require.NoError(t, err) p := pp.(*spanProcessor) - res, err := p.ProcessSpans(processor.SpansV1{ + res, err := p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ { Process: &model.Process{ @@ -315,7 +325,8 @@ func (w *blockingWriter) WriteSpan(context.Context, *model.Span) error { func TestSpanProcessorBusy(t *testing.T) { w := &blockingWriter{} - pp, err := NewSpanProcessor(w, + pp, err := NewSpanProcessor( + v1adapter.NewTraceWriter(w), nil, Options.NumWorkers(1), Options.QueueSize(1), @@ -330,7 +341,7 @@ func TestSpanProcessorBusy(t *testing.T) { w.Lock() defer w.Unlock() - res, err := p.ProcessSpans(processor.SpansV1{ + res, err := p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ { Process: &model.Process{ @@ -363,7 +374,7 @@ func TestSpanProcessorWithNilProcess(t *testing.T) { serviceMetrics := mb.Namespace(metrics.NSOptions{Name: "service", Tags: nil}) w := &fakeSpanWriter{} - pp, err := NewSpanProcessor(w, nil, Options.ServiceMetrics(serviceMetrics)) + pp, err := NewSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.ServiceMetrics(serviceMetrics)) require.NoError(t, err) p := pp.(*spanProcessor) defer require.NoError(t, p.Close()) @@ -377,54 +388,84 @@ func TestSpanProcessorWithNilProcess(t *testing.T) { } func TestSpanProcessorWithCollectorTags(t *testing.T) { - testCollectorTags := map[string]string{ - "extra": "tag", - "env": "prod", - "node": "172.22.18.161", - } + for _, modelVersion := range []string{"v1", "v2"} { + t.Run(modelVersion, func(t *testing.T) { + testCollectorTags := map[string]string{ + "extra": "tag", + "env": "prod", + "node": "172.22.18.161", + } - w := &fakeSpanWriter{} + w := &fakeSpanWriter{} - pp, err := NewSpanProcessor(w, nil, Options.CollectorTags(testCollectorTags)) - require.NoError(t, err) - p := pp.(*spanProcessor) + pp, err := NewSpanProcessor( + v1adapter.NewTraceWriter(w), + nil, + Options.CollectorTags(testCollectorTags), + Options.NumWorkers(1), + Options.QueueSize(1), + ) + require.NoError(t, err) + p := pp.(*spanProcessor) + t.Cleanup(func() { + require.NoError(t, p.Close()) + }) - defer require.NoError(t, p.Close()) - span := &model.Span{ - Process: model.NewProcess("unit-test-service", []model.KeyValue{ - { - Key: "env", - VStr: "prod", - }, - { - Key: "node", - VStr: "k8s-test-node-01", - }, - }), - } - p.addCollectorTags(span) - expected := &model.Span{ - Process: model.NewProcess("unit-test-service", []model.KeyValue{ - { - Key: "env", - VStr: "prod", - }, - { - Key: "extra", - VStr: "tag", - }, - { - Key: "node", - VStr: "172.22.18.161", - }, - { - Key: "node", - VStr: "k8s-test-node-01", - }, - }), - } + span := &model.Span{ + Process: model.NewProcess("unit-test-service", []model.KeyValue{ + model.String("env", "prod"), + model.String("node", "k8s-test-node-01"), + }), + } - assert.Equal(t, expected.Process, span.Process) + var batch processor.Batch + if modelVersion == "v2" { + batch = processor.SpansV2{ + Traces: v1adapter.V1BatchesToTraces([]*model.Batch{{Spans: []*model.Span{span}}}), + } + } else { + batch = processor.SpansV1{ + Spans: []*model.Span{span}, + } + } + _, err = p.ProcessSpans(context.Background(), batch) + require.NoError(t, err) + + require.Eventually(t, func() bool { + w.spansLock.Lock() + defer w.spansLock.Unlock() + return len(w.spans) > 0 + }, time.Second, time.Millisecond) + + w.spansLock.Lock() + defer w.spansLock.Unlock() + span = w.spans[0] + + expected := &model.Span{ + Process: model.NewProcess("unit-test-service", []model.KeyValue{ + model.String("env", "prod"), + model.String("extra", "tag"), + model.String("node", "172.22.18.161"), + model.String("node", "k8s-test-node-01"), + }), + } + if modelVersion == "v2" { + // ptrace.Resource.Attributes do not allow duplicate keys, + // so we only add non-conflicting tags, meaning the node IP + // tag from the collectorTags will not be added. + expected.Process.Tags = slices.Delete(expected.Process.Tags, 2, 3) + typedTags := model.KeyValues(span.Process.Tags) + typedTags.Sort() + } + + m := &jsonpb.Marshaler{Indent: " "} + jsonActual := new(bytes.Buffer) + m.Marshal(jsonActual, span.Process) + jsonExpected := new(bytes.Buffer) + m.Marshal(jsonExpected, expected.Process) + assert.Equal(t, jsonExpected.String(), jsonActual.String()) + }) + } } func TestSpanProcessorCountSpan(t *testing.T) { @@ -476,7 +517,7 @@ func TestSpanProcessorCountSpan(t *testing.T) { } else { opts = append(opts, Options.DynQueueSizeMemory(0)) } - pp, err := NewSpanProcessor(w, nil, opts...) + pp, err := NewSpanProcessor(v1adapter.NewTraceWriter(w), nil, opts...) require.NoError(t, err) p := pp.(*spanProcessor) defer func() { @@ -591,7 +632,7 @@ func TestUpdateDynQueueSize(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { w := &fakeSpanWriter{} - p, err := newSpanProcessor(w, nil, Options.QueueSize(tt.initialCapacity), Options.DynQueueSizeWarmup(tt.warmup), Options.DynQueueSizeMemory(tt.sizeInBytes)) + p, err := newSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(tt.initialCapacity), Options.DynQueueSizeWarmup(tt.warmup), Options.DynQueueSizeMemory(tt.sizeInBytes)) require.NoError(t, err) assert.EqualValues(t, tt.initialCapacity, p.queue.Capacity()) @@ -606,7 +647,7 @@ func TestUpdateDynQueueSize(t *testing.T) { func TestUpdateQueueSizeNoActivityYet(t *testing.T) { w := &fakeSpanWriter{} - p, err := newSpanProcessor(w, nil, Options.QueueSize(1), Options.DynQueueSizeWarmup(1), Options.DynQueueSizeMemory(1)) + p, err := newSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(1), Options.DynQueueSizeWarmup(1), Options.DynQueueSizeMemory(1)) require.NoError(t, err) assert.NotPanics(t, p.updateQueueSize) } @@ -614,7 +655,8 @@ func TestUpdateQueueSizeNoActivityYet(t *testing.T) { func TestStartDynQueueSizeUpdater(t *testing.T) { w := &fakeSpanWriter{} oneGiB := uint(1024 * 1024 * 1024) - p, err := newSpanProcessor(w, nil, Options.QueueSize(100), Options.DynQueueSizeWarmup(1000), Options.DynQueueSizeMemory(oneGiB)) + + p, err := newSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(100), Options.DynQueueSizeWarmup(1000), Options.DynQueueSizeMemory(oneGiB)) require.NoError(t, err) assert.EqualValues(t, 100, p.queue.Capacity()) @@ -641,9 +683,9 @@ func TestAdditionalProcessors(t *testing.T) { w := &fakeSpanWriter{} // nil doesn't fail - p, err := NewSpanProcessor(w, nil, Options.QueueSize(1)) + p, err := NewSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(1)) require.NoError(t, err) - res, err := p.ProcessSpans(processor.SpansV1{ + res, err := p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ { Process: &model.Process{ @@ -664,9 +706,9 @@ func TestAdditionalProcessors(t *testing.T) { f := func(_ *model.Span, _ string) { count++ } - p, err = NewSpanProcessor(w, []ProcessSpan{f}, Options.QueueSize(1)) + p, err = NewSpanProcessor(v1adapter.NewTraceWriter(w), []ProcessSpan{f}, Options.QueueSize(1)) require.NoError(t, err) - res, err = p.ProcessSpans(processor.SpansV1{ + res, err = p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ { Process: &model.Process{ @@ -686,12 +728,12 @@ func TestAdditionalProcessors(t *testing.T) { func TestSpanProcessorContextPropagation(t *testing.T) { w := &fakeSpanWriter{} - p, err := NewSpanProcessor(w, nil, Options.QueueSize(1)) + p, err := NewSpanProcessor(v1adapter.NewTraceWriter(w), nil, Options.QueueSize(1)) require.NoError(t, err) dummyTenant := "context-prop-test-tenant" - res, err := p.ProcessSpans(processor.SpansV1{ + res, err := p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ { Process: &model.Process{ @@ -720,7 +762,8 @@ func TestSpanProcessorWithOnDroppedSpanOption(t *testing.T) { } w := &blockingWriter{} - pp, err := NewSpanProcessor(w, + pp, err := NewSpanProcessor( + v1adapter.NewTraceWriter(w), nil, Options.NumWorkers(1), Options.QueueSize(1), @@ -735,7 +778,7 @@ func TestSpanProcessorWithOnDroppedSpanOption(t *testing.T) { w.Lock() defer w.Unlock() - _, err = p.ProcessSpans(processor.SpansV1{ + _, err = p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ {OperationName: "op1"}, }, @@ -752,7 +795,7 @@ func TestSpanProcessorWithOnDroppedSpanOption(t *testing.T) { // Now the queue is empty again and can accept one more item, but no workers available. // If we send two items, the last one will have to be dropped. - _, err = p.ProcessSpans(processor.SpansV1{ + _, err = p.ProcessSpans(context.Background(), processor.SpansV1{ Spans: []*model.Span{ {OperationName: "op2"}, {OperationName: "op3"}, diff --git a/cmd/collector/main.go b/cmd/collector/main.go index 29303cecdbb..d1a726cc41e 100644 --- a/cmd/collector/main.go +++ b/cmd/collector/main.go @@ -30,6 +30,7 @@ import ( ss "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider" "github.com/jaegertracing/jaeger/plugin/storage" "github.com/jaegertracing/jaeger/ports" + "github.com/jaegertracing/jaeger/storage_v2/v1adapter" ) const serviceName = "jaeger-collector" @@ -101,7 +102,7 @@ func main() { ServiceName: serviceName, Logger: logger, MetricsFactory: metricsFactory, - SpanWriter: spanWriter, + TraceWriter: v1adapter.NewTraceWriter(spanWriter), SamplingProvider: samplingProvider, SamplingAggregator: samplingAggregator, HealthCheck: svc.HC(), diff --git a/cmd/es-index-cleaner/main.go b/cmd/es-index-cleaner/main.go index 50d7bbcdcae..3c980b2da78 100644 --- a/cmd/es-index-cleaner/main.go +++ b/cmd/es-index-cleaner/main.go @@ -61,7 +61,8 @@ func main() { Client: c, BasicAuth: basicAuth(cfg.Username, cfg.Password), }, - MasterTimeoutSeconds: cfg.MasterNodeTimeoutSeconds, + MasterTimeoutSeconds: cfg.MasterNodeTimeoutSeconds, + IgnoreUnavailableIndex: true, } indices, err := i.GetJaegerIndices(cfg.IndexPrefix) diff --git a/cmd/jaeger/README.md b/cmd/jaeger/README.md index 41e8f5b02de..b2db973a750 100644 --- a/cmd/jaeger/README.md +++ b/cmd/jaeger/README.md @@ -34,10 +34,10 @@ flowchart LR ## Try it out -* Download `docker-compose-v2.yml` from https://github.com/jaegertracing/jaeger/blob/main/examples/hotrod/docker-compose-v2.yml, e.g.: - * `curl -O https://raw.githubusercontent.com/jaegertracing/jaeger/refs/heads/main/examples/hotrod/docker-compose-v2.yml` +* Download `docker-compose.yml` from https://github.com/jaegertracing/jaeger/blob/main/examples/hotrod/docker-compose.yml, e.g.: + * `curl -O https://raw.githubusercontent.com/jaegertracing/jaeger/refs/heads/main/examples/hotrod/docker-compose.yml` * Optional: find the latest images versions (see https://www.jaegertracing.io/download/) and pass them via environment variables `JAEGER_VERSION` and `HOTROD_VERSION`. Otherwise `docker compose` will use the `latest` tag, which is fine for the first time you download the images, but once they are in your local registry the `latest` tag is never updated and you may be running stale (and possibly incompatible) verions of Jaeger and the HotROD app. * Run Jaeger backend and HotROD demo, e.g.: - * `JAEGER_VERSION=2.0.0 HOTROD_VERSION=1.63.0 docker compose -f docker-compose-v2.yml up` + * `JAEGER_VERSION=2.0.0 HOTROD_VERSION=1.63.0 docker compose -f docker-compose.yml up` * Access Jaeger UI at http://localhost:16686 and HotROD app at http://localhost:8080 -* Shutdown / cleanup with `docker compose -f docker-compose-v2.yml down` +* Shutdown / cleanup with `docker compose -f docker-compose.yml down` diff --git a/cmd/jaeger/internal/all-in-one.yaml b/cmd/jaeger/internal/all-in-one.yaml index a1359bca71b..70fe648660d 100644 --- a/cmd/jaeger/internal/all-in-one.yaml +++ b/cmd/jaeger/internal/all-in-one.yaml @@ -30,7 +30,8 @@ extensions: remote_sampling: # We can either use file or adaptive sampling strategy in remote_sampling file: - path: ./cmd/jaeger/sampling-strategies.json + path: + default_sampling_probability: 1 reload_interval: 1s # adaptive: # sampling_store: some_store diff --git a/cmd/jaeger/internal/extension/remotesampling/config.go b/cmd/jaeger/internal/extension/remotesampling/config.go index 3dfcbcddd66..7f8819b1487 100644 --- a/cmd/jaeger/internal/extension/remotesampling/config.go +++ b/cmd/jaeger/internal/extension/remotesampling/config.go @@ -47,9 +47,11 @@ type Config struct { type FileConfig struct { // File specifies a local file as the source of sampling strategies. - Path string `valid:"required" mapstructure:"path"` + Path string `mapstructure:"path"` // ReloadInterval is the time interval to check and reload sampling strategies file ReloadInterval time.Duration `mapstructure:"reload_interval"` + // DefaultSamplingProbability is the sampling probability used by the Strategy Store for static sampling + DefaultSamplingProbability float64 `mapstructure:"default_sampling_probability" valid:"range(0|1)"` } type AdaptiveConfig struct { diff --git a/cmd/jaeger/internal/extension/remotesampling/config_test.go b/cmd/jaeger/internal/extension/remotesampling/config_test.go index 3f200e13b92..b4cd7d9e3e6 100644 --- a/cmd/jaeger/internal/extension/remotesampling/config_test.go +++ b/cmd/jaeger/internal/extension/remotesampling/config_test.go @@ -45,11 +45,11 @@ func Test_Validate(t *testing.T) { expectedErr: "", }, { - name: "Invalid File provider", + name: "File provider can have empty file path", config: &Config{ File: &FileConfig{Path: ""}, }, - expectedErr: "File.Path: non zero value required", + expectedErr: "", }, { name: "File provider has negative reload interval", @@ -58,6 +58,20 @@ func Test_Validate(t *testing.T) { }, expectedErr: "must be a positive value", }, + { + name: "File provider has negative default sampling probability", + config: &Config{ + File: &FileConfig{Path: "", DefaultSamplingProbability: -0.5}, + }, + expectedErr: "File.DefaultSamplingProbability: -0.5 does not validate as range(0|1)", + }, + { + name: "File provider has default sampling probability greater than 1", + config: &Config{ + File: &FileConfig{Path: "", DefaultSamplingProbability: 1.5}, + }, + expectedErr: "File.DefaultSamplingProbability: 1.5 does not validate as range(0|1)", + }, { name: "Invalid Adaptive provider", config: &Config{ diff --git a/cmd/jaeger/internal/extension/remotesampling/extension.go b/cmd/jaeger/internal/extension/remotesampling/extension.go index b9d4c9781d1..45624fce260 100644 --- a/cmd/jaeger/internal/extension/remotesampling/extension.go +++ b/cmd/jaeger/internal/extension/remotesampling/extension.go @@ -19,10 +19,10 @@ import ( "google.golang.org/grpc/health" "google.golang.org/grpc/health/grpc_health_v1" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling" "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" "github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/jaegerstorage" "github.com/jaegertracing/jaeger/internal/metrics/otelmetrics" + samplinggrpc "github.com/jaegertracing/jaeger/internal/sampling/grpc" "github.com/jaegertracing/jaeger/pkg/clientcfg/clientcfghttp" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection" @@ -168,6 +168,7 @@ func (ext *rsExtension) startFileBasedStrategyProvider(_ context.Context) error StrategiesFile: ext.cfg.File.Path, ReloadInterval: ext.cfg.File.ReloadInterval, IncludeDefaultOpStrategies: includeDefaultOpStrategies.IsEnabled(), + DefaultSamplingProbability: ext.cfg.File.DefaultSamplingProbability, } // contextcheck linter complains about next line that context is not passed. @@ -275,7 +276,7 @@ func (ext *rsExtension) startGRPCServer(ctx context.Context, host component.Host return err } - api_v2.RegisterSamplingManagerServer(ext.grpcServer, sampling.NewGRPCHandler(ext.strategyProvider)) + api_v2.RegisterSamplingManagerServer(ext.grpcServer, samplinggrpc.NewHandler(ext.strategyProvider)) healthServer := health.NewServer() // support health checks on the gRPC server healthServer.SetServingStatus("jaeger.api_v2.SamplingManager", grpc_health_v1.HealthCheckResponse_SERVING) diff --git a/cmd/jaeger/internal/extension/remotesampling/extension_test.go b/cmd/jaeger/internal/extension/remotesampling/extension_test.go index 62c84319762..b29328d37af 100644 --- a/cmd/jaeger/internal/extension/remotesampling/extension_test.go +++ b/cmd/jaeger/internal/extension/remotesampling/extension_test.go @@ -114,6 +114,7 @@ func TestStartHTTP(t *testing.T) { TelemetrySettings: componenttest.NewNopTelemetrySettings(), }, cfg) require.NoError(t, err) + // here, the file is using a service hardcoded in the sampling-services.json file host := makeStorageExtension(t, "foobar") require.NoError(t, ext.Start(context.Background(), host)) @@ -154,6 +155,7 @@ func TestStartGRPC(t *testing.T) { TelemetrySettings: componenttest.NewNopTelemetrySettings(), }, cfg) require.NoError(t, err) + // here, the file is using a service hardcoded in the sampling-services.json file host := makeStorageExtension(t, "foobar") require.NoError(t, ext.Start(context.Background(), host)) diff --git a/cmd/jaeger/internal/extension/remotesampling/factory.go b/cmd/jaeger/internal/extension/remotesampling/factory.go index 51e9f2e1e45..7c79425d2a4 100644 --- a/cmd/jaeger/internal/extension/remotesampling/factory.go +++ b/cmd/jaeger/internal/extension/remotesampling/factory.go @@ -13,6 +13,7 @@ import ( "go.opentelemetry.io/collector/extension" "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/adaptive" + "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/static" "github.com/jaegertracing/jaeger/ports" ) @@ -43,7 +44,8 @@ func createDefaultConfig() component.Config { }, }, File: &FileConfig{ - Path: "", // path needs to be specified + Path: "", // path needs to be specified + DefaultSamplingProbability: static.DefaultSamplingProbability, }, Adaptive: &AdaptiveConfig{ SamplingStore: "", // storage name needs to be specified diff --git a/cmd/jaeger/sanitizer/package_test.go b/cmd/jaeger/sanitizer/package_test.go new file mode 100644 index 00000000000..bae7fe4ba74 --- /dev/null +++ b/cmd/jaeger/sanitizer/package_test.go @@ -0,0 +1,14 @@ +// Copyright (c) 2023 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package sanitizer + +import ( + "testing" + + "github.com/jaegertracing/jaeger/pkg/testutils" +) + +func TestMain(m *testing.M) { + testutils.VerifyGoLeaks(m) +} diff --git a/cmd/jaeger/sanitizer/sanitizer.go b/cmd/jaeger/sanitizer/sanitizer.go new file mode 100644 index 00000000000..09fef4a3d31 --- /dev/null +++ b/cmd/jaeger/sanitizer/sanitizer.go @@ -0,0 +1,11 @@ +// Copyright (c) 2025 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package sanitizer + +import ( + "github.com/jaegertracing/jaeger/cmd/jaeger/internal/sanitizer" +) + +// Sanitize is a function that applies all sanitizers to the given trace data. +var Sanitize = sanitizer.NewChainedSanitizer(sanitizer.NewStandardSanitizers()...) diff --git a/docker-compose/monitor/Makefile b/docker-compose/monitor/Makefile index 821307a2018..1e52bb13f05 100644 --- a/docker-compose/monitor/Makefile +++ b/docker-compose/monitor/Makefile @@ -1,7 +1,7 @@ # Copyright (c) 2024 The Jaeger Authors. # SPDX-License-Identifier: Apache-2.0 -BINARY ?= all-in-one # Default value uses v1 binary +BINARY ?= jaeger # Default value uses v2 binary .PHONY: build build: clean-jaeger @@ -20,13 +20,13 @@ build: clean-jaeger .PHONY: dev dev: export JAEGER_IMAGE_TAG = dev dev: - docker compose -f docker-compose.yml up $(DOCKER_COMPOSE_ARGS) + docker compose up $(DOCKER_COMPOSE_ARGS) -.PHONY: dev-v2 -dev-v2: export JAEGER_IMAGE_TAG = dev -dev-v2: export BINARY = jaeger -dev-v2: build - docker compose -f docker-compose-v2.yml up $(DOCKER_COMPOSE_ARGS) +.PHONY: dev-v1 +dev-v1: export JAEGER_IMAGE_TAG = dev +dev-v1: export BINARY = all-in-one +dev-v1: build + docker compose -f docker-compose-v1.yml up $(DOCKER_COMPOSE_ARGS) .PHONY: clean-jaeger clean-jaeger: diff --git a/docker-compose/monitor/README.md b/docker-compose/monitor/README.md index b020dda7fd9..8cb22765ac6 100644 --- a/docker-compose/monitor/README.md +++ b/docker-compose/monitor/README.md @@ -72,10 +72,10 @@ It uses the latest image tags from both Jaeger and OpenTelemetry. docker compose up ``` -**Jaeger v2** +**Jaeger v1** ```shell -docker compose -f docker-compose-v2.yml up +docker compose -f docker-compose-v1.yml up ``` **Tips:** @@ -83,7 +83,7 @@ docker compose -f docker-compose-v2.yml up - Navigate to Jaeger UI at http://localhost:16686/ and inspect the Monitor tab. Select `redis` service from the dropdown to see more than one endpoint. - To visualize the raw metrics stored on the Prometheus server (for debugging and local development use cases), use the built-in Prometheus UI at http://localhost:9090/query. For example, http://localhost:9090/query?g0.expr=traces_span_metrics_calls_total&g0.tab=0&g0.range_input=5m -**Warning:** The included [docker-compose.yml](./docker-compose.yml) file uses the `latest` version of Jaeger and other components. If your local Docker registry already contains older versions, which may still be tagged as `latest`, you may want to delete those images before running the full set, to ensure consistent behavior: +**Warning:** The included ` docker compose` files use the `latest` version of Jaeger and other components. If your local Docker registry already contains older versions, which may still be tagged as `latest`, you may want to delete those images before running the full set, to ensure consistent behavior: ```bash make clean-all @@ -92,13 +92,13 @@ make clean-all To use an official published image of Jaeger, specify the version via environment variable: ```shell -JAEGER_IMAGE_TAG=1.62.0 docker compose up +JAEGER_IMAGE_TAG=2.0.0 docker compose -f docker-compose.yml up ``` -or for Jaeger v2: +or for Jaeger v1: ```shell -JAEGER_IMAGE_TAG=2.0.0 docker compose -f docker-compose-v2.yml up +JAEGER_IMAGE_TAG=1.62.0 docker compose -f docker-compose-v1.yml up ``` ## Development @@ -107,7 +107,7 @@ These steps allow for running the system necessary for SPM, built from Jaeger's The primary use case is for testing source code changes to the SPM feature locally. -### Build jaeger-all-in-one docker image +### Build jaeger-v2 docker image ```shell make build diff --git a/docker-compose/monitor/docker-compose-v1.yml b/docker-compose/monitor/docker-compose-v1.yml new file mode 100644 index 00000000000..4408c4709c3 --- /dev/null +++ b/docker-compose/monitor/docker-compose-v1.yml @@ -0,0 +1,54 @@ +services: + jaeger: + networks: + - backend + image: jaegertracing/all-in-one:${JAEGER_IMAGE_TAG:-latest} + volumes: + - "./jaeger-ui.json:/etc/jaeger/jaeger-ui.json" + command: --query.ui-config /etc/jaeger/jaeger-ui.json + environment: + - METRICS_STORAGE_TYPE=prometheus + - PROMETHEUS_SERVER_URL=http://prometheus:9090 + - PROMETHEUS_QUERY_NAMESPACE=${PROMETHEUS_QUERY_NAMESPACE:-} + - PROMETHEUS_QUERY_DURATION_UNIT=${PROMETHEUS_QUERY_DURATION_UNIT:-} + - PROMETHEUS_QUERY_NORMALIZE_CALLS=true + - PROMETHEUS_QUERY_NORMALIZE_DURATION=true + ports: + - "16686:16686" + + otel_collector: + networks: + backend: + # This is the host name used in Prometheus scrape configuration. + aliases: [spm_metrics_source] + image: otel/opentelemetry-collector-contrib:${OTEL_IMAGE_TAG:-0.112.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: + - "8889:8889" + + microsim: + networks: + - backend + image: yurishkuro/microsim:v0.4.1 + command: "-d 24h -s 500ms" + environment: + - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel_collector:4318 + - OTEL_EXPORTER_OTLP_INSECURE=true + depends_on: + - otel_collector + + prometheus: + networks: + - backend + image: prom/prometheus:latest + volumes: + - "./prometheus.yml:/etc/prometheus/prometheus.yml" + ports: + - "9090:9090" + +networks: + backend: diff --git a/docker-compose/monitor/docker-compose-v2.yml b/docker-compose/monitor/docker-compose-v2.yml deleted file mode 100644 index e049f4e2a14..00000000000 --- a/docker-compose/monitor/docker-compose-v2.yml +++ /dev/null @@ -1,39 +0,0 @@ -services: - jaeger: - networks: - backend: - # This is the host name used in Prometheus scrape configuration. - aliases: [spm_metrics_source] - image: jaegertracing/jaeger:${JAEGER_IMAGE_TAG:-latest} - volumes: - - "./jaeger-ui.json:/etc/jaeger/jaeger-ui.json" # Do we need this for v2 ? Seems to be running without this. - - "../../cmd/jaeger/config-spm.yaml:/etc/jaeger/config.yml" - command: ["--config", "/etc/jaeger/config.yml"] - ports: - - "16686:16686" - - "8888:8888" - - "8889:8889" - - "4317:4317" - - "4318:4318" - - microsim: - networks: - - backend - image: yurishkuro/microsim:v0.4.1 - command: "-d 24h -s 500ms" - environment: - - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://jaeger:4318/v1/traces - depends_on: - - jaeger - - prometheus: - networks: - - backend - image: prom/prometheus:v3.1.0 - volumes: - - "./prometheus.yml:/etc/prometheus/prometheus.yml" - ports: - - "9090:9090" - -networks: - backend: diff --git a/docker-compose/monitor/docker-compose.yml b/docker-compose/monitor/docker-compose.yml index 4408c4709c3..e049f4e2a14 100644 --- a/docker-compose/monitor/docker-compose.yml +++ b/docker-compose/monitor/docker-compose.yml @@ -1,34 +1,20 @@ services: jaeger: - networks: - - backend - image: jaegertracing/all-in-one:${JAEGER_IMAGE_TAG:-latest} - volumes: - - "./jaeger-ui.json:/etc/jaeger/jaeger-ui.json" - command: --query.ui-config /etc/jaeger/jaeger-ui.json - environment: - - METRICS_STORAGE_TYPE=prometheus - - PROMETHEUS_SERVER_URL=http://prometheus:9090 - - PROMETHEUS_QUERY_NAMESPACE=${PROMETHEUS_QUERY_NAMESPACE:-} - - PROMETHEUS_QUERY_DURATION_UNIT=${PROMETHEUS_QUERY_DURATION_UNIT:-} - - PROMETHEUS_QUERY_NORMALIZE_CALLS=true - - PROMETHEUS_QUERY_NORMALIZE_DURATION=true - ports: - - "16686:16686" - - otel_collector: networks: backend: # This is the host name used in Prometheus scrape configuration. aliases: [spm_metrics_source] - image: otel/opentelemetry-collector-contrib:${OTEL_IMAGE_TAG:-0.112.0} + image: jaegertracing/jaeger:${JAEGER_IMAGE_TAG:-latest} 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 + - "./jaeger-ui.json:/etc/jaeger/jaeger-ui.json" # Do we need this for v2 ? Seems to be running without this. + - "../../cmd/jaeger/config-spm.yaml:/etc/jaeger/config.yml" + command: ["--config", "/etc/jaeger/config.yml"] ports: + - "16686:16686" + - "8888:8888" - "8889:8889" + - "4317:4317" + - "4318:4318" microsim: networks: @@ -36,15 +22,14 @@ services: image: yurishkuro/microsim:v0.4.1 command: "-d 24h -s 500ms" environment: - - OTEL_EXPORTER_OTLP_ENDPOINT=http://otel_collector:4318 - - OTEL_EXPORTER_OTLP_INSECURE=true + - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://jaeger:4318/v1/traces depends_on: - - otel_collector + - jaeger prometheus: networks: - backend - image: prom/prometheus:latest + image: prom/prometheus:v3.1.0 volumes: - "./prometheus.yml:/etc/prometheus/prometheus.yml" ports: diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 31ead90d0b6..6aac085da7a 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -1,9 +1,9 @@ # Copyright (c) 2024 The Jaeger Authors. # SPDX-License-Identifier: Apache-2.0 -FROM alpine:3.21.1 AS cert +FROM alpine:3.21.2 AS cert RUN apk add --update --no-cache ca-certificates mailcap -FROM alpine:3.21.1 +FROM alpine:3.21.2 COPY --from=cert /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt COPY --from=cert /etc/mime.types /etc/mime.types diff --git a/examples/hotrod/docker-compose-v2.yml b/examples/hotrod/docker-compose-v1.yml similarity index 79% rename from examples/hotrod/docker-compose-v2.yml rename to examples/hotrod/docker-compose-v1.yml index 3e39faad702..4566e2863da 100644 --- a/examples/hotrod/docker-compose-v2.yml +++ b/examples/hotrod/docker-compose-v1.yml @@ -1,9 +1,9 @@ # To run a specific version of Jaeger, use environment variable, e.g.: -# JAEGER_VERSION=2.0.0 HOTROD_VERSION=1.63.0 docker compose up +# JAEGER_VERSION=1.52 docker compose up services: jaeger: - image: ${REGISTRY:-}jaegertracing/jaeger:${JAEGER_VERSION:-latest} + image: ${REGISTRY:-}jaegertracing/all-in-one:${JAEGER_VERSION:-latest} ports: - "16686:16686" - "4317:4317" @@ -14,7 +14,7 @@ services: - jaeger-example hotrod: - image: ${REGISTRY:-}jaegertracing/example-hotrod:${HOTROD_VERSION:-latest} + image: ${REGISTRY:-}jaegertracing/example-hotrod:${JAEGER_VERSION:-latest} # To run the latest trunk build, find the tag at Docker Hub and use the line below # https://hub.docker.com/r/jaegertracing/example-hotrod-snapshot/tags #image: jaegertracing/example-hotrod-snapshot:0ab8f2fcb12ff0d10830c1ee3bb52b745522db6c diff --git a/examples/hotrod/docker-compose.yml b/examples/hotrod/docker-compose.yml index 4566e2863da..3e39faad702 100644 --- a/examples/hotrod/docker-compose.yml +++ b/examples/hotrod/docker-compose.yml @@ -1,9 +1,9 @@ # To run a specific version of Jaeger, use environment variable, e.g.: -# JAEGER_VERSION=1.52 docker compose up +# JAEGER_VERSION=2.0.0 HOTROD_VERSION=1.63.0 docker compose up services: jaeger: - image: ${REGISTRY:-}jaegertracing/all-in-one:${JAEGER_VERSION:-latest} + image: ${REGISTRY:-}jaegertracing/jaeger:${JAEGER_VERSION:-latest} ports: - "16686:16686" - "4317:4317" @@ -14,7 +14,7 @@ services: - jaeger-example hotrod: - image: ${REGISTRY:-}jaegertracing/example-hotrod:${JAEGER_VERSION:-latest} + image: ${REGISTRY:-}jaegertracing/example-hotrod:${HOTROD_VERSION:-latest} # To run the latest trunk build, find the tag at Docker Hub and use the line below # https://hub.docker.com/r/jaegertracing/example-hotrod-snapshot/tags #image: jaegertracing/example-hotrod-snapshot:0ab8f2fcb12ff0d10830c1ee3bb52b745522db6c diff --git a/go.mod b/go.mod index f498be0bb94..36d339a0071 100644 --- a/go.mod +++ b/go.mod @@ -23,17 +23,17 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.2.0 github.com/kr/pretty v0.3.1 github.com/olivere/elastic v6.2.37+incompatible - github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.116.0 - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 + github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.117.0 + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.117.0 github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.61.0 @@ -44,42 +44,42 @@ require ( github.com/stretchr/testify v1.10.0 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/xdg-go/scram v1.1.2 - go.opentelemetry.io/collector/component v0.116.0 - go.opentelemetry.io/collector/component/componentstatus v0.116.0 - go.opentelemetry.io/collector/component/componenttest v0.116.0 - go.opentelemetry.io/collector/config/configauth v0.116.0 - go.opentelemetry.io/collector/config/configgrpc v0.116.0 - go.opentelemetry.io/collector/config/confighttp v0.116.0 - go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.116.0 - go.opentelemetry.io/collector/config/configretry v1.22.0 - go.opentelemetry.io/collector/config/configtls v1.22.0 - go.opentelemetry.io/collector/confmap v1.22.0 - go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 - go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 - go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 - go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.22.0 - go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 - go.opentelemetry.io/collector/connector v0.116.0 - go.opentelemetry.io/collector/connector/forwardconnector v0.116.0 - go.opentelemetry.io/collector/consumer v1.22.0 - go.opentelemetry.io/collector/consumer/consumertest v0.116.0 - go.opentelemetry.io/collector/exporter v0.116.0 - go.opentelemetry.io/collector/exporter/exportertest v0.116.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 - go.opentelemetry.io/collector/extension v0.116.0 - go.opentelemetry.io/collector/extension/extensiontest v0.116.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 - go.opentelemetry.io/collector/featuregate v1.22.0 - go.opentelemetry.io/collector/otelcol v0.116.0 - go.opentelemetry.io/collector/pdata v1.22.0 - go.opentelemetry.io/collector/pipeline v0.116.0 - go.opentelemetry.io/collector/processor v0.116.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 - go.opentelemetry.io/collector/processor/processortest v0.116.0 - go.opentelemetry.io/collector/receiver v0.116.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 + go.opentelemetry.io/collector/component v0.117.0 + go.opentelemetry.io/collector/component/componentstatus v0.117.0 + go.opentelemetry.io/collector/component/componenttest v0.117.0 + go.opentelemetry.io/collector/config/configauth v0.117.0 + go.opentelemetry.io/collector/config/configgrpc v0.117.0 + go.opentelemetry.io/collector/config/confighttp v0.117.0 + go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.117.0 + go.opentelemetry.io/collector/config/configretry v1.23.0 + go.opentelemetry.io/collector/config/configtls v1.23.0 + go.opentelemetry.io/collector/confmap v1.23.0 + go.opentelemetry.io/collector/confmap/provider/envprovider v1.23.0 + go.opentelemetry.io/collector/confmap/provider/fileprovider v1.23.0 + go.opentelemetry.io/collector/confmap/provider/httpprovider v1.23.0 + go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.23.0 + go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.23.0 + go.opentelemetry.io/collector/connector v0.117.0 + go.opentelemetry.io/collector/connector/forwardconnector v0.117.0 + go.opentelemetry.io/collector/consumer v1.23.0 + go.opentelemetry.io/collector/consumer/consumertest v0.117.0 + go.opentelemetry.io/collector/exporter v0.117.0 + go.opentelemetry.io/collector/exporter/exportertest v0.117.0 + go.opentelemetry.io/collector/exporter/otlpexporter v0.117.0 + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.117.0 + go.opentelemetry.io/collector/extension v0.117.0 + go.opentelemetry.io/collector/extension/extensiontest v0.117.0 + go.opentelemetry.io/collector/extension/zpagesextension v0.117.0 + go.opentelemetry.io/collector/featuregate v1.23.0 + go.opentelemetry.io/collector/otelcol v0.117.0 + go.opentelemetry.io/collector/pdata v1.23.0 + go.opentelemetry.io/collector/pipeline v0.117.0 + go.opentelemetry.io/collector/processor v0.117.0 + go.opentelemetry.io/collector/processor/batchprocessor v0.117.0 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.117.0 + go.opentelemetry.io/collector/processor/processortest v0.117.0 + go.opentelemetry.io/collector/receiver v0.117.0 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.117.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 go.opentelemetry.io/contrib/samplers/jaegerremote v0.27.0 @@ -98,16 +98,18 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/net v0.34.0 golang.org/x/sys v0.29.0 - google.golang.org/grpc v1.69.2 - google.golang.org/protobuf v1.36.1 + google.golang.org/grpc v1.69.4 + google.golang.org/protobuf v1.36.2 gopkg.in/yaml.v3 v3.0.1 ) +require go.opentelemetry.io/collector/extension/xextension v0.117.0 // indirect + require ( - github.com/IBM/sarama v1.43.3 // indirect + github.com/IBM/sarama v1.44.0 // indirect github.com/alecthomas/participle/v2 v2.1.1 // indirect - github.com/antchfx/xmlquery v1.4.2 // indirect - github.com/antchfx/xpath v1.3.2 // indirect + github.com/antchfx/xmlquery v1.4.3 // indirect + github.com/antchfx/xpath v1.3.3 // indirect github.com/aws/aws-msk-iam-sasl-signer-go v1.0.0 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect @@ -186,20 +188,20 @@ require ( github.com/mostynb/go-grpc-compression v1.2.3 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo v1.16.5 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.117.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.117.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect @@ -216,7 +218,7 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v4 v4.24.11 // indirect + github.com/shirou/gopsutil/v4 v4.24.12 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect @@ -231,35 +233,33 @@ require ( github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/collector v0.116.0 // indirect - go.opentelemetry.io/collector/client v1.22.0 // indirect - go.opentelemetry.io/collector/config/configcompression v1.22.0 // indirect - go.opentelemetry.io/collector/config/confignet v1.22.0 - go.opentelemetry.io/collector/config/configopaque v1.22.0 - go.opentelemetry.io/collector/config/configtelemetry v0.116.0 // indirect - go.opentelemetry.io/collector/config/internal v0.116.0 // indirect - go.opentelemetry.io/collector/connector/connectortest v0.116.0 // indirect - go.opentelemetry.io/collector/connector/xconnector v0.116.0 // indirect - go.opentelemetry.io/collector/consumer/consumererror v0.116.0 // indirect - go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 // indirect - go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 // indirect - go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 - go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 // indirect - go.opentelemetry.io/collector/exporter/xexporter v0.116.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.116.0 // indirect - go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 // indirect - go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 - go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 // indirect - go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 // indirect - go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 // indirect - go.opentelemetry.io/collector/pdata/pprofile v0.116.0 // indirect - go.opentelemetry.io/collector/pdata/testdata v0.116.0 // indirect - go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 // indirect - go.opentelemetry.io/collector/processor/xprocessor v0.116.0 // indirect - go.opentelemetry.io/collector/receiver/receivertest v0.116.0 // indirect - go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 // indirect - go.opentelemetry.io/collector/semconv v0.116.0 // indirect - go.opentelemetry.io/collector/service v0.116.0 // indirect + go.opentelemetry.io/collector v0.117.0 // indirect + go.opentelemetry.io/collector/client v1.23.0 // indirect + go.opentelemetry.io/collector/config/configcompression v1.23.0 // indirect + go.opentelemetry.io/collector/config/confignet v1.23.0 + go.opentelemetry.io/collector/config/configopaque v1.23.0 + go.opentelemetry.io/collector/config/configtelemetry v0.117.0 // indirect + go.opentelemetry.io/collector/connector/connectortest v0.117.0 // indirect + go.opentelemetry.io/collector/connector/xconnector v0.117.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror v0.117.0 // indirect + go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.117.0 // indirect + go.opentelemetry.io/collector/consumer/xconsumer v0.117.0 // indirect + go.opentelemetry.io/collector/exporter/debugexporter v0.117.0 + go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.117.0 // indirect + go.opentelemetry.io/collector/exporter/xexporter v0.117.0 // indirect + go.opentelemetry.io/collector/extension/auth v0.117.0 // indirect + go.opentelemetry.io/collector/extension/extensioncapabilities v0.117.0 + go.opentelemetry.io/collector/internal/fanoutconsumer v0.117.0 // indirect + go.opentelemetry.io/collector/internal/memorylimiter v0.117.0 // indirect + go.opentelemetry.io/collector/internal/sharedcomponent v0.117.0 // indirect + go.opentelemetry.io/collector/pdata/pprofile v0.117.0 // indirect + go.opentelemetry.io/collector/pdata/testdata v0.117.0 // indirect + go.opentelemetry.io/collector/pipeline/xpipeline v0.117.0 // indirect + go.opentelemetry.io/collector/processor/xprocessor v0.117.0 // indirect + go.opentelemetry.io/collector/receiver/receivertest v0.117.0 // indirect + go.opentelemetry.io/collector/receiver/xreceiver v0.117.0 // indirect + go.opentelemetry.io/collector/semconv v0.117.0 // indirect + go.opentelemetry.io/collector/service v0.117.0 // indirect go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 // indirect go.opentelemetry.io/contrib/config v0.10.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.31.0 // indirect diff --git a/go.sum b/go.sum index c94eaa2b7a7..2db87912d03 100644 --- a/go.sum +++ b/go.sum @@ -26,8 +26,8 @@ github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= -github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/IBM/sarama v1.44.0 h1:puNKqcScjSAgVLramjsuovZrS0nJZFVsrvuUymkWqhE= +github.com/IBM/sarama v1.44.0/go.mod h1:MxQ9SvGfvKIorbk077Ff6DUnBlGpidiQOtU2vuBaxVw= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/Shopify/sarama v1.33.0 h1:2K4mB9M4fo46sAM7t6QTsmSO8dLX1OqznLM7vn3OjZ8= @@ -43,10 +43,10 @@ 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/antchfx/xmlquery v1.4.2 h1:MZKd9+wblwxfQ1zd1AdrTsqVaMjMCwow3IqkCSe00KA= -github.com/antchfx/xmlquery v1.4.2/go.mod h1:QXhvf5ldTuGqhd1SHNvvtlhhdQLks4dD0awIVhXIDTA= -github.com/antchfx/xpath v1.3.2 h1:LNjzlsSjinu3bQpw9hWMY9ocB80oLOWuQqFvO6xt51U= -github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= +github.com/antchfx/xmlquery v1.4.3 h1:f6jhxCzANrWfa93O+NmRWvieVyLs+R2Szfpy+YrZaww= +github.com/antchfx/xmlquery v1.4.3/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fusrx9b12fc= +github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs= +github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= @@ -433,60 +433,60 @@ 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.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.116.0 h1:XFLkYR1xXwxapNuS0IrahYoHaaJxTyt5Kt3tHNCwHsc= -github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.116.0/go.mod h1:1kppUKh6r44eoCCuNTTCz3o2HIZXAhDvBxSFvDs0kwo= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.116.0 h1:4Pgj/AuFEW6r654llnTuZZwk09xiovGYcbMsYrumu+U= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.116.0/go.mod h1:KZe8BzQcC+KNs4P//Dq2pg1gpuLC4NTsSPWdowIMo9E= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.116.0 h1:/hnIwjg4gizoJPs1pCQbj42HmyH4VDAjydw0yNBsdXg= -github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.116.0/go.mod h1:Yr4dwclf3Y5ZUvzcrIL5c8ZlH6QIIQwV1x4/3VZltpg= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.116.0 h1:J4tlrS1dNTgD76pN0DM29SjqTksuXIiP9KWWNVbQ60M= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.116.0/go.mod h1:Ng9eMrROScOvpphs3FI+CpWPKaObPjdpiUYscgpwAM4= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.116.0 h1:0MkHxKsm35xWibXRs4hPdQldI7DOhr0pil4cbQ9rOkY= -github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.116.0/go.mod h1:ueNOmFMNZYsp+o20TP/L92ieSmK88tyvmnAr5uEurhg= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0 h1:va5jloH1Uwrnx8rymcG7ZqLJ49/zWGMz5Dy/iMm1JzI= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.116.0/go.mod h1:WXJuadNLluxAiVZts1bAJbhAVurBpogToBbjtFKzie8= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0 h1:xDbf946Zm0rTzWcYEyUfU0Ft2KthhaH4xrNm303vpbI= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.116.0/go.mod h1:yuIyOGmQJOn37u6NVfG8yOCzVvwboqnt+pjOSTvDeLo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0 h1:5T7nt2K73pHYT131FTj9BjS6xdjIJZQ3fzp9nCB1dYo= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.116.0/go.mod h1:SY4FYy6K/cr63UY6ImhNSRy/1/WmK6fvSHsSpW+lT1Q= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.116.0 h1:sp2pcY/jJItuB14+omWqIm6ImSeZiKCtAm0MD+9Ex5w= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.116.0/go.mod h1:51jLoNTWbZ8wHqYU41IkGbNtlLaqAnBXEqpHleDhFY0= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0 h1:DkrbPF5kPCtdoi2dDxgv3zT1fYQn4KbNxq1MBqgaJ9U= -github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.116.0/go.mod h1:oa6vnMIde7Mb5qNocvRaba6TAytPsRRjnV/Ja+1I67g= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0 h1:Gdmg6Pr9X/h+HqTnRWCnH0tcLbCRymXJ9Lj1RGchs3M= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.116.0/go.mod h1:jJseeb/N41qHL1YOd+dzhgyEMR04s7cbkD6dsXKjoUk= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.116.0 h1:Oi6UZR5FNij7eifaFtjbBXFxfNXuPCH+37PODtZSu/o= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.116.0/go.mod h1:1q/L2R/28emNCz0EHfxEw853I6lPxTcHTqS+UrMea0k= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0 h1:LCyHhStq7UbCHxCiTHIpGhhMWFv/mA1ecV6wduzicYw= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.116.0/go.mod h1:wpgb30Nj/PwrTBCRm4b1EQNHhk4P5uILvqogiKD2+2w= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 h1:RlEK9MbxWyBHbLel8EJ1L7DbYVLai9dZL6Ljl2cBgyA= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0/go.mod h1:AVUEyIjPb+0ARr7mhIkZkdNg3fd0ZcRhzAi53oZhl1Q= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 h1:jwnZYRBuPJnsKXE5H6ZvTEm91bXW5VP8+tLewzl54eg= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0/go.mod h1:NT3Ag+DdnIAZQfD7l7OHwlYqnaAJ19SoPZ0nhD9yx4s= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0 h1:AOIAG3j3o1Ww8Gfw9SeFIhGqHftxH65ljeHODVMxwDE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.116.0/go.mod h1:Sis11Z5mNhfyL27DQOz16mZApsYYWC3Fmt/+WM4glqs= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.116.0 h1:9kjAz4+wIdKL3CiBC90Al8COTcGcO2TDp4ppaVXz2/I= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.116.0/go.mod h1:tKA2kw5ylY/ytwBDj9P+gSlhe8WMQL+3lcmSXmIS7Z0= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.116.0 h1:QqlVh8hjFr+U1HDI8VeCXg0nJGKeKce4lemGhSqdteo= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.116.0/go.mod h1:GjaQr/5Atnc20NDg2YFa4A+Ly9pojsy3+Vi+BQ5DW/4= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0 h1:wNQ51LBQjPIW7ptgZOMaJT60CnMoP1t3kxgldR7uv9Q= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.116.0/go.mod h1:lx+O1oAnKYPg5KaFW5Ss1Xh+zvCDKZPm73MDAFjPgak= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0 h1:coTfhsM6coyLEEC+Q+mSL8HnmajFScFg8Ib8Zn9/o9U= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.116.0/go.mod h1:8awtHOYwTq5FF/TiFwA058Ok0rVIf1NjWkVe9P7xXTQ= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0 h1:mEKOrQ6dqWkfPTVEND41Jsvgktdlnk774GZIeU0IZRE= -github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.116.0/go.mod h1:9TzKV3YvfXnz9PUoKluRG3iQkOVQMNZcUJy+CUnthkY= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.116.0 h1:3qdGwEhZmRyepVnOwPTe4fk6WDKxUCivr6RHleX7hy4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.116.0/go.mod h1:FAuz4SFxKZwNgptL1BVarh6SEO4gQ1I7SclJScBBho4= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0 h1:q2Ug0KXJMDnUw1RCEEn6J07qQREWXD/KLBOa79DHJfM= -github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.116.0/go.mod h1:CBQvNUdQxsDzmMmfgxhLRqbHWA9BEhWe3E2FIe/DT+s= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0 h1:Rgqfcmb6+Bsb99UOPCpfnVrH8ytI/F0KU3lmx2tnNk4= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.116.0/go.mod h1:LQBflOCH8C1rrcW4iYWDe2InZx+U5jY4HLnShmi+jR8= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.116.0 h1:+YA1AlJv4CWSLun5O6RRIK/Eac+Wekw/6k+45xR5yXM= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.116.0/go.mod h1:WCbw0k2xv2RvMUzhrAT1sIAQPCvdnR7wr/6bW6aQJIE= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0 h1:a++2CPNUqLJWafE6dYtcJRweSD4ayJCLToikrb1scwM= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.116.0/go.mod h1:HW4ytncy0SeUdm1tcOVHMRf8K7V3rQ9dptpQlFn4JXs= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0 h1:M9nXu5HHi1Prf2h3o2W+nI2RXvXuVF0qh+hNP8p7pAI= -github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.116.0/go.mod h1:nbNJQEln1t8+0xyYK4E4ynUAvEv3QXaeMWIN2J+FWPI= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.117.0 h1:+aFOdtADYVCa0LZ9NwQCSgholjnlcDCZtUxw1ANM09Q= +github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.117.0/go.mod h1:+yiEfRt40Sf6vnrusZuGK3u7Ygc+yFUjUQmsXyWJiZc= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.117.0 h1:/rYuHD/ub5AGXbJmXisS22/Ru+MyN6Ev/FjQwp8qu2Q= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.117.0/go.mod h1:0xsGslwZOCYDvdOSefuja+He48ad7FLODp8Vqi+8754= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.117.0 h1:Q+Vt1z+XAq+cxj2MI65xJ8QFXo8981zlJRO5OYHM3cU= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.117.0/go.mod h1:7+RL39dEwcG71dbZwnxfr2u1UK1AN97k7Ba3qy6GdLA= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.117.0 h1:ou81jgO8XEOdbR9jojYo9qzEGiMhlSs/omjQJDnK8T4= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckv2extension v0.117.0/go.mod h1:R7jlGRRbEPX013vrZvbAXcwDl0fMwA+kH/+bjoOWnF8= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.117.0 h1:SbD/rcj6VQ59QutRM8Kfw+36s8Z/U0p/tcrQCLaji0s= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.117.0/go.mod h1:wi/KMp+8lAVrX12/NKL1PslqrZVYjae/KBYRepqDbo8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.117.0 h1:vnZsHJhZci7rjhuQUjZ2Utm3hPdzQCxoqZSL56Ra4ME= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.117.0/go.mod h1:ShQ4jr9t4tb11LqLpKw7WOoZUaebKHObOj4OZLvgY7I= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.117.0 h1:LZG1N02gLmfi9Lv6JiUWMhb3LFLbHHp4w4/qegeDrxg= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.117.0/go.mod h1:mH6Ffc14prL+GEeSBW7yCkqMTxE64b1BQLnHNxG0pMM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.117.0 h1:Mz4I1Kccj+UHnYBa/dJM2eCMXBz95MV1ELk1UqKre2A= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.117.0/go.mod h1:jYgogs1e88bxEDv0a3/yr7uvmElskxswsNpTj22F6dE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.117.0 h1:xkAn7xjemB3pzfH9auCsmuJu39tmgnFEv3txiYq51Ys= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.117.0/go.mod h1:2BXMWdK7P3acUSH+tdpF6JmUzfbwZeKA7ygc2XrN6mU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.117.0 h1:SjZHtgph6f675yK/p+GTo8I7VlIAjJFod3SMNgfpEAg= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/pdatautil v0.117.0/go.mod h1:e4cIzlw2iGmMCgHKyJHLf+PF99A1Y6GvNC0+E3x1dA4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.117.0 h1:vncYL4U8405wKerch+80TSMrqcGYEkfW8CSbOZAWBr4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.117.0/go.mod h1:3lvo2YKIyKrr2ZldMUhPaN4F8bRvGghNwoQKgyK9fNU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.117.0 h1:+KEb5xtnKkJh5mxXau34ibLthXhMeRQOyTMiI2AbHaY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/kafka/topic v0.117.0/go.mod h1:1q/L2R/28emNCz0EHfxEw853I6lPxTcHTqS+UrMea0k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.117.0 h1:HnkgGMpQKEW9z2bJaIyK1HQ7nETyOvTYYXEDLA1GR8E= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.117.0/go.mod h1:/xsh6bL6X7OcPwdWWApGJH3j4tMchr0e0NL8t1qgAXs= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.117.0 h1:/wMNk8w1UEHKpKoNk1jA2aifHgfGZE+WelGNrCf0CJ0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.117.0/go.mod h1:ESyMNHmgZYh8Ouhr2veecTMK6sB8gQ8u2s3dsy9Og6k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0 h1:GqlhXd6J8zgxCYenbI3ew03SJnGec1vEEGzGHw9X/Y0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.117.0/go.mod h1:OGylX+Bp+urSNNGoI1XG7U6vaRDZk1wN/w6fHP1F7IY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.117.0 h1:HJI0A1PxRMYduFfE/0GtHcd94o6uRa/4lD8lwVYMnlY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.117.0/go.mod h1:RLslZuVfHxjmvThGfyjzPrAJO2+bnEiM7laRA4efHq8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.117.0 h1:nf3xfBvVhvlby7D4YT82+1bTuHTKdZO8614ykSnjwhk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.117.0/go.mod h1:3lPvq3mRHg8foQO4wB/cHKxRCOJNCDZqzCoBDTuVazo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.117.0 h1:jwucV3KAIxEk52ESHnDvcUJ0BwNbu7T+cBB4sCFLEuA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.117.0/go.mod h1:FXdXb4aJbrAzFPpWFckbZUKj86jZIBRzF3PEQXJNeVM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.117.0 h1:6Ly4tQ502qTYyBYdvhPukffytHgXIn5F1469S1L+j+w= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.117.0/go.mod h1:AUUbtJw5om0NxjOPWFjZPzTSJHf6Fa42agazRmxYFoQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.117.0 h1:IgaGH6HLxv3UgrGKXzm/gJPta1Qnxa87WTcMlFp4gHc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.117.0/go.mod h1:HdsuR8/BlBdVx12wV88G7UJY9fniR0Gzv8CBEmNeFlo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.117.0 h1:h+MnAOD++8aWeEpKKf3wxes1usw+ioEe6AJkbYyM9c0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.117.0/go.mod h1:75JzWrbiFyoLLt1q527rH137T1reqEN4yjNXr+GURoc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.117.0 h1:Kfe96zbdcJjs4ffa1mgpgswGOfr2oeayf0jfons0DtU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.117.0/go.mod h1:wPHVx2H/BukRKANYRSVITk9wwT62elDg4HbxHNovgnE= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.117.0 h1:q/WMk0PPO+Lri67sSIs46kavU/tt89rQOm78Bak0AdU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/tailsamplingprocessor v0.117.0/go.mod h1:2i/8NNsJZr2mJGb1lq7GfNTt2PRJNuVfzIA4EB5NytE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.117.0 h1:II39WzwaFVzU7cDNL60xcEzxaymbEJ4zCA6Mz76phjc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.117.0/go.mod h1:WUz1ccnskld9mrTVoLp/TfI++Qrg0PTXmoceh51VWPE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.117.0 h1:0TtGso35PcqS8dqTI48MN8ehj3tyovOgwFgFc7ywvdA= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.117.0/go.mod h1:2bLb8fdBoH7Tpq76JVkZhLDOVv+D1q8Qvmp3OII8nXA= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.117.0 h1:ZukmPvZSJnDPvUH0ECDliYxyRgSMs6mWXnX70uGnhvk= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.117.0/go.mod h1:aZzeEf3lN/i6gH5vVGzLdzH6JO2r6xwep0S0fvW8iMI= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.117.0 h1:ZzESLZAIBZ3Z7e33WCUCdX2tDjxD1/A748aTmqReEvo= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.117.0/go.mod h1:zClB9Yr77xTGG2b2g4+EGpzdW84lPCTPemFWjsyJFMw= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= @@ -549,8 +549,8 @@ github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6g github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= -github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/shirou/gopsutil/v4 v4.24.12 h1:qvePBOk20e0IKA1QXrIIU+jmk+zEiYVVx06WjBRlZo4= +github.com/shirou/gopsutil/v4 v4.24.12/go.mod h1:DCtMPAad2XceTeIAbGyVfycbYQNBGk2P8cvDi7/VN9o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= @@ -617,138 +617,136 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector v0.116.0 h1:Dscd6Nsnc7hjFQosO0SofcPQsXRfcj5N5PjQAslnmj4= -go.opentelemetry.io/collector v0.116.0/go.mod h1:Ug2hpW0SINPmJAGVEALRlux78NTZc3YXSuh5/Q/hFrA= -go.opentelemetry.io/collector/client v1.22.0 h1:AAUzHuqYQqxoNqacw1WXgGF/MxtBTwNZuhBvJIorgA0= -go.opentelemetry.io/collector/client v1.22.0/go.mod h1:wcCSdTwbDVNTycoqs7BiDNVj3e1Ta7EnWH2sAofKnEk= -go.opentelemetry.io/collector/component v0.116.0 h1:SQE1YeVfYCN7bw1n4hknUwJE5U/1qJL552sDhAdSlaA= -go.opentelemetry.io/collector/component v0.116.0/go.mod h1:MYgXFZWDTq0uPgF1mkLSFibtpNqksRVAOrmihckOQEs= -go.opentelemetry.io/collector/component/componentstatus v0.116.0 h1:wpgY0H2K9IPBzaNAvavKziK86VZ7TuNFQbS9OC4Z6Cs= -go.opentelemetry.io/collector/component/componentstatus v0.116.0/go.mod h1:ZRlVwHFMGNfcsAywEJqivOn5JzDZkpe3KZVSwMWu4tw= -go.opentelemetry.io/collector/component/componenttest v0.116.0 h1:UIcnx4Rrs/oDRYSAZNHRMUiYs2FBlwgV5Nc0oMYfR6A= -go.opentelemetry.io/collector/component/componenttest v0.116.0/go.mod h1:W40HaKPHdBFMVI7zzHE7dhdWC+CgAnAC9SmWetFBATY= -go.opentelemetry.io/collector/config/configauth v0.116.0 h1:8Y5y18fxilLobjDqNHO5FvGhC5HKYupWhT1DB3KrFaw= -go.opentelemetry.io/collector/config/configauth v0.116.0/go.mod h1:2JZ5PRvNZcrBvPz1SjPWCwFQx7qXGVginb7AkFQu0iU= -go.opentelemetry.io/collector/config/configcompression v1.22.0 h1:B4UCZjW2IVootcEL3iZFnCp8BOhLKEnWkHXHSo23ewk= -go.opentelemetry.io/collector/config/configcompression v1.22.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= -go.opentelemetry.io/collector/config/configgrpc v0.116.0 h1:O8Y1X9wDH5dDdqDJ9kqoaMrxEauaDSJBg9aNC6QgB7g= -go.opentelemetry.io/collector/config/configgrpc v0.116.0/go.mod h1:RPrSQrr6xhIaAK2DdcECi142NjSo0npQfVQB3nommSo= -go.opentelemetry.io/collector/config/confighttp v0.116.0 h1:MLI88LmGzlN5D4pH6nFMg5hU3UCeTZb72iVx1lWb0c8= -go.opentelemetry.io/collector/config/confighttp v0.116.0/go.mod h1:iJzNYVOiE1V3lpOIZIkR3JJk3aX/RGp9+SEssJMJ/bY= -go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.116.0 h1:0s7Z7cHx50M6OJdWt9PgXklImUkAF2MVmWiClnj/zB8= -go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.116.0/go.mod h1:FYunjrmzqrTQ53Z3VGbZ9xcR3ewbRWEupp8151T1CQI= -go.opentelemetry.io/collector/config/confignet v1.22.0 h1:SBEMHJZWD8J4qgFw1O+BEkXW9AWldDi6Fz5YeDeoU58= -go.opentelemetry.io/collector/config/confignet v1.22.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= -go.opentelemetry.io/collector/config/configopaque v1.22.0 h1:CJgsm/Ynr2JE5Y66hYJBdybjHs20ywHtBHiV1jlI4yE= -go.opentelemetry.io/collector/config/configopaque v1.22.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= -go.opentelemetry.io/collector/config/configretry v1.22.0 h1:gKZeYPvCho1+pO6ePRXkloA2nKUUFnA+yBUSHfOzJPU= -go.opentelemetry.io/collector/config/configretry v1.22.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= -go.opentelemetry.io/collector/config/configtelemetry v0.116.0 h1:Vl49VCHQwBOeMswDpFwcl2HD8e9y94xlrfII3SR2VeQ= -go.opentelemetry.io/collector/config/configtelemetry v0.116.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= -go.opentelemetry.io/collector/config/configtls v1.22.0 h1:Bu+GZMBYCufYDF72Wup+3jIGNsHuQUvZpMEPjllmYus= -go.opentelemetry.io/collector/config/configtls v1.22.0/go.mod h1:CYFyMvbf10EoWhoFG8EYyxzFy4jcIPGIRMc8/HWLNQM= -go.opentelemetry.io/collector/config/internal v0.116.0 h1:RG4tvK6Ozzk/SBUPyTnGD+miya0U7Z7GSpCY92qIEUY= -go.opentelemetry.io/collector/config/internal v0.116.0/go.mod h1:OVkadRWlKAoWjHslqjWtBLAne8ceQm8WYT71ZcBWLFc= -go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= -go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= -go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0 h1:AdHaQo/GSSRLJvEFLCMHo02r+u6Ed8j0/MNz7u3noug= -go.opentelemetry.io/collector/confmap/provider/envprovider v1.22.0/go.mod h1:InKYEGFdkwz3H2q648kT6rMCFBhPvevIW9ZbWIY5QR4= -go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0 h1:upFhnU8EyPp0WMR53mJIdx+UR2EGFOr+ppYKzUCY/Vg= -go.opentelemetry.io/collector/confmap/provider/fileprovider v1.22.0/go.mod h1:FhjMWU5nf3IctX27lVZomM5SKMyRywShRsA4/rHoBe8= -go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0 h1:jKLicfZRiA+G/sgso26aM6Dmmva4Dx9Txk2R58+R3e8= -go.opentelemetry.io/collector/confmap/provider/httpprovider v1.22.0/go.mod h1:nZhEGDufHuZAaeVyFVz15IluXwrnQRCp+U/w7j8Lx9Y= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.22.0 h1:SJy1cv/ChsEL+xzggMG0G0jJTF7RGWm1cqJmpUra8k0= -go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.22.0/go.mod h1:VOil+29aaVqPwk4kYJdH23ocA0PC8EjKEGxAeEqk/GQ= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0 h1:dkiNwLxBqeNDN5fIwtvr2GoA0I2xZB2SEdQ9ceBbJVs= -go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.22.0/go.mod h1:P9SxKZvim1C3K1R2j3gI+Qb4/l9MffX2sY5f9ajsk7Y= -go.opentelemetry.io/collector/connector v0.116.0 h1:0Pz8RAXH1swLeA1fiyGGQWdv0Kemz4mbq+jnmd1TACE= -go.opentelemetry.io/collector/connector v0.116.0/go.mod h1:VQiZ2yW9KhZuF0yjDbvlgrAxm7+o8KQoxHxurQWLjKU= -go.opentelemetry.io/collector/connector/connectortest v0.116.0 h1:MdttvjqdZmp0ewW5IPCEtzzYmCqxrQxsjJ5m6gMVjzA= -go.opentelemetry.io/collector/connector/connectortest v0.116.0/go.mod h1:ko7aPyvAVf6SvRhWGZdPXSyk+7zPmsSCcMq0gYPMMIQ= -go.opentelemetry.io/collector/connector/forwardconnector v0.116.0 h1:USMDkZwMH9hlQ95Eh1Y4WLKF3IbR8cZJ2tna9165zXo= -go.opentelemetry.io/collector/connector/forwardconnector v0.116.0/go.mod h1:GLhaRzl3W75GApUGut1jo77Q/tOHnSRf7E2/xsbR9KM= -go.opentelemetry.io/collector/connector/xconnector v0.116.0 h1:fFJzrRco0g7HMkhnQ+ehlvicFf58vzsCLXnfuHyQM8w= -go.opentelemetry.io/collector/connector/xconnector v0.116.0/go.mod h1:m9oCk32zX6wDciYBpy+qMQkWKtOxb0gAkEUm8+trflY= -go.opentelemetry.io/collector/consumer v1.22.0 h1:QmfnNizyNZFt0uK3GG/EoT5h6PvZJ0dgVTc5hFEc1l0= -go.opentelemetry.io/collector/consumer v1.22.0/go.mod h1:tiz2khNceFAPokxxfzAuFfIpShBasMT2AL2Sbc7+m0I= -go.opentelemetry.io/collector/consumer/consumererror v0.116.0 h1:GRPnuvwxUeHKVTRzy35di8OFlxypY4YWrK+1nWMsExM= -go.opentelemetry.io/collector/consumer/consumererror v0.116.0/go.mod h1:OvQvQ2V7sHT4Vz+1/4mwdEajWZNoFUsY1NhOM8rGvXo= -go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0 h1:sSPDz4Qu7H86SrxtE6sQHDuWjFkTWHdKyGdsxhjZzcw= -go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.116.0/go.mod h1:0K7jbkCWtydn1IA3JwAUJeLVL79tJTxWoXR2gYTnCk0= -go.opentelemetry.io/collector/consumer/consumertest v0.116.0 h1:pIVR7FtQMNAzfxBUSMEIC2dX5Lfo3O9ZBfx+sAwrrrM= -go.opentelemetry.io/collector/consumer/consumertest v0.116.0/go.mod h1:cV3cNDiPnls5JdhnOJJFVlclrClg9kPs04cXgYP9Gmk= -go.opentelemetry.io/collector/consumer/xconsumer v0.116.0 h1:ZrWvq7HumB0jRYmS2ztZ3hhXRNpUVBWPKMbPhsVGmZM= -go.opentelemetry.io/collector/consumer/xconsumer v0.116.0/go.mod h1:C+VFMk8vLzPun6XK8aMts6h4RaDjmzXHCPaiOxzRQzQ= -go.opentelemetry.io/collector/exporter v0.116.0 h1:Ps8sLPiGqJ4XGfmAVR6sxrtNBQOqAaWJvgqEOGxTvUU= -go.opentelemetry.io/collector/exporter v0.116.0/go.mod h1:9alTWZILqY8Y3L/YLdJHFA0sx/LJDgZZjng0PHsIJkU= -go.opentelemetry.io/collector/exporter/debugexporter v0.116.0 h1:NCVGIkaA0eSDZPg0/NdWt7ivUmVukPVEixBDTulMa08= -go.opentelemetry.io/collector/exporter/debugexporter v0.116.0/go.mod h1:QZL/MKrgErI7O64ams2lmsQduLOkw/SLmtvS7W+iQNo= -go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0 h1:BzMvZf9RKRcQPFjGnQSEWvfI5Er9kXfzyZ/4GHkUTa4= -go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.116.0/go.mod h1:RCbA3MNnZPTy2mViwQxMlnrq5moJ1XgetNQx2XHIpaI= -go.opentelemetry.io/collector/exporter/exportertest v0.116.0 h1:2XEiNkBtvOq2+KzjM3OA92vlDATAi1Nn+xT9GT74QQc= -go.opentelemetry.io/collector/exporter/exportertest v0.116.0/go.mod h1:t3CYc//OqP5pxpIN/5tYJhVP/mmtyoc5vHkBCau2IkM= -go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0 h1:2yA8fUW0R0hml2OFxfCmSdtdqpfCLqBGazJ8eALajgU= -go.opentelemetry.io/collector/exporter/otlpexporter v0.116.0/go.mod h1:hbK5ggV3hjsjdifV7oUQKhbjg0ijgIeK9BHixTAzuYo= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0 h1:NKd1T+TfCss0Qo0RlkN2C30AO2/6ceHS0q+97hpQhI8= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.116.0/go.mod h1:ev8EFap0FyqEUe02sct8Aon4ctlCANcsHrIxROH1jTU= -go.opentelemetry.io/collector/exporter/xexporter v0.116.0 h1:z97GOTSJu4qMkp21yeUWAo6gskMEJi2j8vdnakLcKgI= -go.opentelemetry.io/collector/exporter/xexporter v0.116.0/go.mod h1:9wWrMBpX6/s3dSx4mLf+QeEA8ZpYts4GdQkv4BOXEEg= -go.opentelemetry.io/collector/extension v0.116.0 h1:/PYrsAqb87XlC1Cra7I3mU6CDs+TAjqj7LO/9tXX9qk= -go.opentelemetry.io/collector/extension v0.116.0/go.mod h1:OF8pL6ioyT+f2V0CsEaM1EAmqaEMNCIgw7DS4agcOcc= -go.opentelemetry.io/collector/extension/auth v0.116.0 h1:oolKkFBIS4vhJ4ZWTD4Bp+35ATBf7dBsln63RKWAJm0= -go.opentelemetry.io/collector/extension/auth v0.116.0/go.mod h1:3WeZgIiiP7wcB+tID4G3ml6J/R2oJ359PxQh/pUFnSk= -go.opentelemetry.io/collector/extension/auth/authtest v0.116.0 h1:KcMvjb4R0wpkmmi7EOk7zT5sgl7uwXY/VQfMEUVYcLM= -go.opentelemetry.io/collector/extension/auth/authtest v0.116.0/go.mod h1:zyWTdh+CUKh7BbszTWUWp806NA6EDyix77O4Q6XaOA8= -go.opentelemetry.io/collector/extension/experimental/storage v0.116.0 h1:Pb0ljtJMtsdiJoLOWbtVIYAViLkcZUF3V9MUNHyzn1c= -go.opentelemetry.io/collector/extension/experimental/storage v0.116.0/go.mod h1:AQgDz5IJB4d9PExwV6RTlYkiVGp05/+/TAR9gCJpPJA= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0 h1:bXDgoiDiwFfrO5S6q1Wpe0su303CW4Qxthoy4CxG6eg= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.116.0/go.mod h1:uFZlAPxk2+s6zk1W+u22DgxxSDugWy0QaY5kQzjNy7Q= -go.opentelemetry.io/collector/extension/extensiontest v0.116.0 h1:NEPis256V4pFVocdZH6gOdsGDueyOe9vvx/BE9QxMf0= -go.opentelemetry.io/collector/extension/extensiontest v0.116.0/go.mod h1:rpb4W2OimGXY5Oalk/NCemoPhgM03JZxBjXvlIveH5I= -go.opentelemetry.io/collector/extension/zpagesextension v0.116.0 h1:D0VY/ESPwkREfMaqJleGVTiCYoCs3MDipU93ywaIn68= -go.opentelemetry.io/collector/extension/zpagesextension v0.116.0/go.mod h1:MqkQSYKarMrjVSyGrAes1FBcsW6HDDPj/ouvcDvSjfk= -go.opentelemetry.io/collector/featuregate v1.22.0 h1:1TUcdqA5VpEsX1Lrr6GG15CptZxDXxiu5AXgwpeNSR4= -go.opentelemetry.io/collector/featuregate v1.22.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= -go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0 h1:KKFb3u8iLk4V5GYz7eVpw8QgEdob5koX6GNEbaoDQJY= -go.opentelemetry.io/collector/internal/fanoutconsumer v0.116.0/go.mod h1:YyWHUWeSnRmy2CF7kPHpwJ6qkVjufbLZ8PYuY0Ph0o8= -go.opentelemetry.io/collector/internal/memorylimiter v0.116.0 h1:xLt/2jPHvaWQiNle66DsTz3kRbWoQ93AEMfSeKyCdN0= -go.opentelemetry.io/collector/internal/memorylimiter v0.116.0/go.mod h1:12KU4unWjF3nxrpOuuTi4TGK3KaD+kzmgA2Vd86MhWU= -go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0 h1:5QhpnwgogQhBrcsOjk1Yhkugopj043XlSDB1lpHKCGo= -go.opentelemetry.io/collector/internal/sharedcomponent v0.116.0/go.mod h1:wMQM1Sqbj6J6jNVBb5hawkCfmqrLJ0hAeDKkalUfrEY= -go.opentelemetry.io/collector/otelcol v0.116.0 h1:8NoPEY2uAemwNzUcMxiZuuI8w/Ff+0p1DXXk6NVEGlk= -go.opentelemetry.io/collector/otelcol v0.116.0/go.mod h1:c/EhsBdHmC44SxhWMi7pTlYB+I6GBSJNBsj9NCwXMxM= -go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= -go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= -go.opentelemetry.io/collector/pdata/pprofile v0.116.0 h1:iE6lqkO7Hi6lTIIml1RI7yQ55CKqW12R2qHinwF5Zuk= -go.opentelemetry.io/collector/pdata/pprofile v0.116.0/go.mod h1:xQiPpjzIiXRFb+1fPxUy/3ygEZgo0Bu/xmLKOWu8vMQ= -go.opentelemetry.io/collector/pdata/testdata v0.116.0 h1:zmn1zpeX2BvzL6vt2dBF4OuAyFF2ml/OXcqflNgFiP0= -go.opentelemetry.io/collector/pdata/testdata v0.116.0/go.mod h1:ytWzICFN4XTDP6o65B4+Ed52JGdqgk9B8CpLHCeCpMo= -go.opentelemetry.io/collector/pipeline v0.116.0 h1:o8eKEuWEszmRpfShy7ElBoQ3Jo6kCi9ucm3yRgdNb9s= -go.opentelemetry.io/collector/pipeline v0.116.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= -go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0 h1:PFNy+Il/kqPdPL9rhG+1kG63Aauya+FhBKGXoB6ivxU= -go.opentelemetry.io/collector/pipeline/xpipeline v0.116.0/go.mod h1:bVn9V4TGyeXi58/JDkeXCuKtc+V+qcOoTl8hNpV0qa8= -go.opentelemetry.io/collector/processor v0.116.0 h1:Kyu4tPzTdWNHtZjcxvI/bGNAgyv8L8Kem2r/Mk4IDAw= -go.opentelemetry.io/collector/processor v0.116.0/go.mod h1:+/Ugy48RAxlZEXmN2cw51W8t5wdHS9No+GAoP+moskk= -go.opentelemetry.io/collector/processor/batchprocessor v0.116.0 h1:jZMC+jlay3xCBBjcL85oT8nMFB5B3zvvwS6lW6xVGAc= -go.opentelemetry.io/collector/processor/batchprocessor v0.116.0/go.mod h1:KmLVhDjnatsZm5xQkgRLl12lwvHohmk3djJXfu8m33c= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0 h1:7YwVMfpr0igtILydBFDXJsEGskI/4FIKPqc0hGIjJIE= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.116.0/go.mod h1:nMEGCezCKUedDmxTLNL9cpFUhG2ku8ThNn7t/wfKWI0= -go.opentelemetry.io/collector/processor/processortest v0.116.0 h1:+IqNEVEE0E2MsO2g7+Y/9dz35sDuvAXRXrLts9NdXrA= -go.opentelemetry.io/collector/processor/processortest v0.116.0/go.mod h1:DLaQDBxzgeeaUO0ULMn/efos9PmHZkmYCHuxwCsiVHI= -go.opentelemetry.io/collector/processor/xprocessor v0.116.0 h1:iin/UwuWvSLB7ZNfINFUYbZ5lxIi1NjZ2brkyyFdiRA= -go.opentelemetry.io/collector/processor/xprocessor v0.116.0/go.mod h1:cnA43/XpKDbaOmd8buqKp/LGJ2l/OoCqbR//u5DMfn8= -go.opentelemetry.io/collector/receiver v0.116.0 h1:voiBluWLwe4lbyLVwxloK6CudqqszWF+bgYKHuxnETU= -go.opentelemetry.io/collector/receiver v0.116.0/go.mod h1:zb6m8l+knUuN62ASCDqQPIm9punK8PEX1mFrF/yzMI8= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0 h1:81u+wJsQp9VfrAdVpVvcV31YAs8qsZp/UnMmG9YCJ0A= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.116.0/go.mod h1:JXIwjUyh3Q+gNvr7YE937se4/E4UJ/oz5z9xbJeVl3M= -go.opentelemetry.io/collector/receiver/receivertest v0.116.0 h1:ZF4QVcots0OUiutblkyPR02pc+g7v1QaJSFW8tOzHoQ= -go.opentelemetry.io/collector/receiver/receivertest v0.116.0/go.mod h1:7GGvtHhW3o6457/wGtSWXJtCtlW6VGFUZSlf6wboNTw= -go.opentelemetry.io/collector/receiver/xreceiver v0.116.0 h1:Kc+ixqgMjU2sHhzNrFn5TttVNiJlJwTLL3sQrM9uH6s= -go.opentelemetry.io/collector/receiver/xreceiver v0.116.0/go.mod h1:H2YGSNFoMbWMIDvB8tzkReHSVqvogihjtet+ppHfYv8= -go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= -go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= -go.opentelemetry.io/collector/service v0.116.0 h1:1rFmax3ILOlQq4bW//0VKRcG/HmN2rxrgfTybn6bisU= -go.opentelemetry.io/collector/service v0.116.0/go.mod h1:CzQzj72mWr5arag+q8uUWGRuUkenNo5Gw9oA97SFZ78= +go.opentelemetry.io/collector v0.117.0 h1:nj/Q89KGmev1l4YxWJt4JH3+fV1YFmci9MRmr9bULf4= +go.opentelemetry.io/collector v0.117.0/go.mod h1:z8XawVuKONaUkJW5w1GrfAXokrgxdF8mGtekK0sFIyQ= +go.opentelemetry.io/collector/client v1.23.0 h1:X11yEZ2T3T1Cr1CfDPI0xjZgw7ekes7CVbF/NVYxGG0= +go.opentelemetry.io/collector/client v1.23.0/go.mod h1:pfhOGJ13n5xH3HgmFwUHa1nBE1kCIa9X/DLTJVxtbVM= +go.opentelemetry.io/collector/component v0.117.0 h1:A3Im4PqLyfduAdVyUgbOZdUs7J/USegdpnkoIAOuN3Y= +go.opentelemetry.io/collector/component v0.117.0/go.mod h1:+SxJgeMwNV6y3aKNR2sP0PfovcUlRwC0+pEv4tTYdXA= +go.opentelemetry.io/collector/component/componentstatus v0.117.0 h1:8PGN66p9o5L7xCfT4jDJHd3d2VdtIuzPU2mEXOSONt8= +go.opentelemetry.io/collector/component/componentstatus v0.117.0/go.mod h1:u8tVDI+S9TxBa5NtxJNdxqjI0CLIzbmqbRl9DPrdR/0= +go.opentelemetry.io/collector/component/componenttest v0.117.0 h1:r3k0BsU/cJlqVQRtgFjxfduNEGaM2qCAU7JitIGkRds= +go.opentelemetry.io/collector/component/componenttest v0.117.0/go.mod h1:MoBWSGb3KwGc5FAIO+htez/QWK2uqJ4fnbEnfHB384c= +go.opentelemetry.io/collector/config/configauth v0.117.0 h1:o+sEz1aeS01XD3procwMmvDAhGHFFH1dxmC6XHwxG6s= +go.opentelemetry.io/collector/config/configauth v0.117.0/go.mod h1:oWkIayfVGS/ED6jEDTILSypW8MVNZ/bHd11lXrt7fsQ= +go.opentelemetry.io/collector/config/configcompression v1.23.0 h1:KCEztOb+2L4+dUCCadOW/byRiw7LbgguNqHD5LxJcwY= +go.opentelemetry.io/collector/config/configcompression v1.23.0/go.mod h1:LvYG00tbPTv0NOLoZN0wXq1F5thcxvukO8INq7xyfWU= +go.opentelemetry.io/collector/config/configgrpc v0.117.0 h1:ELxoFoZxNDxb/YQJuku6JWL5TRQT+exsrTGrCoZeyrk= +go.opentelemetry.io/collector/config/configgrpc v0.117.0/go.mod h1:l916AszIpA12JiqCG5RNPgBgm5oimc4yeVPEUOOD/G4= +go.opentelemetry.io/collector/config/confighttp v0.117.0 h1:0BRGo1aivqIsGtAMmxTZ0u3rlGJ073+iyHD5RvUOtQk= +go.opentelemetry.io/collector/config/confighttp v0.117.0/go.mod h1:iNCp62v5k9SPTOdOxQlPfs/4gLGh7YLGpjP//9uvT0A= +go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.117.0 h1:knInqtall94PxYd9B9Pm9Ux5nSmckE/JdDi4YJsiork= +go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.117.0/go.mod h1:/dzyZPm5gN/NjOR9fbtBMcrD8zsoY0uffUPrbOpksIY= +go.opentelemetry.io/collector/config/confignet v1.23.0 h1:gq90GDgQFSjAeFkDeIkstkBwYrD8feUjqEWCrIJhFGA= +go.opentelemetry.io/collector/config/confignet v1.23.0/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc= +go.opentelemetry.io/collector/config/configopaque v1.23.0 h1:SEnEzOHufGc4KGOjQq8zKIQuDBmRFl9ncZ3qs1SRpJk= +go.opentelemetry.io/collector/config/configopaque v1.23.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= +go.opentelemetry.io/collector/config/configretry v1.23.0 h1:0Ox2KvTZyNdgureAs3kJzsNIa6ttrx9bwlKjj/p4fGU= +go.opentelemetry.io/collector/config/configretry v1.23.0/go.mod h1:cleBc9I0DIWpTiiHfu9v83FUaCTqcPXmebpLxjEIqro= +go.opentelemetry.io/collector/config/configtelemetry v0.117.0 h1:xsMfc89VByIF2fJzWuxs/2eqy44DWfNBAysReG4TAr8= +go.opentelemetry.io/collector/config/configtelemetry v0.117.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtls v1.23.0 h1:52q9dAV923hHn1aoYQyKGnrRXCPvTTT3DXurtxcpZaQ= +go.opentelemetry.io/collector/config/configtls v1.23.0/go.mod h1:cjMoqKm4MX9sc9qyEW5/kRepiKLuDYqFofGa0f/rqFE= +go.opentelemetry.io/collector/confmap v1.23.0 h1:EY+auc0kbyZ4HIfkLYeJyLDCZIFzMA1u8QRGW4bC1Ag= +go.opentelemetry.io/collector/confmap v1.23.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.23.0 h1:b1aZxceRYYH1wXqqVHYZpepiVKYy8WJ27NHq/KQFQJs= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.23.0/go.mod h1:c1zdel/NZJumOWY8RhKfOuF/uxihNxQrJzBQcnY0HFw= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.23.0 h1:2CwU9PZLCP76iNTk6vP1CN3BA1C9OnnebpCE0WQf6F4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.23.0/go.mod h1:tDUen3bEdWlgJtJEc2OrNV6sTfR/QkImyAFlxUXcplY= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.23.0 h1:CdGl8CI5rnbAhNIJwisCKvKEiqOKWTZqnsQ2WqcCPs8= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.23.0/go.mod h1:lvljQaUjATZhFghYNPGNjIO3lsedzv7lOlkQfOdiung= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.23.0 h1:LhAmpmjCVSmiusk0lymvSxkYPy1praMHwGhNdnUJVFw= +go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.23.0/go.mod h1:89KFhIqvcjibD2yduEHmkl9w0fzVQgOh4NP0p293reU= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.23.0 h1:ZaK8+EcQxlYZZgJn7ew700AUhH9CpXA3VBn46OHHEHk= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.23.0/go.mod h1:WrlXU+lshUTmsgyacD7jijs0Nh85Xf0xU/0sqtkHDNs= +go.opentelemetry.io/collector/connector v0.117.0 h1:7MM6FOrquYyLSftp3vJSeahRLcVcJ+EwgsqZpsPtGas= +go.opentelemetry.io/collector/connector v0.117.0/go.mod h1:Qp3KAr/S3vMjOtWG5tZxQ+6JgFFYBUzFx6xzM6Xt30A= +go.opentelemetry.io/collector/connector/connectortest v0.117.0 h1:tRes8VpoYEXbOZtT5NQdYhWd7PyHy4N3R/9M2VMZt7U= +go.opentelemetry.io/collector/connector/connectortest v0.117.0/go.mod h1:rb7ax+hQzL2fiUFI9QpfOPQX2S6GfJlyxjT4tsIYODQ= +go.opentelemetry.io/collector/connector/forwardconnector v0.117.0 h1:o/mEDiT9u4/oz8HxOrH1LuNeAHaLxwdzFg5KpXmPXCY= +go.opentelemetry.io/collector/connector/forwardconnector v0.117.0/go.mod h1:pd63uPffWTcKEGqovAzN3INXSmgDaMo76WhZAGz0qr0= +go.opentelemetry.io/collector/connector/xconnector v0.117.0 h1:H4tTVBKDW9bfEJ+6p6ZDIdN7yUkGl59ELs0+46UtQ78= +go.opentelemetry.io/collector/connector/xconnector v0.117.0/go.mod h1:aAfKBBFnJrPgKC653Lt1gwfTDbSZUuTY4TPI7Fcv9MM= +go.opentelemetry.io/collector/consumer v1.23.0 h1:JT0nE1vikL5yIk97IHBGzwx8co3w1WsAd3GFEl8r9XA= +go.opentelemetry.io/collector/consumer v1.23.0/go.mod h1:8d0uQ6gq64LbPktV4sc888lRj1cQCmrdl13hRIEURgA= +go.opentelemetry.io/collector/consumer/consumererror v0.117.0 h1:PPIZCcYZcENnyIrpRV4ERvMUoPSTV0zIP0QPzJvz80g= +go.opentelemetry.io/collector/consumer/consumererror v0.117.0/go.mod h1:L47xOVC+Vzos8350j3SWtU43w7rzms6UDhb6IrFxymY= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.117.0 h1:gT9VUzerc4rSRUDMEBQdrgBxbrpjinoa4Oxo5qlj6gw= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.117.0/go.mod h1:AzJIPm65RpEeoQk8OuQ4HLT6QQPDNrWWKk8IEaNBiIQ= +go.opentelemetry.io/collector/consumer/consumertest v0.117.0 h1:9WFyyjLudvfJDEuUaGsQyNRd1m6D1iRg8Iyg3xliFko= +go.opentelemetry.io/collector/consumer/consumertest v0.117.0/go.mod h1:B7A+OS76QKAzM8W7cmvlfVynFELj9Sa444hSm1SILFw= +go.opentelemetry.io/collector/consumer/xconsumer v0.117.0 h1:vsBNJGaEbYqgMU3PEsOcqjMxX5ul++Cxda44sttoi8c= +go.opentelemetry.io/collector/consumer/xconsumer v0.117.0/go.mod h1:dTr+Tms53lRLvR3OAzYic0yhcwldhTUdVIwJNSDmBmw= +go.opentelemetry.io/collector/exporter v0.117.0 h1:A9kVXzdb8i1eFELImuaSPyijAfg4qMIpM/4y/98mlxk= +go.opentelemetry.io/collector/exporter v0.117.0/go.mod h1:Cbrorch2s18w1X7+A+zXQtAffbInnIOP7Su26gbRG+k= +go.opentelemetry.io/collector/exporter/debugexporter v0.117.0 h1:/ZLnlpKulaeqHAudVL+cfupfgETxpuiANaqaffJ3e10= +go.opentelemetry.io/collector/exporter/debugexporter v0.117.0/go.mod h1:gAFxD8cSJMx1GRB/6XwfFRapCD0CsP6MpkQx892NyNY= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.117.0 h1:1e991aHPgSvWFMOFFir40HANg2SkXcrkG4AlRvK2+KI= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.117.0/go.mod h1:TkPEGX28zDvGAqlJRZQhKohG+82iN2lWPjF+dTuzS9Q= +go.opentelemetry.io/collector/exporter/exportertest v0.117.0 h1:u+loeqxpniMiJL1iqc/lCCcfniWrqHBgJTAjXfqVBqQ= +go.opentelemetry.io/collector/exporter/exportertest v0.117.0/go.mod h1:GyHwJLsOPPau0m+TYrIA7jWD9/GU+ID+l/9sL0cAqhE= +go.opentelemetry.io/collector/exporter/otlpexporter v0.117.0 h1:A/qDjii7WN2Wdx+gtdLvSVpPu8to6ogVutxIggNBEio= +go.opentelemetry.io/collector/exporter/otlpexporter v0.117.0/go.mod h1:rW4Re7GGCPB4JwZoZjXaPqJ77GEIr8OjTz5YK59avJM= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.117.0 h1:sEpFjth0x9/gZ6JJfNce1T8RJuNzUWKnDU0TKcejKl0= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.117.0/go.mod h1:K1A36IRdkEktqESw1FioXuvzMYbQPmiju5T26UIo0Sc= +go.opentelemetry.io/collector/exporter/xexporter v0.117.0 h1:BB8D0Dvb46CVAZrnPEg5nYgXO7LzONmXeGKEfzSIOZs= +go.opentelemetry.io/collector/exporter/xexporter v0.117.0/go.mod h1:yo0T8WkvLCJ7NOqIquHGFe4Xpuc4CbDb8a06T2G5De4= +go.opentelemetry.io/collector/extension v0.117.0 h1:B3cG7g+wbhmpMFugaDxOcyiPKeulaW8+EQdJbZxDfho= +go.opentelemetry.io/collector/extension v0.117.0/go.mod h1:WjyD5h9N5Y0SF8azB2rulvHJieJoWqroGO5hi3ax5+8= +go.opentelemetry.io/collector/extension/auth v0.117.0 h1:tXQdYIdcABXalWyFZP22pREY7+nWUNurx8Y6FseWs7w= +go.opentelemetry.io/collector/extension/auth v0.117.0/go.mod h1:ofrV2BuE46+k7Su/h0ccrMl5Zk5Y7NVlzOb3AwU7Dzw= +go.opentelemetry.io/collector/extension/auth/authtest v0.117.0 h1:wV4OIiWrt7gteQrxL8MCmGvjGhMiu5TplKJHOfVZO6Y= +go.opentelemetry.io/collector/extension/auth/authtest v0.117.0/go.mod h1:nHxcAOyo26JnuYwKIoQM9mDlSXpERQrbjIw3Dtp9hug= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.117.0 h1:YbCF0s0jywLZgwNUyKdPUMLMZs3nUPm1tGvJz8x6wTU= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.117.0/go.mod h1:VArn6UKAy4pqlATfhDFfc8UOwX/TtavPF5pgAL70AEw= +go.opentelemetry.io/collector/extension/extensiontest v0.117.0 h1:XH+tkHdATylYZtASZKK3rCoN/xlaFi8MXLh07ZlQQWw= +go.opentelemetry.io/collector/extension/extensiontest v0.117.0/go.mod h1:ABqB9D41p4MCeGVmABOgJi7i7roWZlFbqeFJDy7lskQ= +go.opentelemetry.io/collector/extension/xextension v0.117.0 h1:ADUKWHGaVvvmebJHiNRuX6YAfQXFDW/UaXK9W1hCo1k= +go.opentelemetry.io/collector/extension/xextension v0.117.0/go.mod h1:BmR8xN7Ja+El4IJ9aVmtON2miudjsbq2COZ9azVXsNg= +go.opentelemetry.io/collector/extension/zpagesextension v0.117.0 h1:TNSMgnCYZ1He2ANJQDoBEQ2tuHMa97qM5cpLErNLous= +go.opentelemetry.io/collector/extension/zpagesextension v0.117.0/go.mod h1:c82ly0hN5nMEtXY9mNdS9xVToYxbUjXblnXZCoICwCc= +go.opentelemetry.io/collector/featuregate v1.23.0 h1:N033ROo85qKrsK16QzR6RV+3UWOWF7kpOO8FSnX99s0= +go.opentelemetry.io/collector/featuregate v1.23.0/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.117.0 h1:IfObXF9WEixWA9baPt0d4GOv8XGxmlsX7oAyD9Gdq/4= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.117.0/go.mod h1:n+hmwNk4CbOTmQyUo1K4CEnCGcrPd7RY3E6ljrQ2GYo= +go.opentelemetry.io/collector/internal/memorylimiter v0.117.0 h1:D1VzSopWxegkaOyqprh9/DOsfb+Nb2oFp/4xP5UI6F8= +go.opentelemetry.io/collector/internal/memorylimiter v0.117.0/go.mod h1:cva7zIC6wfciMRk4z7zCIWpfiUoA7Hx3ZR1Op4BPP+0= +go.opentelemetry.io/collector/internal/sharedcomponent v0.117.0 h1:mk+qZO2HpNny3FuYeb4mjL4mbrEfkJN5untocHA8AqM= +go.opentelemetry.io/collector/internal/sharedcomponent v0.117.0/go.mod h1:Hlzn5+54tgYchP3OJz/YMnrbMNHX8PggDpZFlDTB2kQ= +go.opentelemetry.io/collector/otelcol v0.117.0 h1:BWmXS+Qh8ypu95w5PKz4NEcyRfX9TzoXQaqD6antji8= +go.opentelemetry.io/collector/otelcol v0.117.0/go.mod h1:jbEizqJKjZ1Q7XIbKvYc+vF2sxW5aw0LO7U8wj7wysM= +go.opentelemetry.io/collector/pdata v1.23.0 h1:tEk0dkfB8RdSukoOMfEa8duB938gfZowdfRkrJxGDrw= +go.opentelemetry.io/collector/pdata v1.23.0/go.mod h1:I2jggpBMiO8A+7TXhzNpcJZkJtvi1cU0iVNIi+6bc+o= +go.opentelemetry.io/collector/pdata/pprofile v0.117.0 h1:AyOK+rkNGeawmLGUqF84wYks22BSGJtEV++3YSfvD1I= +go.opentelemetry.io/collector/pdata/pprofile v0.117.0/go.mod h1:eh7TLIkLrSI79/R3RL+sZsKpLS0k+83WntucPtXC5Ak= +go.opentelemetry.io/collector/pdata/testdata v0.117.0 h1:ainpacShKHaDkPK6lcvgJ0aPKYUD/E3+I0gYJZleedo= +go.opentelemetry.io/collector/pdata/testdata v0.117.0/go.mod h1:LZAymmRKHQEqJqJUSO15rej3+V1rNRyBMF5mWCKCMBY= +go.opentelemetry.io/collector/pipeline v0.117.0 h1:CSv0Dd3n9AQNQ73e7PdEkgexkSMRZliKATxkoZKUFcY= +go.opentelemetry.io/collector/pipeline v0.117.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline/xpipeline v0.117.0 h1:jnHQNaNfVRIdrtOPCORUy8s1cEJyxql3uv/WQ1ve1Js= +go.opentelemetry.io/collector/pipeline/xpipeline v0.117.0/go.mod h1:lNY3uQjRcb3f7CW1JQMXJcWzCJp5122LOKrKs5eito8= +go.opentelemetry.io/collector/processor v0.117.0 h1:K4WdaNC5ROIoLRGgyHmXxtw7xVpAMR4cIMQ5PVLP5cI= +go.opentelemetry.io/collector/processor v0.117.0/go.mod h1:4ewsyJD4n8GjFN+mFbxgr7uXLZYNcJEnH3wl47aDV7s= +go.opentelemetry.io/collector/processor/batchprocessor v0.117.0 h1:8ZhMNrrGswaL423Gy7+B4H8qAxuUvaCnc3vdjcJJuGs= +go.opentelemetry.io/collector/processor/batchprocessor v0.117.0/go.mod h1:ghiVjd377WltMOybbzcwtg1XqFFS33FzLmWbXbTJ0Ss= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.117.0 h1:WQFkiU2X04b8+wFSI8MTIt8m1ZRrQj0vROkgOLOu7VE= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.117.0/go.mod h1:yrZs8KUYMEnJetlAvKNa2QI9Fw10alkpurZrj/RtEes= +go.opentelemetry.io/collector/processor/processortest v0.117.0 h1:c2zjsm3nQDkq9GErzhczN7psGI5Wk0eqXM5LGrX3wxg= +go.opentelemetry.io/collector/processor/processortest v0.117.0/go.mod h1:nywNHogkxp++ab3QkXpWKlv41Gkm9cAYB4PHvyoHwjs= +go.opentelemetry.io/collector/processor/xprocessor v0.117.0 h1:yGBjlY8HRb2AqYo1Q8pKJOLRbmZKrjeeTO4COiP45OU= +go.opentelemetry.io/collector/processor/xprocessor v0.117.0/go.mod h1:MnyEaS47cqol7Cph6LnYIp0g2Km4M+I1vWTwiDeuBN0= +go.opentelemetry.io/collector/receiver v0.117.0 h1:jm+b2G2IKKwGE213lB9cviKEdeATvYtNSY1kO0XdpMM= +go.opentelemetry.io/collector/receiver v0.117.0/go.mod h1:fZXigB3afp54OE+ogPcup/RPwI7j+CwZh9Mz6ObB/Cg= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.117.0 h1:Ezv4K3TGcQ5sd6lj0QsemjUeO+5RTnSsfodfPyjHo2o= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.117.0/go.mod h1:EHUqhKkoxAC0qPcONZvOcSCnqRLIfY6ORZ3OFm/Z4Ag= +go.opentelemetry.io/collector/receiver/receivertest v0.117.0 h1:aN4zOuWsiARa+RG9f89JyIrJbx5wsQ71Y0giiHsO1z8= +go.opentelemetry.io/collector/receiver/receivertest v0.117.0/go.mod h1:1wnGEowDmlO89feq1P+b4tQI2G/+iJxRrMallw7zeJE= +go.opentelemetry.io/collector/receiver/xreceiver v0.117.0 h1:HJjBj6P3/WQoYaRKZkWZHnUUCVFpBieqGKzKHcT6HUw= +go.opentelemetry.io/collector/receiver/xreceiver v0.117.0/go.mod h1:K1qMjIiAg6i3vHA+/EpM8nkhna3uIgoEellE2yuhz7A= +go.opentelemetry.io/collector/semconv v0.117.0 h1:SavOvSbHPVD/QdAnXlI/cMca+yxCNyXStY1mQzerHs4= +go.opentelemetry.io/collector/semconv v0.117.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/service v0.117.0 h1:yx3ZwnjHcL1YAWZDK2Kxco1BSB228+RaCwgmMzXykqE= +go.opentelemetry.io/collector/service v0.117.0/go.mod h1:Mtxu9Qn/90kdRrEqRr6n7MbtnW6qF1qCIi/u2LMYrRo= go.opentelemetry.io/contrib/bridges/otelzap v0.6.0 h1:j8icMXyyqNf6HGuwlYhniPnVsbJIq7n+WirDu3VAJdQ= go.opentelemetry.io/contrib/bridges/otelzap v0.6.0/go.mod h1:evIOZpl+kAlU5IsaYX2Siw+IbpacAZvXemVsgt70uvw= go.opentelemetry.io/contrib/config v0.10.0 h1:2JknAzMaYjxrHkTnZh3eOme/Y2P5eHE2SWfhfV6Xd6c= @@ -817,6 +815,10 @@ golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -838,6 +840,10 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -859,6 +865,11 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -870,6 +881,10 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -895,11 +910,21 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 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/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -908,6 +933,10 @@ 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.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= @@ -925,6 +954,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -953,8 +985,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= -google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= @@ -964,8 +996,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= -google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/jptrace/attributes.go b/internal/jptrace/attributes.go new file mode 100644 index 00000000000..0a570105f38 --- /dev/null +++ b/internal/jptrace/attributes.go @@ -0,0 +1,15 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 +package jptrace + +const ( + // WarningsAttribute is the name of the span attribute where we can + // store various warnings produced from transformations, + // such as inbound sanitizers and outbound adjusters. + // The value type of the attribute is a string slice. + WarningsAttribute = "@jaeger@warnings" + // FormatAttribute is a key for span attribute that records the original + // wire format in which the span was received by Jaeger, + // e.g. proto, thrift, json. + FormatAttribute = "@jaeger@format" +) diff --git a/internal/jptrace/warning.go b/internal/jptrace/warning.go index e8c7c69311f..1e66553b39e 100644 --- a/internal/jptrace/warning.go +++ b/internal/jptrace/warning.go @@ -8,14 +8,6 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" ) -const ( - // WarningsAttribute is the name of the span attribute where we can - // store various warnings produced from transformations, - // such as inbound sanitizers and outbound adjusters. - // The value type of the attribute is a string slice. - WarningsAttribute = "jaeger.internal.warnings" -) - func AddWarnings(span ptrace.Span, warnings ...string) { var w pcommon.Slice if currWarnings, ok := span.Attributes().Get(WarningsAttribute); ok { diff --git a/internal/jptrace/warning_test.go b/internal/jptrace/warning_test.go index 9bc62437dd4..d5335c42e67 100644 --- a/internal/jptrace/warning_test.go +++ b/internal/jptrace/warning_test.go @@ -42,13 +42,13 @@ func TestAddWarning(t *testing.T) { span := ptrace.NewSpan() attrs := span.Attributes() if test.existing != nil { - warnings := attrs.PutEmptySlice("jaeger.internal.warnings") + warnings := attrs.PutEmptySlice(WarningsAttribute) for _, warn := range test.existing { warnings.AppendEmpty().SetStr(warn) } } AddWarnings(span, test.newWarn) - warnings, ok := attrs.Get("jaeger.internal.warnings") + warnings, ok := attrs.Get(WarningsAttribute) assert.True(t, ok) assert.Equal(t, len(test.expected), warnings.Slice().Len()) for i, expectedWarn := range test.expected { @@ -61,7 +61,7 @@ func TestAddWarning(t *testing.T) { func TestAddWarning_MultipleWarnings(t *testing.T) { span := ptrace.NewSpan() AddWarnings(span, "warning-1", "warning-2") - warnings, ok := span.Attributes().Get("jaeger.internal.warnings") + warnings, ok := span.Attributes().Get(WarningsAttribute) require.True(t, ok) require.Equal(t, "warning-1", warnings.Slice().At(0).Str()) require.Equal(t, "warning-2", warnings.Slice().At(1).Str()) @@ -94,7 +94,7 @@ func TestGetWarnings(t *testing.T) { span := ptrace.NewSpan() attrs := span.Attributes() if test.existing != nil { - warnings := attrs.PutEmptySlice("jaeger.internal.warnings") + warnings := attrs.PutEmptySlice(WarningsAttribute) for _, warn := range test.existing { warnings.AppendEmpty().SetStr(warn) } diff --git a/cmd/collector/app/sampling/grpc_handler.go b/internal/sampling/grpc/grpc_handler.go similarity index 52% rename from cmd/collector/app/sampling/grpc_handler.go rename to internal/sampling/grpc/grpc_handler.go index fbb4c5a3e4c..be6cc64260f 100644 --- a/cmd/collector/app/sampling/grpc_handler.go +++ b/internal/sampling/grpc/grpc_handler.go @@ -1,7 +1,7 @@ // Copyright (c) 2018 The Jaeger Authors. // SPDX-License-Identifier: Apache-2.0 -package sampling +package grpc import ( "context" @@ -10,19 +10,19 @@ import ( "github.com/jaegertracing/jaeger/proto-gen/api_v2" ) -// GRPCHandler is sampling strategy handler for gRPC. -type GRPCHandler struct { +// Handler is sampling strategy handler for gRPC. +type Handler struct { samplingProvider samplingstrategy.Provider } -// NewGRPCHandler creates a handler that controls sampling strategies for services. -func NewGRPCHandler(provider samplingstrategy.Provider) GRPCHandler { - return GRPCHandler{ +// NewHandler creates a handler that controls sampling strategies for services. +func NewHandler(provider samplingstrategy.Provider) Handler { + return Handler{ samplingProvider: provider, } } // GetSamplingStrategy returns sampling decision from store. -func (s GRPCHandler) GetSamplingStrategy(ctx context.Context, param *api_v2.SamplingStrategyParameters) (*api_v2.SamplingStrategyResponse, error) { +func (s Handler) GetSamplingStrategy(ctx context.Context, param *api_v2.SamplingStrategyParameters) (*api_v2.SamplingStrategyResponse, error) { return s.samplingProvider.GetSamplingStrategy(ctx, param.GetServiceName()) } diff --git a/cmd/collector/app/sampling/grpc_handler_test.go b/internal/sampling/grpc/grpc_handler_test.go similarity index 96% rename from cmd/collector/app/sampling/grpc_handler_test.go rename to internal/sampling/grpc/grpc_handler_test.go index 450a1816b3d..f2148a6104b 100644 --- a/cmd/collector/app/sampling/grpc_handler_test.go +++ b/internal/sampling/grpc/grpc_handler_test.go @@ -1,7 +1,7 @@ // Copyright (c) 2018 The Jaeger Authors. // SPDX-License-Identifier: Apache-2.0 -package sampling +package grpc import ( "errors" @@ -40,7 +40,7 @@ func TestNewGRPCHandler(t *testing.T) { {req: &api_v2.SamplingStrategyParameters{ServiceName: "nil"}, resp: nil}, {req: &api_v2.SamplingStrategyParameters{ServiceName: "foo"}, resp: &api_v2.SamplingStrategyResponse{StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC}}, } - h := NewGRPCHandler(mockSamplingStore{}) + h := NewHandler(mockSamplingStore{}) for _, test := range tests { resp, err := h.GetSamplingStrategy(context.Background(), test.req) if test.err != "" { diff --git a/jaeger-ui b/jaeger-ui index c5cd17bf979..c9ccd8b8ba1 160000 --- a/jaeger-ui +++ b/jaeger-ui @@ -1 +1 @@ -Subproject commit c5cd17bf979ba454da761f660fde08a1f309aee9 +Subproject commit c9ccd8b8ba1f91a9e98e3b32f38677f4b370e5a9 diff --git a/pkg/config/tlscfg/flags.go b/pkg/config/tlscfg/flags.go index 82851211a85..215c3048bab 100644 --- a/pkg/config/tlscfg/flags.go +++ b/pkg/config/tlscfg/flags.go @@ -35,8 +35,7 @@ type ClientFlagsConfig struct { // ServerFlagsConfig describes which CLI flags for TLS server should be generated. type ServerFlagsConfig struct { - Prefix string - EnableCertReloadInterval bool + Prefix string } // AddFlags adds flags for TLS to the FlagSet. @@ -58,9 +57,7 @@ func (c ServerFlagsConfig) AddFlags(flags *flag.FlagSet) { flags.String(c.Prefix+tlsCipherSuites, "", "Comma-separated list of cipher suites for the server, values are from tls package constants (https://golang.org/pkg/crypto/tls/#pkg-constants).") flags.String(c.Prefix+tlsMinVersion, "", "Minimum TLS version supported (Possible values: 1.0, 1.1, 1.2, 1.3)") flags.String(c.Prefix+tlsMaxVersion, "", "Maximum TLS version supported (Possible values: 1.0, 1.1, 1.2, 1.3)") - if c.EnableCertReloadInterval { - flags.Duration(c.Prefix+tlsReloadInterval, 0, "The duration after which the certificate will be reloaded (0s means will not be reloaded)") - } + flags.Duration(c.Prefix+tlsReloadInterval, 0, "The duration after which the certificate will be reloaded (0s means will not be reloaded)") } // InitFromViper creates tls.Config populated with values retrieved from Viper. diff --git a/pkg/config/tlscfg/flags_test.go b/pkg/config/tlscfg/flags_test.go index 8e1ea0b2363..6b1ddbce8ff 100644 --- a/pkg/config/tlscfg/flags_test.go +++ b/pkg/config/tlscfg/flags_test.go @@ -6,6 +6,7 @@ package tlscfg import ( "flag" "testing" + "time" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -125,36 +126,18 @@ func TestServerFlags(t *testing.T) { } func TestServerCertReloadInterval(t *testing.T) { - tests := []struct { - config ServerFlagsConfig - }{ - { - config: ServerFlagsConfig{ - Prefix: "enabled", - EnableCertReloadInterval: true, - }, - }, - { - config: ServerFlagsConfig{ - Prefix: "disabled", - EnableCertReloadInterval: false, - }, - }, - } - for _, test := range tests { - t.Run(test.config.Prefix, func(t *testing.T) { - _, command := config.Viperize(test.config.AddFlags) - err := command.ParseFlags([]string{ - "--" + test.config.Prefix + ".tls.enabled=true", - "--" + test.config.Prefix + ".tls.reload-interval=24h", - }) - if !test.config.EnableCertReloadInterval { - assert.ErrorContains(t, err, "unknown flag") - } else { - require.NoError(t, err) - } - }) + cfg := ServerFlagsConfig{ + Prefix: "prefix", } + v, command := config.Viperize(cfg.AddFlags) + err := command.ParseFlags([]string{ + "--prefix.tls.enabled=true", + "--prefix.tls.reload-interval=24h", + }) + require.NoError(t, err) + tlscfg, err := cfg.InitFromViper(v) + require.NoError(t, err) + assert.Equal(t, 24*time.Hour, tlscfg.ReloadInterval) } // TestFailedTLSFlags verifies that TLS options cannot be used when tls.enabled=false diff --git a/pkg/es/client/index_client.go b/pkg/es/client/index_client.go index 0c46dd25c1f..522bb45b5a4 100644 --- a/pkg/es/client/index_client.go +++ b/pkg/es/client/index_client.go @@ -29,7 +29,7 @@ type Alias struct { Index string // Alias name. Name string - // IsWritedIndex option + // IsWriteIndex option IsWriteIndex bool } @@ -38,7 +38,8 @@ var _ IndexAPI = (*IndicesClient)(nil) // IndicesClient is a client used to manipulate indices. type IndicesClient struct { Client - MasterTimeoutSeconds int + MasterTimeoutSeconds int + IgnoreUnavailableIndex bool } // GetJaegerIndices queries all Jaeger indices including the archive and rollover. @@ -94,8 +95,9 @@ func (i *IndicesClient) GetJaegerIndices(prefix string) ([]Index, error) { // execute delete request func (i *IndicesClient) indexDeleteRequest(concatIndices string) error { _, err := i.request(elasticRequest{ - endpoint: fmt.Sprintf("%s?master_timeout=%ds", concatIndices, i.MasterTimeoutSeconds), - method: http.MethodDelete, + endpoint: fmt.Sprintf("%s?master_timeout=%ds&ignore_unavailable=%t", concatIndices, + i.MasterTimeoutSeconds, i.IgnoreUnavailableIndex), + method: http.MethodDelete, }) if err != nil { var responseError ResponseError diff --git a/pkg/es/client/index_client_test.go b/pkg/es/client/index_client_test.go index d02d8074fc4..cefa3c1e7cc 100644 --- a/pkg/es/client/index_client_test.go +++ b/pkg/es/client/index_client_test.go @@ -9,6 +9,7 @@ import ( "net/http" "net/http/httptest" "sort" + "strconv" "strings" "testing" "time" @@ -175,6 +176,7 @@ func getIndicesList(size int) []Index { func TestClientDeleteIndices(t *testing.T) { masterTimeoutSeconds := 1 maxURLPathLength := 4000 + ignoreUnavailableIndex := true tests := []struct { name string @@ -236,6 +238,7 @@ func TestClientDeleteIndices(t *testing.T) { assert.Equal(t, http.MethodDelete, req.Method) assert.Equal(t, "Basic foobar", req.Header.Get("Authorization")) assert.Equal(t, fmt.Sprintf("%ds", masterTimeoutSeconds), req.URL.Query().Get("master_timeout")) + assert.Equal(t, strconv.FormatBool(ignoreUnavailableIndex), req.URL.Query().Get("ignore_unavailable")) assert.LessOrEqual(t, len(req.URL.Path), maxURLPathLength) // removes leading '/' and trailing ',' @@ -261,7 +264,8 @@ func TestClientDeleteIndices(t *testing.T) { Endpoint: testServer.URL, BasicAuth: "foobar", }, - MasterTimeoutSeconds: masterTimeoutSeconds, + MasterTimeoutSeconds: masterTimeoutSeconds, + IgnoreUnavailableIndex: ignoreUnavailableIndex, } err := c.DeleteIndices(test.indices) diff --git a/plugin/sampling/strategyprovider/adaptive/aggregator.go b/plugin/sampling/strategyprovider/adaptive/aggregator.go index e08ce275017..2389ec9254e 100644 --- a/plugin/sampling/strategyprovider/adaptive/aggregator.go +++ b/plugin/sampling/strategyprovider/adaptive/aggregator.go @@ -9,13 +9,13 @@ import ( "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" span_model "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/pkg/hostname" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection" "github.com/jaegertracing/jaeger/storage/samplingstore" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const ( diff --git a/plugin/sampling/strategyprovider/adaptive/factory_test.go b/plugin/sampling/strategyprovider/adaptive/factory_test.go index f6f795913de..b008cc5fabb 100644 --- a/plugin/sampling/strategyprovider/adaptive/factory_test.go +++ b/plugin/sampling/strategyprovider/adaptive/factory_test.go @@ -13,7 +13,6 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" ss "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy" "github.com/jaegertracing/jaeger/pkg/config" "github.com/jaegertracing/jaeger/pkg/distributedlock" @@ -22,6 +21,7 @@ import ( "github.com/jaegertracing/jaeger/plugin" "github.com/jaegertracing/jaeger/storage/samplingstore" smocks "github.com/jaegertracing/jaeger/storage/samplingstore/mocks" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) var ( diff --git a/plugin/sampling/strategyprovider/adaptive/post_aggregator.go b/plugin/sampling/strategyprovider/adaptive/post_aggregator.go index 407704892b2..048b3367a95 100644 --- a/plugin/sampling/strategyprovider/adaptive/post_aggregator.go +++ b/plugin/sampling/strategyprovider/adaptive/post_aggregator.go @@ -12,11 +12,11 @@ import ( "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection" "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/adaptive/calculationstrategy" "github.com/jaegertracing/jaeger/storage/samplingstore" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const ( diff --git a/plugin/sampling/strategyprovider/adaptive/post_aggregator_test.go b/plugin/sampling/strategyprovider/adaptive/post_aggregator_test.go index fd0da089ac6..1b83ceea27f 100644 --- a/plugin/sampling/strategyprovider/adaptive/post_aggregator_test.go +++ b/plugin/sampling/strategyprovider/adaptive/post_aggregator_test.go @@ -14,13 +14,13 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/internal/metricstest" "github.com/jaegertracing/jaeger/pkg/metrics" "github.com/jaegertracing/jaeger/pkg/testutils" epmocks "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection/mocks" "github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/adaptive/calculationstrategy" smocks "github.com/jaegertracing/jaeger/storage/samplingstore/mocks" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func testThroughputs() []*model.Throughput { diff --git a/plugin/sampling/strategyprovider/adaptive/provider.go b/plugin/sampling/strategyprovider/adaptive/provider.go index dfc7ba29b18..bc04184f083 100644 --- a/plugin/sampling/strategyprovider/adaptive/provider.go +++ b/plugin/sampling/strategyprovider/adaptive/provider.go @@ -10,10 +10,10 @@ import ( "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection" "github.com/jaegertracing/jaeger/proto-gen/api_v2" "github.com/jaegertracing/jaeger/storage/samplingstore" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const defaultFollowerProbabilityInterval = 20 * time.Second diff --git a/plugin/sampling/strategyprovider/adaptive/provider_test.go b/plugin/sampling/strategyprovider/adaptive/provider_test.go index 1342cd21790..8f0d83a640d 100644 --- a/plugin/sampling/strategyprovider/adaptive/provider_test.go +++ b/plugin/sampling/strategyprovider/adaptive/provider_test.go @@ -14,10 +14,10 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" epmocks "github.com/jaegertracing/jaeger/plugin/sampling/leaderelection/mocks" "github.com/jaegertracing/jaeger/proto-gen/api_v2" smocks "github.com/jaegertracing/jaeger/storage/samplingstore/mocks" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func TestProviderLoadProbabilities(t *testing.T) { diff --git a/plugin/sampling/strategyprovider/static/constants.go b/plugin/sampling/strategyprovider/static/constants.go index e71aaf120a1..d140fdb36f5 100644 --- a/plugin/sampling/strategyprovider/static/constants.go +++ b/plugin/sampling/strategyprovider/static/constants.go @@ -16,14 +16,14 @@ const ( // only up to a fixed number of traces per second. samplerTypeRateLimiting = "ratelimiting" - // defaultSamplingProbability is the default sampling probability the - // Strategy Store will use if none is provided. - defaultSamplingProbability = 0.001 + // DefaultSamplingProbability is the default value for "DefaultSamplingProbability" + // used by the Strategy Store in case no DefaultSamplingProbability is defined + DefaultSamplingProbability = 0.001 ) // defaultStrategy is the default sampling strategy the Strategy Store will return // if none is provided. -func defaultStrategyResponse() *api_v2.SamplingStrategyResponse { +func defaultStrategyResponse(defaultSamplingProbability float64) *api_v2.SamplingStrategyResponse { return &api_v2.SamplingStrategyResponse{ StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC, ProbabilisticSampling: &api_v2.ProbabilisticSamplingStrategy{ @@ -32,10 +32,10 @@ func defaultStrategyResponse() *api_v2.SamplingStrategyResponse { } } -func defaultStrategies() *storedStrategies { +func defaultStrategies(defaultSamplingProbability float64) *storedStrategies { s := &storedStrategies{ serviceStrategies: make(map[string]*api_v2.SamplingStrategyResponse), } - s.defaultStrategy = defaultStrategyResponse() + s.defaultStrategy = defaultStrategyResponse(defaultSamplingProbability) return s } diff --git a/plugin/sampling/strategyprovider/static/options.go b/plugin/sampling/strategyprovider/static/options.go index 1b51d242d44..7b5a901a500 100644 --- a/plugin/sampling/strategyprovider/static/options.go +++ b/plugin/sampling/strategyprovider/static/options.go @@ -12,9 +12,10 @@ import ( const ( // samplingStrategiesFile contains the name of CLI option for config file. - samplingStrategiesFile = "sampling.strategies-file" - samplingStrategiesReloadInterval = "sampling.strategies-reload-interval" - samplingStrategiesBugfix5270 = "sampling.strategies.bugfix-5270" + samplingStrategiesFile = "sampling.strategies-file" + samplingStrategiesReloadInterval = "sampling.strategies-reload-interval" + samplingStrategiesBugfix5270 = "sampling.strategies.bugfix-5270" + samplingStrategiesDefaultSamplingProbability = "sampling.default-sampling-probability" ) // Options holds configuration for the static sampling strategy store. @@ -27,6 +28,8 @@ type Options struct { // strategies when calculating Ratelimiting type service level strategy // more information https://github.com/jaegertracing/jaeger/issues/5270 IncludeDefaultOpStrategies bool + // DefaultSamplingProbability is the sampling probability used by the Strategy Store for static sampling + DefaultSamplingProbability float64 } // AddFlags adds flags for Options @@ -34,6 +37,7 @@ func AddFlags(flagSet *flag.FlagSet) { flagSet.Duration(samplingStrategiesReloadInterval, 0, "Reload interval to check and reload sampling strategies file. Zero value means no reloading") flagSet.String(samplingStrategiesFile, "", "The path for the sampling strategies file in JSON format. See sampling documentation to see format of the file") flagSet.Bool(samplingStrategiesBugfix5270, true, "Include default operation level strategies for Ratesampling type service level strategy. Cf. https://github.com/jaegertracing/jaeger/issues/5270") + flagSet.Float64(samplingStrategiesDefaultSamplingProbability, DefaultSamplingProbability, "Sampling probability used by the Strategy Store for static sampling. Value must be between 0 and 1.") } // InitFromViper initializes Options with properties from viper @@ -41,5 +45,6 @@ func (opts *Options) InitFromViper(v *viper.Viper) *Options { opts.StrategiesFile = v.GetString(samplingStrategiesFile) opts.ReloadInterval = v.GetDuration(samplingStrategiesReloadInterval) opts.IncludeDefaultOpStrategies = v.GetBool(samplingStrategiesBugfix5270) + opts.DefaultSamplingProbability = v.GetFloat64(samplingStrategiesDefaultSamplingProbability) return opts } diff --git a/plugin/sampling/strategyprovider/static/provider.go b/plugin/sampling/strategyprovider/static/provider.go index f05ea4528c8..2ffd2a170f2 100644 --- a/plugin/sampling/strategyprovider/static/provider.go +++ b/plugin/sampling/strategyprovider/static/provider.go @@ -51,7 +51,7 @@ func NewProvider(options Options, logger *zap.Logger) (ss.Provider, error) { cancelFunc: cancelFunc, options: options, } - h.storedStrategies.Store(defaultStrategies()) + h.storedStrategies.Store(defaultStrategies(options.DefaultSamplingProbability)) if options.StrategiesFile == "" { h.logger.Info("No sampling strategies source provided, using defaults") @@ -77,7 +77,7 @@ func NewProvider(options Options, logger *zap.Logger) (ss.Provider, error) { } if options.ReloadInterval > 0 { - go h.autoUpdateStrategies(ctx, options.ReloadInterval, loadFn) + go h.autoUpdateStrategies(ctx, loadFn) } return h, nil } @@ -154,9 +154,9 @@ func (h *samplingProvider) samplingStrategyLoader(strategiesFile string) strateg } } -func (h *samplingProvider) autoUpdateStrategies(ctx context.Context, interval time.Duration, loader strategyLoader) { +func (h *samplingProvider) autoUpdateStrategies(ctx context.Context, loader strategyLoader) { lastValue := string(nullJSON) - ticker := time.NewTicker(interval) + ticker := time.NewTicker(h.options.ReloadInterval) defer ticker.Stop() for { select { @@ -209,7 +209,7 @@ func loadStrategies(loadFn strategyLoader) (*strategies, error) { } func (h *samplingProvider) parseStrategies_deprecated(strategies *strategies) { - newStore := defaultStrategies() + newStore := defaultStrategies(h.options.DefaultSamplingProbability) if strategies.DefaultStrategy != nil { newStore.defaultStrategy = h.parseServiceStrategies(strategies.DefaultStrategy) } @@ -248,7 +248,7 @@ func (h *samplingProvider) parseStrategies_deprecated(strategies *strategies) { } func (h *samplingProvider) parseStrategies(strategies *strategies) { - newStore := defaultStrategies() + newStore := defaultStrategies(h.options.DefaultSamplingProbability) if strategies.DefaultStrategy != nil { newStore.defaultStrategy = h.parseServiceStrategies(strategies.DefaultStrategy) } @@ -308,7 +308,7 @@ func (h *samplingProvider) parseServiceStrategies(strategy *serviceStrategy) *ap return resp } opS := &api_v2.PerOperationSamplingStrategies{ - DefaultSamplingProbability: defaultSamplingProbability, + DefaultSamplingProbability: h.options.DefaultSamplingProbability, } if resp.StrategyType == api_v2.SamplingStrategyType_PROBABILISTIC { opS.DefaultSamplingProbability = resp.ProbabilisticSampling.SamplingRate @@ -365,7 +365,7 @@ func (h *samplingProvider) parseStrategy(strategy *strategy) *api_v2.SamplingStr } default: h.logger.Warn("Failed to parse sampling strategy", zap.Any("strategy", strategy)) - return defaultStrategyResponse() + return defaultStrategyResponse(h.options.DefaultSamplingProbability) } } diff --git a/plugin/sampling/strategyprovider/static/provider_test.go b/plugin/sampling/strategyprovider/static/provider_test.go index 783caeb5c54..a1f4781699f 100644 --- a/plugin/sampling/strategyprovider/static/provider_test.go +++ b/plugin/sampling/strategyprovider/static/provider_test.go @@ -94,16 +94,16 @@ func mockStrategyServer(t *testing.T) (*httptest.Server, *atomic.Pointer[string] } func TestStrategyStoreWithFile(t *testing.T) { - _, err := NewProvider(Options{StrategiesFile: "fileNotFound.json"}, zap.NewNop()) + _, err := NewProvider(Options{StrategiesFile: "fileNotFound.json", DefaultSamplingProbability: DefaultSamplingProbability}, zap.NewNop()) require.ErrorContains(t, err, "failed to read strategies file fileNotFound.json") - _, err = NewProvider(Options{StrategiesFile: "fixtures/bad_strategies.json"}, zap.NewNop()) + _, err = NewProvider(Options{StrategiesFile: "fixtures/bad_strategies.json", DefaultSamplingProbability: DefaultSamplingProbability}, zap.NewNop()) require.EqualError(t, err, "failed to unmarshal strategies: json: cannot unmarshal string into Go value of type static.strategies") // Test default strategy logger, buf := testutils.NewLogger() - provider, err := NewProvider(Options{}, logger) + provider, err := NewProvider(Options{DefaultSamplingProbability: DefaultSamplingProbability}, logger) require.NoError(t, err) assert.Contains(t, buf.String(), "No sampling strategies source provided, using defaults") s, err := provider.GetSamplingStrategy(context.Background(), "foo") @@ -130,7 +130,7 @@ func TestStrategyStoreWithURL(t *testing.T) { // Test default strategy when URL is temporarily unavailable. logger, buf := testutils.NewLogger() mockServer, _ := mockStrategyServer(t) - provider, err := NewProvider(Options{StrategiesFile: mockServer.URL + "/service-unavailable"}, logger) + provider, err := NewProvider(Options{StrategiesFile: mockServer.URL + "/service-unavailable", DefaultSamplingProbability: DefaultSamplingProbability}, logger) require.NoError(t, err) assert.Contains(t, buf.String(), "No sampling strategies found or URL is unavailable, using defaults") s, err := provider.GetSamplingStrategy(context.Background(), "foo") @@ -154,10 +154,11 @@ func TestPerOperationSamplingStrategies(t *testing.T) { tests := []struct { options Options }{ - {Options{StrategiesFile: "fixtures/operation_strategies.json"}}, + {Options{StrategiesFile: "fixtures/operation_strategies.json", DefaultSamplingProbability: DefaultSamplingProbability}}, {Options{ StrategiesFile: "fixtures/operation_strategies.json", IncludeDefaultOpStrategies: true, + DefaultSamplingProbability: DefaultSamplingProbability, }}, } @@ -245,11 +246,11 @@ func TestPerOperationSamplingStrategies(t *testing.T) { func TestMissingServiceSamplingStrategyTypes(t *testing.T) { logger, buf := testutils.NewLogger() - provider, err := NewProvider(Options{StrategiesFile: "fixtures/missing-service-types.json"}, logger) + provider, err := NewProvider(Options{StrategiesFile: "fixtures/missing-service-types.json", DefaultSamplingProbability: DefaultSamplingProbability}, logger) assert.Contains(t, buf.String(), "Failed to parse sampling strategy") require.NoError(t, err) - expected := makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, defaultSamplingProbability) + expected := makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, DefaultSamplingProbability) s, err := provider.GetSamplingStrategy(context.Background(), "foo") require.NoError(t, err) @@ -258,12 +259,12 @@ func TestMissingServiceSamplingStrategyTypes(t *testing.T) { require.NotNil(t, s.OperationSampling) opSampling := s.OperationSampling - assert.InDelta(t, defaultSamplingProbability, opSampling.DefaultSamplingProbability, 1e-4) + assert.InDelta(t, DefaultSamplingProbability, opSampling.DefaultSamplingProbability, 1e-4) require.Len(t, opSampling.PerOperationStrategies, 1) assert.Equal(t, "op1", opSampling.PerOperationStrategies[0].Operation) assert.InDelta(t, 0.2, opSampling.PerOperationStrategies[0].ProbabilisticSampling.SamplingRate, 0.001) - expected = makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, defaultSamplingProbability) + expected = makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, DefaultSamplingProbability) s, err = provider.GetSamplingStrategy(context.Background(), "bar") require.NoError(t, err) @@ -305,7 +306,7 @@ func TestParseStrategy(t *testing.T) { }, } logger, buf := testutils.NewLogger() - provider := &samplingProvider{logger: logger} + provider := &samplingProvider{options: Options{DefaultSamplingProbability: DefaultSamplingProbability}, logger: logger} for _, test := range tests { tt := test t.Run("", func(t *testing.T) { @@ -316,7 +317,7 @@ func TestParseStrategy(t *testing.T) { // Test nonexistent strategy type actual := *provider.parseStrategy(&strategy{Type: "blah", Param: 3.5}) - expected := makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, defaultSamplingProbability) + expected := makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, provider.options.DefaultSamplingProbability) assert.EqualValues(t, expected, actual) assert.Contains(t, buf.String(), "Failed to parse sampling strategy") } @@ -396,8 +397,9 @@ func TestAutoUpdateStrategyWithFile(t *testing.T) { func TestAutoUpdateStrategyWithURL(t *testing.T) { mockServer, mockStrategy := mockStrategyServer(t) ss, err := NewProvider(Options{ - StrategiesFile: mockServer.URL, - ReloadInterval: 10 * time.Millisecond, + DefaultSamplingProbability: DefaultSamplingProbability, + StrategiesFile: mockServer.URL, + ReloadInterval: 10 * time.Millisecond, }, zap.NewNop()) require.NoError(t, err) provider := ss.(*samplingProvider) diff --git a/plugin/storage/badger/samplingstore/storage.go b/plugin/storage/badger/samplingstore/storage.go index 50c8f19f412..d0ef85b0a6e 100644 --- a/plugin/storage/badger/samplingstore/storage.go +++ b/plugin/storage/badger/samplingstore/storage.go @@ -11,8 +11,8 @@ import ( "github.com/dgraph-io/badger/v4" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" jaegermodel "github.com/jaegertracing/jaeger/model" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const ( diff --git a/plugin/storage/badger/samplingstore/storage_test.go b/plugin/storage/badger/samplingstore/storage_test.go index 5a02dc0e802..cbb125d4daa 100644 --- a/plugin/storage/badger/samplingstore/storage_test.go +++ b/plugin/storage/badger/samplingstore/storage_test.go @@ -12,8 +12,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - samplemodel "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/testutils" + samplemodel "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func newTestSamplingStore(db *badger.DB) *SamplingStore { diff --git a/plugin/storage/cassandra/factory.go b/plugin/storage/cassandra/factory.go index ebfac8e6f82..884eed5a772 100644 --- a/plugin/storage/cassandra/factory.go +++ b/plugin/storage/cassandra/factory.go @@ -53,11 +53,9 @@ var ( // interface comformance checks type Factory struct { Options *Options - metricsFactory metrics.Factory - primaryMetricsFactory metrics.Factory - archiveMetricsFactory metrics.Factory - logger *zap.Logger - tracer trace.TracerProvider + metricsFactory metrics.Factory + logger *zap.Logger + tracer trace.TracerProvider primaryConfig config.Configuration archiveConfig *config.Configuration @@ -141,20 +139,6 @@ func (f *Factory) configureFromOptions(o *Options) { // Initialize implements storage.Factory func (f *Factory) Initialize(metricsFactory metrics.Factory, logger *zap.Logger) error { f.metricsFactory = metricsFactory - f.primaryMetricsFactory = metricsFactory.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "primary", - }, - }, - ) - f.archiveMetricsFactory = metricsFactory.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "archive", - }, - }, - ) f.logger = logger primarySession, err := f.sessionBuilderFn(&f.primaryConfig) @@ -219,11 +203,11 @@ func NewSession(c *config.Configuration) (cassandra.Session, error) { // CreateSpanReader implements storage.Factory func (f *Factory) CreateSpanReader() (spanstore.Reader, error) { - sr, err := cSpanStore.NewSpanReader(f.primarySession, f.primaryMetricsFactory, f.logger, f.tracer.Tracer("cSpanStore.SpanReader")) + sr, err := cSpanStore.NewSpanReader(f.primarySession, f.metricsFactory, f.logger, f.tracer.Tracer("cSpanStore.SpanReader")) if err != nil { return nil, err } - return spanstoremetrics.NewReaderDecorator(sr, f.primaryMetricsFactory), nil + return spanstoremetrics.NewReaderDecorator(sr, f.metricsFactory), nil } // CreateSpanWriter implements storage.Factory @@ -232,13 +216,13 @@ func (f *Factory) CreateSpanWriter() (spanstore.Writer, error) { if err != nil { return nil, err } - return cSpanStore.NewSpanWriter(f.primarySession, f.Options.SpanStoreWriteCacheTTL, f.primaryMetricsFactory, f.logger, options...) + return cSpanStore.NewSpanWriter(f.primarySession, f.Options.SpanStoreWriteCacheTTL, f.metricsFactory, f.logger, options...) } // CreateDependencyReader implements storage.Factory func (f *Factory) CreateDependencyReader() (dependencystore.Reader, error) { version := cDepStore.GetDependencyVersion(f.primarySession) - return cDepStore.NewDependencyStore(f.primarySession, f.primaryMetricsFactory, f.logger, version) + return cDepStore.NewDependencyStore(f.primarySession, f.metricsFactory, f.logger, version) } // CreateArchiveSpanReader implements storage.ArchiveFactory @@ -246,11 +230,18 @@ func (f *Factory) CreateArchiveSpanReader() (spanstore.Reader, error) { if f.archiveSession == nil { return nil, storage.ErrArchiveStorageNotConfigured } - sr, err := cSpanStore.NewSpanReader(f.archiveSession, f.archiveMetricsFactory, f.logger, f.tracer.Tracer("cSpanStore.SpanReader")) + archiveMetricsFactory := f.metricsFactory.Namespace( + metrics.NSOptions{ + Tags: map[string]string{ + "role": "archive", + }, + }, + ) + sr, err := cSpanStore.NewSpanReader(f.archiveSession, archiveMetricsFactory, f.logger, f.tracer.Tracer("cSpanStore.SpanReader")) if err != nil { return nil, err } - return spanstoremetrics.NewReaderDecorator(sr, f.archiveMetricsFactory), nil + return spanstoremetrics.NewReaderDecorator(sr, archiveMetricsFactory), nil } // CreateArchiveSpanWriter implements storage.ArchiveFactory @@ -262,7 +253,14 @@ func (f *Factory) CreateArchiveSpanWriter() (spanstore.Writer, error) { if err != nil { return nil, err } - return cSpanStore.NewSpanWriter(f.archiveSession, f.Options.SpanStoreWriteCacheTTL, f.archiveMetricsFactory, f.logger, options...) + archiveMetricsFactory := f.metricsFactory.Namespace( + metrics.NSOptions{ + Tags: map[string]string{ + "role": "archive", + }, + }, + ) + return cSpanStore.NewSpanWriter(f.archiveSession, f.Options.SpanStoreWriteCacheTTL, archiveMetricsFactory, f.logger, options...) } // CreateLock implements storage.SamplingStoreFactory diff --git a/plugin/storage/cassandra/samplingstore/storage.go b/plugin/storage/cassandra/samplingstore/storage.go index d3abeb31fdb..55434ba3ff0 100644 --- a/plugin/storage/cassandra/samplingstore/storage.go +++ b/plugin/storage/cassandra/samplingstore/storage.go @@ -17,10 +17,10 @@ import ( "github.com/gocql/gocql" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/cassandra" casMetrics "github.com/jaegertracing/jaeger/pkg/cassandra/metrics" "github.com/jaegertracing/jaeger/pkg/metrics" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const ( @@ -34,6 +34,16 @@ const ( getLatestProbabilities = `SELECT probabilities FROM sampling_probabilities WHERE bucket = ` + constBucketStr + ` LIMIT 1` ) +// probabilityAndQPS contains the sampling probability and measured qps for an operation. +type probabilityAndQPS struct { + Probability float64 + QPS float64 +} + +// serviceOperationData contains the sampling probabilities and measured qps for all operations in a service. +// ie [service][operation] = ProbabilityAndQPS +type serviceOperationData map[string]map[string]*probabilityAndQPS + type samplingStoreMetrics struct { operationThroughput *casMetrics.Table probabilities *casMetrics.Table @@ -127,8 +137,8 @@ func probabilitiesAndQPSToString(probabilities model.ServiceOperationProbabiliti return buf.String() } -func (s *SamplingStore) stringToProbabilitiesAndQPS(probabilitiesAndQPSStr string) model.ServiceOperationData { - probabilitiesAndQPS := make(model.ServiceOperationData) +func (s *SamplingStore) stringToProbabilitiesAndQPS(probabilitiesAndQPSStr string) serviceOperationData { + probabilitiesAndQPS := make(serviceOperationData) appendFunc := s.appendProbabilityAndQPS(probabilitiesAndQPS) s.parseString(probabilitiesAndQPSStr, 4, appendFunc) return probabilitiesAndQPS @@ -167,7 +177,7 @@ func (s *SamplingStore) stringToThroughput(throughputStr string) []*model.Throug return throughput } -func (s *SamplingStore) appendProbabilityAndQPS(svcOpData model.ServiceOperationData) func(csvFields []string) { +func (s *SamplingStore) appendProbabilityAndQPS(svcOpData serviceOperationData) func(csvFields []string) { return func(csvFields []string) { probability, err := strconv.ParseFloat(csvFields[2], 64) if err != nil { @@ -182,9 +192,9 @@ func (s *SamplingStore) appendProbabilityAndQPS(svcOpData model.ServiceOperation service := csvFields[0] operation := csvFields[1] if _, ok := svcOpData[service]; !ok { - svcOpData[service] = make(map[string]*model.ProbabilityAndQPS) + svcOpData[service] = make(map[string]*probabilityAndQPS) } - svcOpData[service][operation] = &model.ProbabilityAndQPS{ + svcOpData[service][operation] = &probabilityAndQPS{ Probability: probability, QPS: qps, } diff --git a/plugin/storage/cassandra/samplingstore/storage_test.go b/plugin/storage/cassandra/samplingstore/storage_test.go index 774ffeb5422..094e3eaef82 100644 --- a/plugin/storage/cassandra/samplingstore/storage_test.go +++ b/plugin/storage/cassandra/samplingstore/storage_test.go @@ -16,11 +16,11 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/internal/metricstest" "github.com/jaegertracing/jaeger/pkg/cassandra/mocks" "github.com/jaegertracing/jaeger/pkg/testutils" "github.com/jaegertracing/jaeger/storage/samplingstore" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) var testTime = time.Date(2017, time.January, 24, 11, 15, 17, 12345, time.UTC) @@ -348,7 +348,7 @@ func TestStringToProbabilitiesAndQPS(t *testing.T) { probabilities := s.stringToProbabilitiesAndQPS(testStr) assert.Len(t, probabilities, 2) - assert.Equal(t, map[string]*model.ProbabilityAndQPS{ + assert.Equal(t, map[string]*probabilityAndQPS{ http.MethodGet: { Probability: 0.001, QPS: 63.2, @@ -358,7 +358,7 @@ func TestStringToProbabilitiesAndQPS(t *testing.T) { QPS: 0.0, }, }, probabilities["svc1"]) - assert.Equal(t, map[string]*model.ProbabilityAndQPS{ + assert.Equal(t, map[string]*probabilityAndQPS{ http.MethodGet: { Probability: 0.5, QPS: 34.2, diff --git a/plugin/storage/es/factory.go b/plugin/storage/es/factory.go index ee00688535e..63ada037544 100644 --- a/plugin/storage/es/factory.go +++ b/plugin/storage/es/factory.go @@ -53,10 +53,9 @@ var ( // interface comformance checks type Factory struct { Options *Options - primaryMetricsFactory metrics.Factory - archiveMetricsFactory metrics.Factory - logger *zap.Logger - tracer trace.TracerProvider + metricsFactory metrics.Factory + logger *zap.Logger + tracer trace.TracerProvider newClientFn func(c *config.Configuration, logger *zap.Logger, metricsFactory metrics.Factory) (es.Client, error) @@ -131,20 +130,7 @@ func (f *Factory) configureFromOptions(o *Options) { // Initialize implements storage.Factory. func (f *Factory) Initialize(metricsFactory metrics.Factory, logger *zap.Logger) error { - f.primaryMetricsFactory = metricsFactory.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "primary", - }, - }, - ) - f.archiveMetricsFactory = metricsFactory.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "archive", - }, - }, - ) + f.metricsFactory = metricsFactory f.logger = logger primaryClient, err := f.newClientFn(f.primaryConfig, logger, metricsFactory) @@ -200,12 +186,12 @@ func (f *Factory) CreateSpanReader() (spanstore.Reader, error) { if err != nil { return nil, err } - return spanstoremetrics.NewReaderDecorator(sr, f.primaryMetricsFactory), nil + return spanstoremetrics.NewReaderDecorator(sr, f.metricsFactory), nil } // CreateSpanWriter implements storage.Factory func (f *Factory) CreateSpanWriter() (spanstore.Writer, error) { - return createSpanWriter(f.getPrimaryClient, f.primaryConfig, false, f.primaryMetricsFactory, f.logger) + return createSpanWriter(f.getPrimaryClient, f.primaryConfig, false, f.metricsFactory, f.logger) } // CreateDependencyReader implements storage.Factory @@ -222,7 +208,14 @@ func (f *Factory) CreateArchiveSpanReader() (spanstore.Reader, error) { if err != nil { return nil, err } - return spanstoremetrics.NewReaderDecorator(sr, f.archiveMetricsFactory), nil + archiveMetricsFactory := f.metricsFactory.Namespace( + metrics.NSOptions{ + Tags: map[string]string{ + "role": "archive", + }, + }, + ) + return spanstoremetrics.NewReaderDecorator(sr, archiveMetricsFactory), nil } // CreateArchiveSpanWriter implements storage.ArchiveFactory @@ -230,7 +223,14 @@ func (f *Factory) CreateArchiveSpanWriter() (spanstore.Writer, error) { if !f.archiveConfig.Enabled { return nil, nil } - return createSpanWriter(f.getArchiveClient, f.archiveConfig, true, f.archiveMetricsFactory, f.logger) + archiveMetricsFactory := f.metricsFactory.Namespace( + metrics.NSOptions{ + Tags: map[string]string{ + "role": "archive", + }, + }, + ) + return createSpanWriter(f.getArchiveClient, f.archiveConfig, true, archiveMetricsFactory, f.logger) } func createSpanReader( @@ -374,11 +374,18 @@ func (f *Factory) Close() error { } func (f *Factory) onPrimaryPasswordChange() { - f.onClientPasswordChange(f.primaryConfig, &f.primaryClient, f.primaryMetricsFactory) + f.onClientPasswordChange(f.primaryConfig, &f.primaryClient, f.metricsFactory) } func (f *Factory) onArchivePasswordChange() { - f.onClientPasswordChange(f.archiveConfig, &f.archiveClient, f.archiveMetricsFactory) + archiveMetricsFactory := f.metricsFactory.Namespace( + metrics.NSOptions{ + Tags: map[string]string{ + "role": "archive", + }, + }, + ) + f.onClientPasswordChange(f.archiveConfig, &f.archiveClient, archiveMetricsFactory) } func (f *Factory) onClientPasswordChange(cfg *config.Configuration, client *atomic.Pointer[es.Client], mf metrics.Factory) { diff --git a/plugin/storage/es/samplingstore/dbmodel/converter.go b/plugin/storage/es/samplingstore/dbmodel/converter.go index e5166e45c61..4eccc8b2ba3 100644 --- a/plugin/storage/es/samplingstore/dbmodel/converter.go +++ b/plugin/storage/es/samplingstore/dbmodel/converter.go @@ -4,7 +4,7 @@ package dbmodel import ( - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func FromThroughputs(throughputs []*model.Throughput) []Throughput { diff --git a/plugin/storage/es/samplingstore/dbmodel/converter_test.go b/plugin/storage/es/samplingstore/dbmodel/converter_test.go index 82e84eacc4a..86043e1c577 100644 --- a/plugin/storage/es/samplingstore/dbmodel/converter_test.go +++ b/plugin/storage/es/samplingstore/dbmodel/converter_test.go @@ -9,8 +9,8 @@ import ( "github.com/stretchr/testify/assert" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/testutils" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func TestConvertDependencies(t *testing.T) { diff --git a/plugin/storage/es/samplingstore/storage.go b/plugin/storage/es/samplingstore/storage.go index 0fd2d0db0c2..db6c960c69c 100644 --- a/plugin/storage/es/samplingstore/storage.go +++ b/plugin/storage/es/samplingstore/storage.go @@ -13,10 +13,10 @@ import ( "github.com/olivere/elastic" "go.uber.org/zap" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/es" "github.com/jaegertracing/jaeger/pkg/es/config" "github.com/jaegertracing/jaeger/plugin/storage/es/samplingstore/dbmodel" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const ( diff --git a/plugin/storage/es/samplingstore/storage_test.go b/plugin/storage/es/samplingstore/storage_test.go index 0d2764bb2cd..be821db11cc 100644 --- a/plugin/storage/es/samplingstore/storage_test.go +++ b/plugin/storage/es/samplingstore/storage_test.go @@ -16,12 +16,12 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap" - samplemodel "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/pkg/es" "github.com/jaegertracing/jaeger/pkg/es/config" "github.com/jaegertracing/jaeger/pkg/es/mocks" "github.com/jaegertracing/jaeger/pkg/testutils" "github.com/jaegertracing/jaeger/plugin/storage/es/samplingstore/dbmodel" + samplemodel "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) const defaultMaxDocCount = 10_000 diff --git a/plugin/storage/factory.go b/plugin/storage/factory.go index 58f81f3a5a4..be1b808c46e 100644 --- a/plugin/storage/factory.go +++ b/plugin/storage/factory.go @@ -142,6 +142,7 @@ func (f *Factory) Initialize(metricsFactory metrics.Factory, logger *zap.Logger) Name: "storage", Tags: map[string]string{ "kind": kind, + "role": "primary", // can be overiden in the storage factory for archive/sampling stores }, }) if err := factory.Initialize(mf, logger); err != nil { diff --git a/plugin/storage/grpc/factory.go b/plugin/storage/grpc/factory.go index c5e97f75310..e316ceb7d3e 100644 --- a/plugin/storage/grpc/factory.go +++ b/plugin/storage/grpc/factory.go @@ -167,14 +167,7 @@ func (f *Factory) newRemoteStorage( // CreateSpanReader implements storage.Factory func (f *Factory) CreateSpanReader() (spanstore.Reader, error) { - primaryMetricsFactory := f.telset.Metrics.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "primary", - }, - }, - ) - return spanstoremetrics.NewReaderDecorator(f.services.Store.SpanReader(), primaryMetricsFactory), nil + return spanstoremetrics.NewReaderDecorator(f.services.Store.SpanReader(), f.telset.Metrics), nil } // CreateSpanWriter implements storage.Factory diff --git a/plugin/storage/integration/integration.go b/plugin/storage/integration/integration.go index f3132c41e21..d5998ac806f 100644 --- a/plugin/storage/integration/integration.go +++ b/plugin/storage/integration/integration.go @@ -22,10 +22,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - samplemodel "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" "github.com/jaegertracing/jaeger/model" "github.com/jaegertracing/jaeger/storage/dependencystore" "github.com/jaegertracing/jaeger/storage/samplingstore" + samplemodel "github.com/jaegertracing/jaeger/storage/samplingstore/model" "github.com/jaegertracing/jaeger/storage/spanstore" "github.com/jaegertracing/jaeger/storage_v2/depstore" "github.com/jaegertracing/jaeger/storage_v2/tracestore" diff --git a/plugin/storage/memory/factory.go b/plugin/storage/memory/factory.go index 20dab08619c..0a7b7b34a24 100644 --- a/plugin/storage/memory/factory.go +++ b/plugin/storage/memory/factory.go @@ -82,14 +82,7 @@ func (f *Factory) Initialize(metricsFactory metrics.Factory, logger *zap.Logger) // CreateSpanReader implements storage.Factory func (f *Factory) CreateSpanReader() (spanstore.Reader, error) { - primaryMetricsFactory := f.metricsFactory.Namespace( - metrics.NSOptions{ - Tags: map[string]string{ - "role": "primary", - }, - }, - ) - return spanstoremetrics.NewReaderDecorator(f.store, primaryMetricsFactory), nil + return spanstoremetrics.NewReaderDecorator(f.store, f.metricsFactory), nil } // CreateSpanWriter implements storage.Factory diff --git a/plugin/storage/memory/sampling.go b/plugin/storage/memory/sampling.go index db603ecbc1a..b58e5c9487a 100644 --- a/plugin/storage/memory/sampling.go +++ b/plugin/storage/memory/sampling.go @@ -7,7 +7,7 @@ import ( "sync" "time" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) // SamplingStore is an in-memory store for sampling data diff --git a/plugin/storage/memory/sampling_test.go b/plugin/storage/memory/sampling_test.go index c1914109741..825e23ebad9 100644 --- a/plugin/storage/memory/sampling_test.go +++ b/plugin/storage/memory/sampling_test.go @@ -11,7 +11,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) func withPopulatedSamplingStore(f func(samplingStore *SamplingStore)) { diff --git a/scripts/build/build-hotrod-image.sh b/scripts/build/build-hotrod-image.sh index 0590c91cfed..c420453631e 100755 --- a/scripts/build/build-hotrod-image.sh +++ b/scripts/build/build-hotrod-image.sh @@ -11,7 +11,7 @@ print_help() { echo "-l: Enable local-only mode that only pushes images to local registry" echo "-o: overwrite image in the target remote repository even if the semver tag already exists" echo "-p: Comma-separated list of platforms to build for (default: all supported)" - echo "-v: Jaeger version to use for hotrod image (v1 or v2, default: v1)" + echo "-v: Jaeger version to use for hotrod image (v1 or v2, default: v2)" echo "-r: Runtime to test with (docker|k8s, default: docker)" exit 1 } @@ -19,8 +19,8 @@ print_help() { docker_compose_file="./examples/hotrod/docker-compose.yml" platforms="$(make echo-linux-platforms)" current_platform="$(go env GOOS)/$(go env GOARCH)" -jaeger_version="v1" -binary="all-in-one" +jaeger_version="v2" +binary="jaeger" FLAGS=() success="false" runtime="docker" @@ -54,11 +54,11 @@ done case "$jaeger_version" in v1) - docker_compose_file="./examples/hotrod/docker-compose.yml" + docker_compose_file="./examples/hotrod/docker-compose-v1.yml" binary="all-in-one" ;; v2) - docker_compose_file="./examples/hotrod/docker-compose-v2.yml" + docker_compose_file="./examples/hotrod/docker-compose.yml" binary="jaeger" ;; *) diff --git a/scripts/e2e/spm.sh b/scripts/e2e/spm.sh index 6d1ac395276..afc0313b408 100755 --- a/scripts/e2e/spm.sh +++ b/scripts/e2e/spm.sh @@ -7,12 +7,12 @@ set -euf -o pipefail print_help() { echo "Usage: $0 [-b binary]" - echo "-b: Which binary to build: 'all-in-one' (default) or 'jaeger' (v2)" + echo "-b: Which binary to build: 'all-in-one' or 'jaeger' (v2) (default)" echo "-h: Print help" exit 1 } -BINARY='all-in-one' +BINARY='jaeger' compose_file=docker-compose/monitor/docker-compose.yml while getopts "b:h" opt; do @@ -28,8 +28,8 @@ done set -x -if [ "$BINARY" == "jaeger" ]; then - compose_file=docker-compose/monitor/docker-compose-v2.yml +if [ "$BINARY" == "all-in-one" ]; then + compose_file=docker-compose/monitor/docker-compose-v1.yml fi timeout=600 @@ -161,9 +161,9 @@ teardown_services() { main() { if [ "$BINARY" == "jaeger" ]; then - (cd docker-compose/monitor && make build BINARY="$BINARY" && make dev-v2 DOCKER_COMPOSE_ARGS="-d") - else (cd docker-compose/monitor && make build BINARY="$BINARY" && make dev DOCKER_COMPOSE_ARGS="-d") + else + (cd docker-compose/monitor && make build BINARY="$BINARY" && make dev-v1 DOCKER_COMPOSE_ARGS="-d") fi wait_for_services check_spm diff --git a/storage/samplingstore/interface.go b/storage/samplingstore/interface.go index ba2dbdf3cd8..130ad0bf2b8 100644 --- a/storage/samplingstore/interface.go +++ b/storage/samplingstore/interface.go @@ -7,7 +7,7 @@ package samplingstore import ( "time" - "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" + "github.com/jaegertracing/jaeger/storage/samplingstore/model" ) // Store writes and retrieves sampling data to and from storage. diff --git a/storage/samplingstore/mocks/Store.go b/storage/samplingstore/mocks/Store.go index 120782e1e81..b6194c2099b 100644 --- a/storage/samplingstore/mocks/Store.go +++ b/storage/samplingstore/mocks/Store.go @@ -8,7 +8,7 @@ package mocks import ( - model "github.com/jaegertracing/jaeger/cmd/collector/app/sampling/model" + model "github.com/jaegertracing/jaeger/storage/samplingstore/model" mock "github.com/stretchr/testify/mock" time "time" diff --git a/cmd/collector/app/sampling/model/empty_test.go b/storage/samplingstore/model/empty_test.go similarity index 100% rename from cmd/collector/app/sampling/model/empty_test.go rename to storage/samplingstore/model/empty_test.go diff --git a/cmd/collector/app/sampling/model/sampling.go b/storage/samplingstore/model/sampling.go similarity index 64% rename from cmd/collector/app/sampling/model/sampling.go rename to storage/samplingstore/model/sampling.go index 9504506756c..77def29e945 100644 --- a/cmd/collector/app/sampling/model/sampling.go +++ b/storage/samplingstore/model/sampling.go @@ -19,13 +19,3 @@ type ServiceOperationProbabilities map[string]map[string]float64 // ServiceOperationQPS contains the qps for all operations in a service. // ie [service][operation] = qps type ServiceOperationQPS map[string]map[string]float64 - -// ProbabilityAndQPS contains the sampling probability and measured qps for an operation. -type ProbabilityAndQPS struct { - Probability float64 - QPS float64 -} - -// ServiceOperationData contains the sampling probabilities and measured qps for all operations in a service. -// ie [service][operation] = ProbabilityAndQPS -type ServiceOperationData map[string]map[string]*ProbabilityAndQPS diff --git a/storage_v2/tracestore/writer.go b/storage_v2/tracestore/writer.go index e46df9e0e13..25ee4fc04d5 100644 --- a/storage_v2/tracestore/writer.go +++ b/storage_v2/tracestore/writer.go @@ -11,7 +11,7 @@ import ( // Writer writes spans to storage. type Writer interface { - // WriteTrace writes a batch of spans to storage. Idempotent. + // WriteTraces writes a batch of spans to storage. Idempotent. // Implementations are not required to support atomic transactions, // so if any of the spans fail to be written an error is returned. // Compatible with OTLP Exporter API. diff --git a/storage_v2/v1adapter/writer.go b/storage_v2/v1adapter/writer.go index bd37cad2718..59b6a1b408c 100644 --- a/storage_v2/v1adapter/writer.go +++ b/storage_v2/v1adapter/writer.go @@ -10,12 +10,22 @@ import ( "go.opentelemetry.io/collector/pdata/ptrace" "github.com/jaegertracing/jaeger/storage/spanstore" + "github.com/jaegertracing/jaeger/storage_v2/tracestore" ) +var ErrV1WriterNotAvailable = errors.New("spanstore.Writer is not a wrapper around v1 writer") + type TraceWriter struct { spanWriter spanstore.Writer } +func GetV1Writer(writer tracestore.Writer) (spanstore.Writer, error) { + if tr, ok := writer.(*TraceWriter); ok { + return tr.spanWriter, nil + } + return nil, ErrV1WriterNotAvailable +} + func NewTraceWriter(spanWriter spanstore.Writer) *TraceWriter { return &TraceWriter{ spanWriter: spanWriter, @@ -24,7 +34,7 @@ func NewTraceWriter(spanWriter spanstore.Writer) *TraceWriter { // WriteTraces implements tracestore.Writer. func (t *TraceWriter) WriteTraces(ctx context.Context, td ptrace.Traces) error { - batches := ProtoFromTraces(td) + batches := V1BatchesFromTraces(td) var errs []error for _, batch := range batches { for _, span := range batch.Spans { diff --git a/storage_v2/v1adapter/writer_test.go b/storage_v2/v1adapter/writer_test.go index bc00c7ae0bd..af9858c667a 100644 --- a/storage_v2/v1adapter/writer_test.go +++ b/storage_v2/v1adapter/writer_test.go @@ -18,6 +18,7 @@ import ( "github.com/jaegertracing/jaeger/plugin/storage/memory" "github.com/jaegertracing/jaeger/storage/spanstore" spanstoreMocks "github.com/jaegertracing/jaeger/storage/spanstore/mocks" + tracestoremocks "github.com/jaegertracing/jaeger/storage_v2/tracestore/mocks" ) func TestWriteTraces(t *testing.T) { @@ -56,6 +57,22 @@ func TestWriteTracesError(t *testing.T) { require.ErrorContains(t, err, "mocked error") } +func TestGetV1Writer_NoError(t *testing.T) { + memstore := memory.NewStore() + traceWriter := &TraceWriter{ + spanWriter: memstore, + } + v1Writer, err := GetV1Writer(traceWriter) + require.NoError(t, err) + require.Equal(t, memstore, v1Writer) +} + +func TestGetV1Writer_Error(t *testing.T) { + w := new(tracestoremocks.Writer) + _, err := GetV1Writer(w) + require.ErrorIs(t, err, ErrV1WriterNotAvailable) +} + func makeTraces() ptrace.Traces { traces := ptrace.NewTraces() rSpans := traces.ResourceSpans().AppendEmpty()