Skip to content

Commit 2f01ea5

Browse files
VihasMakwanacparkins
authored andcommitted
chore: add support for json codec in jaeger (open-telemetry#28625)
**Description:** Add support for JSON protocol for Jaeger codec. **Link to tracking Issue:** [open-telemetry#6272](open-telemetry#28686)
1 parent 4c9cbcb commit 2f01ea5

File tree

6 files changed

+112
-1
lines changed

6 files changed

+112
-1
lines changed

.chloggen/add-json-jaeger.yaml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: 'enhancement'
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
7+
component: encoding/jaegerencodingextension
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Add support for JSON protocol for jaeger codec
11+
12+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
13+
issues: [6272]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# If your change doesn't affect end users or the exported elements of any package,
21+
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
22+
# Optional: The change log or logs in which this entry should be included.
23+
# e.g. '[user]' or '[user, api]'
24+
# Include 'user' if the change is relevant to end users.
25+
# Include 'api' if there is a change to a library API.
26+
# Default: '[user]'
27+
change_logs: []

extension/encoding/jaegerencodingextension/config.go

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type JaegerProtocol string
1010

1111
const (
1212
JaegerProtocolProtobuf JaegerProtocol = "protobuf"
13+
JaegerProtocolJSON JaegerProtocol = "json"
1314
)
1415

1516
type Config struct {
@@ -19,6 +20,7 @@ type Config struct {
1920
func (c *Config) Validate() error {
2021
switch c.Protocol {
2122
case JaegerProtocolProtobuf:
23+
case JaegerProtocolJSON:
2224
default:
2325
return fmt.Errorf("invalid protocol %q", c.Protocol)
2426
}

extension/encoding/jaegerencodingextension/extension.go

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
)
1515

1616
var _ encoding.TracesUnmarshalerExtension = &jaegerExtension{}
17+
var _ ptrace.Unmarshaler = &jaegerExtension{}
1718

1819
type jaegerExtension struct {
1920
config *Config
@@ -28,6 +29,8 @@ func (e *jaegerExtension) Start(_ context.Context, _ component.Host) error {
2829
switch e.config.Protocol {
2930
case JaegerProtocolProtobuf:
3031
e.unmarshaler = jaegerProtobufTrace{}
32+
case JaegerProtocolJSON:
33+
e.unmarshaler = jaegerJSONTrace{}
3134
default:
3235
return fmt.Errorf("unsupported protocol: %q", e.config.Protocol)
3336
}

extension/encoding/jaegerencodingextension/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/extension/encod
33
go 1.20
44

55
require (
6+
github.com/gogo/protobuf v1.3.2
67
github.com/jaegertracing/jaeger v1.52.0
78
github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding v0.91.0
89
github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.91.0
@@ -17,7 +18,6 @@ require (
1718
require (
1819
github.com/apache/thrift v0.19.0 // indirect
1920
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
20-
github.com/gogo/protobuf v1.3.2 // indirect
2121
github.com/golang/protobuf v1.5.3 // indirect
2222
github.com/hashicorp/go-version v1.6.0 // indirect
2323
github.com/json-iterator/go v1.1.12 // indirect

extension/encoding/jaegerencodingextension/jaeger.go

+19
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
package jaegerencodingextension // import "github.com/open-telemetry/opentelemetry-collector-contrib/extension/encoding/jaegerencodingextension"
55

66
import (
7+
"bytes"
8+
9+
"github.com/gogo/protobuf/jsonpb"
710
jaegerproto "github.com/jaegertracing/jaeger/model"
811
"go.opentelemetry.io/collector/pdata/ptrace"
912

@@ -19,6 +22,22 @@ func (j jaegerProtobufTrace) UnmarshalTraces(buf []byte) (ptrace.Traces, error)
1922
if err != nil {
2023
return ptrace.NewTraces(), err
2124
}
25+
return jaegerSpanToTraces(span)
26+
}
27+
28+
type jaegerJSONTrace struct {
29+
}
30+
31+
func (j jaegerJSONTrace) UnmarshalTraces(buf []byte) (ptrace.Traces, error) {
32+
span := &jaegerproto.Span{}
33+
err := jsonpb.Unmarshal(bytes.NewReader(buf), span)
34+
if err != nil {
35+
return ptrace.NewTraces(), err
36+
}
37+
return jaegerSpanToTraces(span)
38+
}
39+
40+
func jaegerSpanToTraces(span *jaegerproto.Span) (ptrace.Traces, error) {
2241
batch := jaegerproto.Batch{
2342
Spans: []*jaegerproto.Span{span},
2443
Process: span.Process,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package jaegerencodingextension
5+
6+
import (
7+
"bytes"
8+
"testing"
9+
10+
"github.com/gogo/protobuf/jsonpb"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
"go.opentelemetry.io/collector/pdata/pcommon"
14+
"go.opentelemetry.io/collector/pdata/ptrace"
15+
16+
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger"
17+
)
18+
19+
func TestUnmarshalJaeger(t *testing.T) {
20+
td := ptrace.NewTraces()
21+
span := td.ResourceSpans().AppendEmpty().ScopeSpans().AppendEmpty().Spans().AppendEmpty()
22+
span.SetName("foo")
23+
span.SetStartTimestamp(pcommon.Timestamp(10))
24+
span.SetEndTimestamp(pcommon.Timestamp(20))
25+
span.SetTraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16})
26+
span.SetSpanID([8]byte{1, 2, 3, 4, 5, 6, 7, 8})
27+
batches, err := jaeger.ProtoFromTraces(td)
28+
require.NoError(t, err)
29+
30+
protoBytes, err := batches[0].Spans[0].Marshal()
31+
require.NoError(t, err)
32+
33+
jsonMarshaler := &jsonpb.Marshaler{}
34+
jsonBytes := new(bytes.Buffer)
35+
require.NoError(t, jsonMarshaler.Marshal(jsonBytes, batches[0].Spans[0]))
36+
37+
tests := []struct {
38+
unmarshaler ptrace.Unmarshaler
39+
encoding string
40+
bytes []byte
41+
}{
42+
{
43+
unmarshaler: jaegerProtobufTrace{},
44+
encoding: "jaeger_proto",
45+
bytes: protoBytes,
46+
},
47+
{
48+
unmarshaler: jaegerJSONTrace{},
49+
encoding: "jaeger_json",
50+
bytes: jsonBytes.Bytes(),
51+
},
52+
}
53+
for _, test := range tests {
54+
t.Run(test.encoding, func(t *testing.T) {
55+
got, err := test.unmarshaler.UnmarshalTraces(test.bytes)
56+
require.NoError(t, err)
57+
assert.Equal(t, td, got)
58+
})
59+
}
60+
}

0 commit comments

Comments
 (0)