Skip to content

Commit c07d863

Browse files
mahadzaryab1Manik2708
authored andcommitted
[v2][adjuster] Implement otlp to model translator with post processing (jaegertracing#6394)
## Which problem is this PR solving? - Towards jaegertracing#6344 ## Description of the changes - Implemented a translator in `jptrace` with a function `ProtoFromTraces` that is a wrapper of the upstream `ProtoFromTraces` in opentelemetry-collector-contrib jaeger translator. This function appends the warnings in `jaeger.internal.warnings` to the corresponding warnings field in the proto model. ## How was this change tested? - Added 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` --------- Signed-off-by: Mahad Zaryab <mahadzaryab1@gmail.com>
1 parent 5bac13c commit c07d863

File tree

9 files changed

+197
-8
lines changed

9 files changed

+197
-8
lines changed

.golangci.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ linters-settings:
139139
files:
140140
- "**_test.go"
141141

142+
# TODO: enable after import is not used anywhere
143+
# disallow-otel-contrib-translator:
144+
# deny:
145+
# - pkg: github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger
146+
# desc: "Use jptrace package instead of opentelemetry-collector-contrib/pkg/translator/jaeger"
147+
# files:
148+
# - "!**/jptrace/**"
149+
142150
goimports:
143151
local-prefixes: github.com/jaegertracing/jaeger
144152
gosec:

cmd/collector/app/handler/otlp_receiver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"context"
88
"fmt"
99

10-
otlp2jaeger "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
1110
"go.opentelemetry.io/collector/component"
1211
"go.opentelemetry.io/collector/component/componentstatus"
1312
"go.opentelemetry.io/collector/config/confignet"
@@ -23,6 +22,7 @@ import (
2322

2423
"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
2524
"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
25+
"github.com/jaegertracing/jaeger/internal/jptrace"
2626
"github.com/jaegertracing/jaeger/pkg/tenancy"
2727
)
2828

@@ -108,7 +108,7 @@ type consumerDelegate struct {
108108
}
109109

110110
func (c *consumerDelegate) consume(ctx context.Context, td ptrace.Traces) error {
111-
batches := otlp2jaeger.ProtoFromTraces(td)
111+
batches := jptrace.ProtoFromTraces(td)
112112
for _, batch := range batches {
113113
err := c.batchConsumer.consume(ctx, batch)
114114
if err != nil {

cmd/jaeger/internal/processors/adaptivesampling/processor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
"context"
88
"fmt"
99

10-
otlp2jaeger "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
1110
"go.opentelemetry.io/collector/component"
1211
"go.opentelemetry.io/collector/pdata/ptrace"
1312

1413
"github.com/jaegertracing/jaeger/cmd/collector/app/sampling/samplingstrategy"
1514
"github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/remotesampling"
15+
"github.com/jaegertracing/jaeger/internal/jptrace"
1616
"github.com/jaegertracing/jaeger/internal/metrics/otelmetrics"
1717
"github.com/jaegertracing/jaeger/plugin/sampling/strategyprovider/adaptive"
1818
)
@@ -65,7 +65,7 @@ func (tp *traceProcessor) close(context.Context) error {
6565
}
6666

6767
func (tp *traceProcessor) processTraces(_ context.Context, td ptrace.Traces) (ptrace.Traces, error) {
68-
batches := otlp2jaeger.ProtoFromTraces(td)
68+
batches := jptrace.ProtoFromTraces(td)
6969
for _, batch := range batches {
7070
for _, span := range batch.Spans {
7171
if span.Process == nil {

cmd/query/app/otlp_translator.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ package app
66
import (
77
"fmt"
88

9-
model2otel "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
109
"go.opentelemetry.io/collector/pdata/ptrace"
1110

11+
"github.com/jaegertracing/jaeger/internal/jptrace"
1212
"github.com/jaegertracing/jaeger/model"
1313
)
1414

@@ -18,7 +18,7 @@ func otlp2traces(otlpSpans []byte) ([]*model.Trace, error) {
1818
if err != nil {
1919
return nil, fmt.Errorf("cannot unmarshal OTLP : %w", err)
2020
}
21-
jaegerBatches := model2otel.ProtoFromTraces(otlpTraces)
21+
jaegerBatches := jptrace.ProtoFromTraces(otlpTraces)
2222
var traces []*model.Trace
2323
traceMap := make(map[model.TraceID]*model.Trace)
2424
for _, batch := range jaegerBatches {

internal/jptrace/translator.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Copyright (c) 2024 The Jaeger Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package jptrace
5+
6+
import (
7+
jaegerTranslator "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
8+
"go.opentelemetry.io/collector/pdata/ptrace"
9+
10+
"github.com/jaegertracing/jaeger/model"
11+
)
12+
13+
// ProtoFromTraces converts OpenTelemetry traces (ptrace.Traces)
14+
// to Jaeger model batches ([]*model.Batch).
15+
func ProtoFromTraces(traces ptrace.Traces) []*model.Batch {
16+
batches := jaegerTranslator.ProtoFromTraces(traces)
17+
spanMap := createSpanMapFromBatches(batches)
18+
transferWarnings(traces, spanMap)
19+
return batches
20+
}
21+
22+
func createSpanMapFromBatches(batches []*model.Batch) map[model.SpanID]*model.Span {
23+
spanMap := make(map[model.SpanID]*model.Span)
24+
for _, batch := range batches {
25+
for _, span := range batch.Spans {
26+
spanMap[span.SpanID] = span
27+
}
28+
}
29+
return spanMap
30+
}
31+
32+
func transferWarnings(traces ptrace.Traces, spanMap map[model.SpanID]*model.Span) {
33+
resources := traces.ResourceSpans()
34+
for i := 0; i < resources.Len(); i++ {
35+
scopes := resources.At(i).ScopeSpans()
36+
for j := 0; j < scopes.Len(); j++ {
37+
spans := scopes.At(j).Spans()
38+
for k := 0; k < spans.Len(); k++ {
39+
otelSpan := spans.At(k)
40+
warnings := GetWarnings(otelSpan)
41+
span := spanMap[model.SpanIDFromOTEL(otelSpan.SpanID())]
42+
span.Warnings = append(span.Warnings, warnings...)
43+
// filter out the warning tag
44+
span.Tags = filterTags(span.Tags, warningsAttribute)
45+
}
46+
}
47+
}
48+
}
49+
50+
func filterTags(tags []model.KeyValue, keyToRemove string) []model.KeyValue {
51+
var filteredTags []model.KeyValue
52+
for _, tag := range tags {
53+
if tag.Key != keyToRemove {
54+
filteredTags = append(filteredTags, tag)
55+
}
56+
}
57+
return filteredTags
58+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) 2024 The Jaeger Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package jptrace
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/assert"
10+
"go.opentelemetry.io/collector/pdata/pcommon"
11+
"go.opentelemetry.io/collector/pdata/ptrace"
12+
13+
"github.com/jaegertracing/jaeger/model"
14+
)
15+
16+
func TestProtoFromTraces_AddsWarnings(t *testing.T) {
17+
traces := ptrace.NewTraces()
18+
rs1 := traces.ResourceSpans().AppendEmpty()
19+
ss1 := rs1.ScopeSpans().AppendEmpty()
20+
span1 := ss1.Spans().AppendEmpty()
21+
span1.SetName("test-span-1")
22+
span1.SetSpanID(pcommon.SpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8}))
23+
AddWarning(span1, "test-warning-1")
24+
AddWarning(span1, "test-warning-2")
25+
span1.Attributes().PutStr("key", "value")
26+
27+
ss2 := rs1.ScopeSpans().AppendEmpty()
28+
span2 := ss2.Spans().AppendEmpty()
29+
span2.SetName("test-span-2")
30+
span2.SetSpanID(pcommon.SpanID([8]byte{9, 10, 11, 12, 13, 14, 15, 16}))
31+
32+
rs2 := traces.ResourceSpans().AppendEmpty()
33+
ss3 := rs2.ScopeSpans().AppendEmpty()
34+
span3 := ss3.Spans().AppendEmpty()
35+
span3.SetName("test-span-3")
36+
span3.SetSpanID(pcommon.SpanID([8]byte{17, 18, 19, 20, 21, 22, 23, 24}))
37+
AddWarning(span3, "test-warning-3")
38+
39+
batches := ProtoFromTraces(traces)
40+
41+
assert.Len(t, batches, 2)
42+
43+
assert.Len(t, batches[0].Spans, 2)
44+
assert.Equal(t, "test-span-1", batches[0].Spans[0].OperationName)
45+
assert.Equal(t, []string{"test-warning-1", "test-warning-2"}, batches[0].Spans[0].Warnings)
46+
assert.Equal(t, []model.KeyValue{{Key: "key", VStr: "value"}}, batches[0].Spans[0].Tags)
47+
assert.Equal(t, "test-span-2", batches[0].Spans[1].OperationName)
48+
assert.Empty(t, batches[0].Spans[1].Warnings)
49+
assert.Empty(t, batches[0].Spans[1].Tags)
50+
51+
assert.Len(t, batches[1].Spans, 1)
52+
assert.Equal(t, "test-span-3", batches[1].Spans[0].OperationName)
53+
assert.Equal(t, []string{"test-warning-3"}, batches[1].Spans[0].Warnings)
54+
assert.Empty(t, batches[1].Spans[0].Tags)
55+
}

model/ids.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,3 +261,19 @@ func (s *SpanID) UnmarshalJSON(data []byte) error {
261261
func (s *SpanID) UnmarshalJSONPB(_ *jsonpb.Unmarshaler, b []byte) error {
262262
return s.UnmarshalJSON(b)
263263
}
264+
265+
// ToOTELSpanID converts the SpanID to OTEL's representation of a span identitfier.
266+
// This was taken from
267+
// https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/internal/coreinternal/idutils/big_endian_converter.go.
268+
func (s SpanID) ToOTELSpanID() pcommon.SpanID {
269+
spanID := [8]byte{}
270+
binary.BigEndian.PutUint64(spanID[:], uint64(s))
271+
return pcommon.SpanID(spanID)
272+
}
273+
274+
// ToOTELSpanID converts OTEL's SpanID to the model representation of a span identitfier.
275+
// This was taken from
276+
// https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/internal/coreinternal/idutils/big_endian_converter.go.
277+
func SpanIDFromOTEL(spanID pcommon.SpanID) SpanID {
278+
return SpanID(binary.BigEndian.Uint64(spanID[:]))
279+
}

model/ids_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,55 @@ func TestTraceIDFromOTEL(t *testing.T) {
137137
}
138138
require.Equal(t, expected, model.TraceIDFromOTEL(otelTraceID))
139139
}
140+
141+
func TestToOTELSpanID(t *testing.T) {
142+
tests := []struct {
143+
name string
144+
spanID model.SpanID
145+
expected pcommon.SpanID
146+
}{
147+
{
148+
name: "zero span ID",
149+
spanID: model.NewSpanID(0),
150+
expected: pcommon.NewSpanIDEmpty(),
151+
},
152+
{
153+
name: "non-zero span ID",
154+
spanID: model.NewSpanID(1),
155+
expected: pcommon.SpanID([8]byte{0, 0, 0, 0, 0, 0, 0, 1}),
156+
},
157+
}
158+
159+
for _, test := range tests {
160+
t.Run(test.name, func(t *testing.T) {
161+
actual := test.spanID.ToOTELSpanID()
162+
assert.Equal(t, test.expected, actual)
163+
})
164+
}
165+
}
166+
167+
func TestSpanIDFromOTEL(t *testing.T) {
168+
tests := []struct {
169+
name string
170+
otelSpanID pcommon.SpanID
171+
expected model.SpanID
172+
}{
173+
{
174+
name: "zero span ID",
175+
otelSpanID: pcommon.NewSpanIDEmpty(),
176+
expected: model.NewSpanID(0),
177+
},
178+
{
179+
name: "non-zero span ID",
180+
otelSpanID: pcommon.SpanID([8]byte{0, 0, 0, 0, 0, 0, 0, 1}),
181+
expected: model.NewSpanID(1),
182+
},
183+
}
184+
185+
for _, test := range tests {
186+
t.Run(test.name, func(t *testing.T) {
187+
actual := model.SpanIDFromOTEL(test.otelSpanID)
188+
assert.Equal(t, test.expected, actual)
189+
})
190+
}
191+
}

storage_v2/v1adapter/writer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import (
77
"context"
88
"errors"
99

10-
otlp2jaeger "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
1110
"go.opentelemetry.io/collector/pdata/ptrace"
1211

12+
"github.com/jaegertracing/jaeger/internal/jptrace"
1313
"github.com/jaegertracing/jaeger/storage/spanstore"
1414
"github.com/jaegertracing/jaeger/storage_v2/tracestore"
1515
)
@@ -26,7 +26,7 @@ func NewTraceWriter(spanWriter spanstore.Writer) tracestore.Writer {
2626

2727
// WriteTraces implements tracestore.Writer.
2828
func (t *TraceWriter) WriteTraces(ctx context.Context, td ptrace.Traces) error {
29-
batches := otlp2jaeger.ProtoFromTraces(td)
29+
batches := jptrace.ProtoFromTraces(td)
3030
var errs []error
3131
for _, batch := range batches {
3232
for _, span := range batch.Spans {

0 commit comments

Comments
 (0)