Repository: jaegertracing/jaeger
Pull request #7132: Add retry configuration to storage exporter
Author: login: kumarlokesh
Labels: name: enhancement
name: area/storage
name: changelog:bugfix-or-minor-feature
Created: 2025-05-17T14:22:40Z | Merged: 2025-05-18T16:58:05Z

## Which problem is this PR solving?
- Resolves #7110

## Description of the changes
- Added retry configuration with all available parameters
- Updated documentation to reflect all configurable retry parameters

## How was this change tested?
- Added tests in `storageexporter` package.

## Checklist
- [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md
- [x] I have signed all commits
- [x] I have added unit tests for the new functionality
- [x] I have run lint and test steps successfully
  - for `jaeger`: `make lint test`
  - for `jaeger-ui`: `npm run lint` and `npm run test`


Linked issue #7110: retry_on_failure for jaeger_storage_exporter

Discussed in https://github.com/orgs/jaegertracing/discussions/7105

<sup>Originally posted by **aujjwal-smarsh** May  8, 2025</sup>
Hello folks,

I am working on deploying Jaeger V2 with OpenTelemetry CRD. The storage backend is Elasticsearch. I have deployed it in my local cluster, and it is working fine. Though I am struggling with one issue. I want to tune the queue size and retry mechanism for exporter failures.

I found that we can set the queue size using 

```
 jaeger_storage_exporter:
        trace_storage: some_storage
        queue:
          enabled: true
          num_consumers: 10
          queue_size: 1000
```

Now, the general [exporterhelper](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md#:~:text=can%20be%20modified%3A-,retry_on_failure,-enabled%20(default%20%3D%20true) provides a mechanism to `retry_on_failure`
```
retry_on_failure:
            enabled: true
            initial_interval: 5s
            max_interval: 1m
            max_elapsed_time: 1h
```

But I am not able to find any documentation on Jaeger that shows how to leverage the same in the Jaeger v2 storage backend. 

Appreciate your help, and thanks in advance.
Linked issue comments: user: login: kumarlokesh
created_at: 2025-05-17T14:26:38Z
body: @yurishkuro made an attempt to address this requirement here: https://github.com/jaegertracing/jaeger/pull/7132. Please have a look.
author_association: CONTRIBUTOR

Diff:
diff --git a/cmd/jaeger/internal/exporters/storageexporter/README.md b/cmd/jaeger/internal/exporters/storageexporter/README.md
index 0eb941ba0f0..c2ee9e48f51 100644
--- a/cmd/jaeger/internal/exporters/storageexporter/README.md
+++ b/cmd/jaeger/internal/exporters/storageexporter/README.md
@@ -4,6 +4,8 @@ This module implements `exporter.Traces` and writes spans into Jaeger native `sp
 
 ## Configuration
 
+### Basic Configuration
+
 ```yaml
 exporters:
   jaeger_storage_exporter:
@@ -15,3 +17,31 @@ extensions:
       memstore:
         max_traces: 100000
 ```
+
+### Retry Configuration
+
+The exporter supports configurable retry behavior for failed exports. By default, retry is disabled. When enabled, the following default settings are used:
+
+- `enabled`: false (disabled by default)
+- `initial_interval`: 5s
+- `randomization_factor`: 0.5
+- `multiplier`: 1.5
+- `max_interval`: 30s
+- `max_elapsed_time`: 5m
+
+To enable and customize the retry behavior:
+
+```yaml
+exporters:
+  jaeger_storage_exporter:
+    trace_storage: memstore
+    retry_on_failure:
+      enabled: true  # Explicitly enable retries
+      initial_interval: 10s
+      max_interval: 1m
+      max_elapsed_time: 10m
+    queue:
+      enabled: true
+      num_consumers: 10
+      queue_size: 1000
+```
diff --git a/cmd/jaeger/internal/exporters/storageexporter/config.go b/cmd/jaeger/internal/exporters/storageexporter/config.go
index c2b87e39a76..68db9a8f559 100644
--- a/cmd/jaeger/internal/exporters/storageexporter/config.go
+++ b/cmd/jaeger/internal/exporters/storageexporter/config.go
@@ -6,6 +6,7 @@ package storageexporter
 import (
 	"github.com/asaskevich/govalidator"
 	"go.opentelemetry.io/collector/component"
+	"go.opentelemetry.io/collector/config/configretry"
 	"go.opentelemetry.io/collector/confmap/xconfmap"
 	"go.opentelemetry.io/collector/exporter/exporterhelper"
 )
@@ -19,6 +20,7 @@ var (
 type Config struct {
 	TraceStorage string                          `mapstructure:"trace_storage" valid:"required"`
 	QueueConfig  exporterhelper.QueueBatchConfig `mapstructure:"queue" valid:"optional"`
+	RetryConfig  configretry.BackOffConfig       `mapstructure:"retry_on_failure"`
 }
 
 func (cfg *Config) Validate() error {
diff --git a/cmd/jaeger/internal/exporters/storageexporter/factory.go b/cmd/jaeger/internal/exporters/storageexporter/factory.go
index b2fab274203..f211a67ad36 100644
--- a/cmd/jaeger/internal/exporters/storageexporter/factory.go
+++ b/cmd/jaeger/internal/exporters/storageexporter/factory.go
@@ -29,7 +29,11 @@ func NewFactory() exporter.Factory {
 }
 
 func createDefaultConfig() component.Config {
-	return &Config{}
+	cfg := configretry.NewDefaultBackOffConfig()
+	cfg.Enabled = false
+	return &Config{
+		RetryConfig: cfg,
+	}
 }
 
 func createTracesExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Traces, error) {
@@ -38,9 +42,9 @@ func createTracesExporter(ctx context.Context, set exporter.Settings, config com
 	return exporterhelper.NewTraces(ctx, set, cfg,
 		ex.pushTraces,
 		exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}),
-		// Disable Timeout/RetryOnFailure
+		// Disable Timeout
 		exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}),
-		exporterhelper.WithRetry(configretry.BackOffConfig{Enabled: false}),
+		exporterhelper.WithRetry(cfg.RetryConfig),
 		exporterhelper.WithQueue(cfg.QueueConfig),
 		exporterhelper.WithStart(ex.start),
 		exporterhelper.WithShutdown(ex.close),
diff --git a/cmd/jaeger/internal/exporters/storageexporter/factory_test.go b/cmd/jaeger/internal/exporters/storageexporter/factory_test.go
new file mode 100644
index 00000000000..ab40c6bf05a
--- /dev/null
+++ b/cmd/jaeger/internal/exporters/storageexporter/factory_test.go
@@ -0,0 +1,170 @@
+// Copyright (c) 2025 The Jaeger Authors.
+// SPDX-License-Identifier: Apache-2.0
+
+package storageexporter
+
+import (
+	"context"
+	"testing"
+	"time"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/collector/component"
+	"go.opentelemetry.io/collector/component/componenttest"
+	"go.opentelemetry.io/collector/config/configretry"
+	"go.opentelemetry.io/collector/exporter"
+)
+
+func TestConfig_Validate(t *testing.T) {
+	tests := []struct {
+		name    string
+		config  *Config
+		wantErr bool
+	}{
+		{
+			name: "valid config",
+			config: &Config{
+				TraceStorage: "test",
+				RetryConfig: configretry.BackOffConfig{
+					Enabled:         true,
+					InitialInterval: 5 * time.Second,
+					MaxInterval:     30 * time.Second,
+					MaxElapsedTime:  5 * time.Minute,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "missing trace storage",
+			config: &Config{
+				TraceStorage: "",
+			},
+			wantErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.config.Validate()
+			if tt.wantErr {
+				assert.Error(t, err)
+			} else {
+				assert.NoError(t, err)
+			}
+		})
+	}
+}
+
+func createTestExporterSettings() exporter.Settings {
+	return exporter.Settings{
+		ID:                component.MustNewIDWithName("jaeger_storage", "test"),
+		TelemetrySettings: componenttest.NewNopTelemetrySettings(),
+	}
+}
+
+func TestCreateTracesExporter(t *testing.T) {
+	t.Run("with default config", func(t *testing.T) {
+		defaultCfg := createDefaultConfig().(*Config)
+		defaultCfg.TraceStorage = "test"
+
+		exp, err := createTracesExporter(
+			context.Background(),
+			createTestExporterSettings(),
+			defaultCfg,
+		)
+
+		require.NoError(t, err)
+		require.NotNil(t, exp)
+		assert.False(t, defaultCfg.RetryConfig.Enabled, "Retry should be disabled by default")
+	})
+
+	t.Run("with custom retry config", func(t *testing.T) {
+		cfg := &Config{
+			TraceStorage: "test",
+			RetryConfig: configretry.BackOffConfig{
+				Enabled:             true,
+				InitialInterval:     10 * time.Second,
+				RandomizationFactor: 0.7,
+				Multiplier:          2.0,
+				MaxInterval:         60 * time.Second,
+				MaxElapsedTime:      10 * time.Minute,
+			},
+		}
+
+		exp, err := createTracesExporter(
+			context.Background(),
+			createTestExporterSettings(),
+			cfg,
+		)
+
+		require.NoError(t, err)
+		require.NotNil(t, exp)
+
+		assert.True(t, cfg.RetryConfig.Enabled, "Retry should be enabled")
+		assert.Equal(t, 10*time.Second, cfg.RetryConfig.InitialInterval, "InitialInterval should be 10s")
+		assert.InDelta(t, 0.7, cfg.RetryConfig.RandomizationFactor, 1e-6, "RandomizationFactor should be 0.7")
+		assert.InDelta(t, 2.0, cfg.RetryConfig.Multiplier, 1e-6, "Multiplier should be 2.0")
+		assert.Equal(t, 60*time.Second, cfg.RetryConfig.MaxInterval, "MaxInterval should be 60s")
+		assert.Equal(t, 10*time.Minute, cfg.RetryConfig.MaxElapsedTime, "MaxElapsedTime should be 10m")
+	})
+
+	t.Run("with disabled retry", func(t *testing.T) {
+		cfg := &Config{
+			TraceStorage: "test",
+			RetryConfig: configretry.BackOffConfig{
+				Enabled: false,
+			},
+		}
+
+		exp, err := createTracesExporter(
+			context.Background(),
+			createTestExporterSettings(),
+			cfg,
+		)
+
+		require.NoError(t, err)
+		require.NotNil(t, exp)
+
+		assert.False(t, cfg.RetryConfig.Enabled)
+	})
+}
+
+func TestCreateTracesExporter_Validation(t *testing.T) {
+	tests := []struct {
+		name    string
+		config  *Config
+		wantErr bool
+	}{
+		{
+			name: "valid config",
+			config: &Config{
+				TraceStorage: "test",
+				RetryConfig: configretry.BackOffConfig{
+					Enabled: true,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "missing trace storage",
+			config: &Config{
+				RetryConfig: configretry.BackOffConfig{
+					Enabled: true,
+				},
+			},
+			wantErr: true,
+		},
+	}
+
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			err := tt.config.Validate()
+			if tt.wantErr {
+				assert.Error(t, err)
+			} else {
+				assert.NoError(t, err)
+			}
+		})
+	}
+}


Reviews:
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-17T21:22:52Z
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-17T21:23:41Z
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-17T21:24:55Z
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-17T21:25:46Z
user: login: yurishkuro
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-18T16:40:15Z

Review comments:
diff_hunk: @@ -15,3 +17,50 @@ extensions:
       memstore:
         max_traces: 100000
 ```
+
+### Retry Configuration
+
+The exporter supports configurable retry behavior for failed exports. By default, retry is enabled with the following settings:
+
+- `enabled`: true
+- `initial_interval`: 5s
+- `randomization_factor`: 0.5
+- `multiplier`: 1.5
+- `max_interval`: 30s
+- `max_elapsed_time`: 5m
+
+#### Explanation of Retry Parameters
path: cmd/jaeger/internal/exporters/storageexporter/README.md
user: login: yurishkuro
body: why do we need this? Isn't it already documented in OTEL? I don't want to duplicate the docs, just refer to upstream docs.
created_at: 2025-05-17T21:22:52Z
author_association: MEMBER
diff_hunk: @@ -19,6 +20,7 @@ var (
 type Config struct {
 	TraceStorage string                          `mapstructure:"trace_storage" valid:"required"`
 	QueueConfig  exporterhelper.QueueBatchConfig `mapstructure:"queue" valid:"optional"`
+	RetryConfig  configretry.BackOffConfig       `mapstructure:"retry_on_failure" valid:"optional"`
path: cmd/jaeger/internal/exporters/storageexporter/config.go
user: login: yurishkuro
body: I am not sure what `valid:"optional"` means in the context of having an actual struct by value.
created_at: 2025-05-17T21:23:40Z
author_association: MEMBER
diff_hunk: @@ -29,18 +30,61 @@ func NewFactory() exporter.Factory {
 }
 
 func createDefaultConfig() component.Config {
-	return &Config{}
+	return &Config{
+		RetryConfig: configretry.BackOffConfig{
path: cmd/jaeger/internal/exporters/storageexporter/factory.go
user: login: yurishkuro
body: we don't want this enabled by default.
created_at: 2025-05-17T21:24:55Z
author_association: MEMBER
diff_hunk: @@ -29,18 +30,61 @@ func NewFactory() exporter.Factory {
 }
 
 func createDefaultConfig() component.Config {
-	return &Config{}
+	return &Config{
+		RetryConfig: configretry.BackOffConfig{
+			Enabled:             true,
+			InitialInterval:     5 * time.Second,
+			RandomizationFactor: 0.5,
+			Multiplier:          1.5,
+			MaxInterval:         30 * time.Second,
+			MaxElapsedTime:      5 * time.Minute,
+		},
+	}
 }
 
-func createTracesExporter(ctx context.Context, set exporter.Settings, config component.Config) (exporter.Traces, error) {
+func createTracesExporter(
+	ctx context.Context,
+	set exporter.Settings,
+	config component.Config,
+) (exporter.Traces, error) {
 	cfg := config.(*Config)
+
+	defaultCfg := createDefaultConfig().(*Config)
+
+	if !cfg.RetryConfig.Enabled {
path: cmd/jaeger/internal/exporters/storageexporter/factory.go
user: login: yurishkuro
body: we didn't have anything similar for other configs, why do we need it for this one?
created_at: 2025-05-17T21:25:45Z
author_association: MEMBER

PR comments:
user: login: kumarlokesh
created_at: 2025-05-18T07:32:30Z
body: @yurishkuro addressed comments here https://github.com/jaegertracing/jaeger/pull/7132/commits/4d62811ec641b60f0f4b0b74783969e1193bca65
author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-05-18T16:47:50Z
body: ## [Codecov](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 96.19%. Comparing base [(`7d66726`)](https://app.codecov.io/gh/jaegertracing/jaeger/commit/7d667262cb6ac6d4b1dc3e47c08b652438c9fde0?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) to head [(`4d62811`)](https://app.codecov.io/gh/jaegertracing/jaeger/commit/4d62811ec641b60f0f4b0b74783969e1193bca65?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing).
> Report is 1 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #7132      +/-   ##
==========================================
- Coverage   96.20%   96.19%   -0.02%     
==========================================
  Files         358      358              
  Lines       21596    21600       +4     
==========================================
+ Hits        20777    20778       +1     
- Misses        613      615       +2     
- Partials      206      207       +1     
```

| [Flag](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | Coverage Δ | |
|---|---|---|
| [badger_v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `9.90% <ø> (ø)` | |
| [badger_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [cassandra-4.x-v1-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `14.89% <ø> (ø)` | |
| [cassandra-4.x-v2-auto](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.04% <ø> (ø)` | |
| [cassandra-4.x-v2-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.04% <ø> (ø)` | |
| [cassandra-5.x-v1-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `14.89% <ø> (ø)` | |
| [cassandra-5.x-v2-auto](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.04% <ø> (ø)` | |
| [cassandra-5.x-v2-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.04% <ø> (ø)` | |
| [elasticsearch-6.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.23% <ø> (ø)` | |
| [elasticsearch-7.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.31% <ø> (ø)` | |
| [elasticsearch-8.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.49% <ø> (ø)` | |
| [elasticsearch-8.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [grpc_v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `11.44% <ø> (ø)` | |
| [grpc_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [kafka-3.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `10.17% <ø> (ø)` | |
| [kafka-3.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [memory_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [opensearch-1.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.36% <ø> (ø)` | |
| [opensearch-2.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.36% <ø> (ø)` | |
| [opensearch-2.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [query](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.05% <ø> (ø)` | |
| [tailsampling-processor](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `0.55% <ø> (ø)` | |
| [unittests](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `95.01% <100.00%> (-0.02%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7132?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE