Repository: jaegertracing/jaeger
Pull request #7021: [ES][v2] Implement `FindTraces` for ES/OS for v2
Author: login: Manik2708
Labels: name: area/storage
name: storage/elasticsearch
name: v2
name: changelog:experimental
description: Change to an experimental part of the code
Created: 2025-04-13T19:29:02Z | Merged: 2025-04-20T19:22:10Z

## Which problem is this PR solving?
- Fixes a part of: #7034

## Description of the changes
- Implement the `FindTraces` for ES/OS for v2

## How was this change tested?
- Unit Tests

## 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`



Diff:
diff --git a/internal/storage/v2/elasticsearch/tracestore/reader.go b/internal/storage/v2/elasticsearch/tracestore/reader.go
index 2df71294d57..1a3540ca0d4 100644
--- a/internal/storage/v2/elasticsearch/tracestore/reader.go
+++ b/internal/storage/v2/elasticsearch/tracestore/reader.go
@@ -72,8 +72,24 @@ func (t *TraceReader) GetOperations(ctx context.Context, query tracestore.Operat
 	return operations, nil
 }
 
-func (*TraceReader) FindTraces(_ context.Context, _ tracestore.TraceQueryParams) iter.Seq2[[]ptrace.Traces, error] {
-	panic("not implemented")
+func (t *TraceReader) FindTraces(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[[]ptrace.Traces, error] {
+	return func(yield func([]ptrace.Traces, error) bool) {
+		traces, err := t.spanReader.FindTraces(ctx, toDBTraceQueryParams(query))
+		if err != nil {
+			yield(nil, err)
+			return
+		}
+		for _, trace := range traces {
+			td, err := FromDBModel(trace.Spans)
+			if err != nil {
+				yield(nil, err)
+				return
+			}
+			if !yield([]ptrace.Traces{td}, nil) {
+				return
+			}
+		}
+	}
 }
 
 func (t *TraceReader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[[]tracestore.FoundTraceID, error] {
diff --git a/internal/storage/v2/elasticsearch/tracestore/reader_test.go b/internal/storage/v2/elasticsearch/tracestore/reader_test.go
index 89e8d5ebd25..c0b6a49a18c 100644
--- a/internal/storage/v2/elasticsearch/tracestore/reader_test.go
+++ b/internal/storage/v2/elasticsearch/tracestore/reader_test.go
@@ -7,6 +7,7 @@ import (
 	"context"
 	"encoding/json"
 	"errors"
+	"iter"
 	"testing"
 	"time"
 
@@ -14,12 +15,13 @@ import (
 	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/require"
 	"go.opentelemetry.io/collector/pdata/pcommon"
+	"go.opentelemetry.io/collector/pdata/ptrace"
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore/mocks"
-	v2api "github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
+	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 )
 
 func TestTraceReader_GetServices(t *testing.T) {
@@ -46,7 +48,7 @@ func TestTraceReader_GetOperations(t *testing.T) {
 		},
 	}
 	coreReader.On("GetOperations", mock.Anything, mock.Anything).Return(operations, nil)
-	expected := []v2api.Operation{
+	expected := []tracestore.Operation{
 		{
 			Name:     "op-1",
 			SpanKind: "kind--1",
@@ -56,7 +58,7 @@ func TestTraceReader_GetOperations(t *testing.T) {
 			SpanKind: "kind--2",
 		},
 	}
-	actual, err := reader.GetOperations(context.Background(), v2api.OperationQueryParams{})
+	actual, err := reader.GetOperations(context.Background(), tracestore.OperationQueryParams{})
 	require.NoError(t, err)
 	require.Equal(t, expected, actual)
 }
@@ -65,7 +67,7 @@ func TestTraceReader_GetOperations_Error(t *testing.T) {
 	coreReader := &mocks.CoreSpanReader{}
 	reader := TraceReader{spanReader: coreReader}
 	coreReader.On("GetOperations", mock.Anything, mock.Anything).Return(nil, errors.New("error"))
-	operations, err := reader.GetOperations(context.Background(), v2api.OperationQueryParams{})
+	operations, err := reader.GetOperations(context.Background(), tracestore.OperationQueryParams{})
 	require.EqualError(t, err, "error")
 	require.Nil(t, operations)
 }
@@ -80,7 +82,7 @@ func TestTraceReader_GetTraces(t *testing.T) {
 	span.TraceID = "00000000000000020000000000000000"
 	dbTrace2 := dbmodel.Trace{Spans: []dbmodel.Span{span}}
 	coreReader.On("GetTraces", mock.Anything, mock.Anything).Return([]dbmodel.Trace{dbTrace, dbTrace2}, nil)
-	traces := reader.GetTraces(context.Background(), v2api.GetTraceParams{})
+	traces := reader.GetTraces(context.Background(), tracestore.GetTraceParams{})
 	for td, err := range traces {
 		require.NoError(t, err)
 		assert.Len(t, td, 1)
@@ -89,28 +91,32 @@ func TestTraceReader_GetTraces(t *testing.T) {
 	}
 }
 
-func TestTraceReader_GetTraces_Errors(t *testing.T) {
+func testTraceReaderGetTracesAndFindTracesErrors(t *testing.T, fxnName string, actualTraces func(r TraceReader) iter.Seq2[[]ptrace.Traces, error]) {
 	tests := []struct {
-		name            string
-		returningErr    error
-		returningTraces []dbmodel.Trace
-		expectedErr     string
+		name        string
+		expectedErr string
+		mockFxn     func(m *mocks.CoreSpanReader)
 	}{
 		{
-			name:         "some error from db GetTraces",
-			returningErr: errors.New("some error"),
-			expectedErr:  "some error",
+			name:        "some error from core reader",
+			expectedErr: "some error",
+			mockFxn: func(m *mocks.CoreSpanReader) {
+				m.On(fxnName, mock.Anything, mock.Anything).Return(nil, errors.New("some error"))
+			},
 		},
 		{
 			name: "conversion error",
-			returningTraces: []dbmodel.Trace{
-				{
-					Spans: []dbmodel.Span{
-						{
-							TraceID: "wrong-trace-id",
+			mockFxn: func(m *mocks.CoreSpanReader) {
+				dbTraces := []dbmodel.Trace{
+					{
+						Spans: []dbmodel.Span{
+							{
+								TraceID: "wrong-trace-id",
+							},
 						},
 					},
-				},
+				}
+				m.On(fxnName, mock.Anything, mock.Anything).Return(dbTraces, nil)
 			},
 			expectedErr: "encoding/hex: invalid byte: U+0077 'w'",
 		},
@@ -119,8 +125,8 @@ func TestTraceReader_GetTraces_Errors(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 			coreReader := &mocks.CoreSpanReader{}
 			reader := TraceReader{spanReader: coreReader}
-			coreReader.On("GetTraces", mock.Anything, mock.Anything).Return(tt.returningTraces, tt.returningErr)
-			traces := reader.GetTraces(context.Background(), v2api.GetTraceParams{})
+			tt.mockFxn(coreReader)
+			traces := actualTraces(reader)
 			for trace, err := range traces {
 				require.Nil(t, trace)
 				require.ErrorContains(t, err, tt.expectedErr)
@@ -129,12 +135,38 @@ func TestTraceReader_GetTraces_Errors(t *testing.T) {
 	}
 }
 
+func TestTraceReader_GetTraces_Errors(t *testing.T) {
+	testTraceReaderGetTracesAndFindTracesErrors(t, "GetTraces", func(r TraceReader) iter.Seq2[[]ptrace.Traces, error] {
+		return r.GetTraces(context.Background(), tracestore.GetTraceParams{})
+	})
+}
+
 func TestTraceReader_FindTraces(t *testing.T) {
-	reader := NewTraceReader(spanstore.SpanReaderParams{
-		Logger: zap.NewNop(),
+	coreReader := &mocks.CoreSpanReader{}
+	reader := TraceReader{spanReader: coreReader}
+	tracesStr, spanStr := loadFixtures(t, 1)
+	var span dbmodel.Span
+	require.NoError(t, json.Unmarshal(spanStr, &span))
+	dbTrace := dbmodel.Trace{Spans: []dbmodel.Span{span}}
+	span.TraceID = "00000000000000020000000000000000"
+	dbTrace2 := dbmodel.Trace{Spans: []dbmodel.Span{span}}
+	coreReader.On("FindTraces", mock.Anything, mock.Anything).Return([]dbmodel.Trace{dbTrace, dbTrace2}, nil)
+	traces := reader.FindTraces(context.Background(), tracestore.TraceQueryParams{
+		Attributes: pcommon.NewMap(),
 	})
-	assert.Panics(t, func() {
-		reader.FindTraces(context.Background(), v2api.TraceQueryParams{})
+	for td, err := range traces {
+		require.NoError(t, err)
+		assert.Len(t, td, 1)
+		testTraces(t, tracesStr, td[0])
+		break
+	}
+}
+
+func TestTraceReader_FindTraces_Errors(t *testing.T) {
+	testTraceReaderGetTracesAndFindTracesErrors(t, "FindTraces", func(r TraceReader) iter.Seq2[[]ptrace.Traces, error] {
+		return r.FindTraces(context.Background(), tracestore.TraceQueryParams{
+			Attributes: pcommon.NewMap(),
+		})
 	})
 }
 
@@ -146,12 +178,12 @@ func TestTraceReader_FindTraceIDs(t *testing.T) {
 		"00000000000000020000000000000000",
 		"00000000000000030000000000000000",
 	}
-	expected := make([]v2api.FoundTraceID, 0, len(dbTraceIDs))
+	expected := make([]tracestore.FoundTraceID, 0, len(dbTraceIDs))
 	for _, dbTraceID := range dbTraceIDs {
 		expected = append(expected, fromDBTraceId(t, dbTraceID))
 	}
 	coreReader.On("FindTraceIDs", mock.Anything, mock.Anything).Return(dbTraceIDs, nil)
-	for traceIds, err := range reader.FindTraceIDs(context.Background(), v2api.TraceQueryParams{
+	for traceIds, err := range reader.FindTraceIDs(context.Background(), tracestore.TraceQueryParams{
 		Attributes: pcommon.NewMap(),
 	}) {
 		require.NoError(t, err)
@@ -183,7 +215,7 @@ func TestTraceReader_FindTraceIDs_Error(t *testing.T) {
 			attrs := pcommon.NewMap()
 			attrs.PutStr("key1", "val1")
 			ts := time.Now()
-			traceQueryParams := v2api.TraceQueryParams{
+			traceQueryParams := tracestore.TraceQueryParams{
 				Attributes:    attrs,
 				StartTimeMin:  ts,
 				ServiceName:   "testing-service-name",
@@ -213,10 +245,17 @@ func TestTraceReader_FindTraceIDs_Error(t *testing.T) {
 	}
 }
 
-func fromDBTraceId(t *testing.T, traceID dbmodel.TraceID) v2api.FoundTraceID {
+func Test_NewTraceReader(t *testing.T) {
+	reader := NewTraceReader(spanstore.SpanReaderParams{
+		Logger: zap.NewNop(),
+	})
+	assert.IsType(t, &spanstore.SpanReader{}, reader.spanReader)
+}
+
+func fromDBTraceId(t *testing.T, traceID dbmodel.TraceID) tracestore.FoundTraceID {
 	traceId, err := fromDbTraceId(traceID)
 	require.NoError(t, err)
-	return v2api.FoundTraceID{
+	return tracestore.FoundTraceID{
 		TraceID: traceId,
 	}
 }


Reviews:
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-13T22:14:42Z
user: login: yurishkuro
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-20T18:30:28Z
user: login: Manik2708
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-20T18:39:49Z
user: login: yurishkuro
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-20T18:51:09Z
user: login: yurishkuro
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-20T19:12:27Z

Review comments:
diff_hunk: @@ -0,0 +1,130 @@
+// Copyright (c) 2025 The Jaeger Authors.
+// SPDX-License-Identifier: Apache-2.0
+
+package tracestore
+
+import (
+	"context"
+	"iter"
+
+	"go.opentelemetry.io/collector/pdata/ptrace"
+
+	"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
+	"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore"
+	v2api "github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
+)
+
+type TraceReader struct {
+	spanReader spanstore.CoreSpanReader
+}
+
+func NewTraceReader(p spanstore.SpanReaderParams) *TraceReader {
+	return &TraceReader{
+		spanReader: spanstore.NewSpanReader(p),
+	}
+}
+
+func (t *TraceReader) GetTraces(ctx context.Context, traceIDs ...v2api.GetTraceParams) iter.Seq2[[]ptrace.Traces, error] {
path: internal/storage/v2/elasticsearch/tracestore/reader.go
user: login: yurishkuro
body: you don't need to implement every single function of the API in a single PR, it will make the tests very large. Start with services / operations, which are relatively trivial, and return not-implemented from the other functions.

This is alway the way not to get blocked on a single review, you can work on those independently.
created_at: 2025-04-13T22:14:41Z
author_association: MEMBER
diff_hunk: @@ -213,10 +245,18 @@ func TestTraceReader_FindTraceIDs_Error(t *testing.T) {
 	}
 }
 
-func fromDBTraceId(t *testing.T, traceID dbmodel.TraceID) v2api.FoundTraceID {
+func Test_NewTraceReader(t *testing.T) {
+	reader := NewTraceReader(spanstore.SpanReaderParams{
+		Logger: zap.NewNop(),
+	})
+	_, ok := reader.spanReader.(*spanstore.SpanReader)
+	assert.True(t, ok)
path: internal/storage/v2/elasticsearch/tracestore/reader_test.go
user: login: Manik2708
body: I am doubtful of this but then this function is just calling the core reader internally, so I think it will be enough checking whether `SpanReader` is passed as `CoreSpanReader`
created_at: 2025-04-20T18:39:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -213,10 +245,18 @@ func TestTraceReader_FindTraceIDs_Error(t *testing.T) {
 	}
 }
 
-func fromDBTraceId(t *testing.T, traceID dbmodel.TraceID) v2api.FoundTraceID {
+func Test_NewTraceReader(t *testing.T) {
+	reader := NewTraceReader(spanstore.SpanReaderParams{
+		Logger: zap.NewNop(),
+	})
+	_, ok := reader.spanReader.(*spanstore.SpanReader)
+	assert.True(t, ok)
path: internal/storage/v2/elasticsearch/tracestore/reader_test.go
user: login: yurishkuro
body: ok. You didn't have to use a case, there is a dedicated assert function that checks for types.
created_at: 2025-04-20T18:51:09Z
author_association: MEMBER

PR comments:
user: login: codecov[bot]
created_at: 2025-04-13T19:36:31Z
body: ## [Codecov](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021?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.03%. Comparing base [(`0994c98`)](https://app.codecov.io/gh/jaegertracing/jaeger/commit/0994c98cbb01de88382cfd5cba2af527a82aaf7b?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) to head [(`20ba891`)](https://app.codecov.io/gh/jaegertracing/jaeger/commit/20ba891201ab1df8832bb3df49cbda5cdd09e49d?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    #7021      +/-   ##
==========================================
- Coverage   96.04%   96.03%   -0.02%     
==========================================
  Files         355      355              
  Lines       20973    20987      +14     
==========================================
+ Hits        20144    20155      +11     
- Misses        624      626       +2     
- Partials      205      206       +1     
```

| [Flag](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/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/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `9.97% <ø> (ø)` | |
| [badger_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [cassandra-4.x-v1-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `15.00% <ø> (ø)` | |
| [cassandra-4.x-v2-auto](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.06% <ø> (ø)` | |
| [cassandra-4.x-v2-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.06% <ø> (ø)` | |
| [cassandra-5.x-v1-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `15.00% <ø> (ø)` | |
| [cassandra-5.x-v2-auto](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.06% <ø> (ø)` | |
| [cassandra-5.x-v2-manual](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.06% <ø> (ø)` | |
| [elasticsearch-6.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `19.95% <ø> (ø)` | |
| [elasticsearch-7.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.02% <ø> (ø)` | |
| [elasticsearch-8.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.19% <ø> (ø)` | |
| [elasticsearch-8.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.18% <ø> (+0.11%)` | :arrow_up: |
| [grpc_v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `11.52% <ø> (ø)` | |
| [grpc_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [kafka-3.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `10.24% <ø> (ø)` | |
| [kafka-3.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [memory_v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [opensearch-1.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.07% <ø> (ø)` | |
| [opensearch-2.x-v1](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `20.07% <ø> (ø)` | |
| [opensearch-2.x-v2](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [query](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `2.07% <ø> (ø)` | |
| [tailsampling-processor](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `0.56% <ø> (ø)` | |
| [unittests](https://app.codecov.io/gh/jaegertracing/jaeger/pull/7021/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=jaegertracing) | `94.80% <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/7021?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
user: login: Manik2708
created_at: 2025-04-20T18:31:32Z
body: /Don't Merge completing the code-coverage 
author_association: CONTRIBUTOR
user: login: yurishkuro
created_at: 2025-04-20T18:34:45Z
body: nit: I changed description to link to #7034, not the parent ticket.
author_association: MEMBER