Skip to content

Commit 8fa6afe

Browse files
owaistigrannajaryan
authored andcommitted
Translate OC resource labels to Jaeger process tags (#325)
Preserve OC resource labels during translation to Jaeger by adding them to the process tags Right now we translate OC node to Jaeger process while completely ignoring OC resource labels resulting in loss of this data. This PR patches the OC > Jaeger translators by making sure the resource labels are recorded as Jaegerprocess tags. While this preserves process labels and prevents loss of such data when translating to Jaeger, it's not a perfect solution because: 1. It will replace any tags from OC Node with the same names. Current behaviour is to give precedence to resource labels over node attributes. We can make it configurable or revisit the decision later. 2. Translation is not reversible Translating back from Jaeger to OC will still not re-create the OC process object. It'll instead translate all the Jaeger process tags to OC node attributes. We could add some semantic convention to denote resource labels differently or add an additional tag to specify the resource tag names but doing so would add additional complexity to backends processing traces in the Jaeger format. Also, in practice, it's going to be very rare for people to translate from OC to Jaeger and then back from Jaeger to OC in the same data pipeline. While this doesn't solve the cases perfectly, we think it's better than completely dropping the resource data.
1 parent df62b61 commit 8fa6afe

File tree

7 files changed

+71
-4
lines changed

7 files changed

+71
-4
lines changed

translator/trace/jaeger/constants.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const (
3131
opencensusLanguage = "opencensus.language"
3232
opencensusExporterVersion = "opencensus.exporterversion"
3333
opencensusCoreLibVersion = "opencensus.corelibversion"
34+
opencensusResourceType = "opencensus.resourcetype"
3435
)
3536

3637
var (

translator/trace/jaeger/protospan_to_jaegerproto.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"time"
2020

2121
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
22+
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
2223
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
2324
"github.com/golang/protobuf/ptypes"
2425
"github.com/golang/protobuf/ptypes/timestamp"
@@ -41,15 +42,15 @@ func OCProtoToJaegerProto(td consumerdata.TraceData) (*jaeger.Batch, error) {
4142
}
4243

4344
jb := &jaeger.Batch{
44-
Process: ocNodeToJaegerProcessProto(td.Node),
45+
Process: ocNodeAndResourceToJaegerProcessProto(td.Node, td.Resource),
4546
Spans: jSpans,
4647
}
4748

4849
return jb, nil
4950
}
5051

5152
// Replica of protospan_to_jaegerthrift.ocNodeToJaegerProcess
52-
func ocNodeToJaegerProcessProto(node *commonpb.Node) *jaeger.Process {
53+
func ocNodeAndResourceToJaegerProcessProto(node *commonpb.Node, resource *resourcepb.Resource) *jaeger.Process {
5354
if node == nil {
5455
return unknownProcessProto
5556
}
@@ -134,6 +135,24 @@ func ocNodeToJaegerProcessProto(node *commonpb.Node) *jaeger.Process {
134135
serviceName = node.ServiceInfo.Name
135136
}
136137

138+
if resource != nil {
139+
resourceType := resource.GetType()
140+
if resourceType != "" {
141+
jTags = append(jTags, jaeger.KeyValue{
142+
Key: opencensusResourceType,
143+
VType: jaeger.ValueType_STRING,
144+
VStr: resourceType,
145+
})
146+
}
147+
for k, v := range resource.GetLabels() {
148+
jTags = append(jTags, jaeger.KeyValue{
149+
Key: k,
150+
VType: jaeger.ValueType_STRING,
151+
VStr: v,
152+
})
153+
}
154+
}
155+
137156
if serviceName == "" && len(jTags) == 0 {
138157
// No info to put in the process...
139158
return nil

translator/trace/jaeger/protospan_to_jaegerproto_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"testing"
2222

2323
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
24+
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
2425
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
2526
"github.com/golang/protobuf/ptypes/timestamp"
2627
"github.com/google/go-cmp/cmp"
@@ -351,6 +352,10 @@ var ocBatches = []consumerdata.TraceData{
351352
"ip": "10.53.69.61",
352353
},
353354
},
355+
Resource: &resourcepb.Resource{
356+
Type: "k8s.io/container",
357+
Labels: map[string]string{"resource_key1": "resource_val1"},
358+
},
354359
Spans: []*tracepb.Span{
355360
{
356361
TraceId: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x96, 0x9A, 0x89, 0x55, 0x57, 0x1A, 0x3F},

translator/trace/jaeger/protospan_to_jaegerthrift.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"fmt"
1919

2020
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
21+
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
2122
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
2223
"github.com/golang/protobuf/ptypes"
2324
"github.com/golang/protobuf/ptypes/timestamp"
@@ -39,14 +40,14 @@ func OCProtoToJaegerThrift(td consumerdata.TraceData) (*jaeger.Batch, error) {
3940
}
4041

4142
jb := &jaeger.Batch{
42-
Process: ocNodeToJaegerProcess(td.Node),
43+
Process: ocNodeAndResourceToJaegerProcess(td.Node, td.Resource),
4344
Spans: jSpans,
4445
}
4546

4647
return jb, nil
4748
}
4849

49-
func ocNodeToJaegerProcess(node *commonpb.Node) *jaeger.Process {
50+
func ocNodeAndResourceToJaegerProcess(node *commonpb.Node, resource *resourcepb.Resource) *jaeger.Process {
5051
if node == nil {
5152
// Jaeger requires a non-nil Process
5253
return unknownProcess
@@ -132,6 +133,24 @@ func ocNodeToJaegerProcess(node *commonpb.Node) *jaeger.Process {
132133
serviceName = node.ServiceInfo.Name
133134
}
134135

136+
if resource != nil {
137+
resourceType := resource.GetType()
138+
if resourceType != "" {
139+
jTags = append(jTags, &jaeger.Tag{
140+
Key: opencensusResourceType,
141+
VType: jaeger.TagType_STRING,
142+
VStr: &resourceType,
143+
})
144+
}
145+
for k, v := range resource.GetLabels() {
146+
jTags = append(jTags, &jaeger.Tag{
147+
Key: k,
148+
VType: jaeger.TagType_STRING,
149+
VStr: &v,
150+
})
151+
}
152+
}
153+
135154
if serviceName == "" && len(jTags) == 0 {
136155
// No info to put in the process...
137156
return nil

translator/trace/jaeger/protospan_to_jaegerthrift_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"testing"
2323

2424
commonpb "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
25+
resourcepb "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
2526
tracepb "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
2627
"github.com/golang/protobuf/ptypes/timestamp"
2728
"github.com/google/go-cmp/cmp"
@@ -405,6 +406,10 @@ var tds = []consumerdata.TraceData{
405406
"ip": "10.53.69.61",
406407
},
407408
},
409+
Resource: &resourcepb.Resource{
410+
Type: "k8s.io/container",
411+
Labels: map[string]string{"resource_key1": "resource_val1"},
412+
},
408413
Spans: []*tracepb.Span{
409414
{
410415
TraceId: []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x96, 0x9A, 0x89, 0x55, 0x57, 0x1A, 0x3F},

translator/trace/jaeger/testdata/proto_batch_no_binary_tags_01.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@
3838
{
3939
"key": "a.binary",
4040
"v_str": "AQIDBAMCAQ=="
41+
},
42+
{
43+
"key": "resource_key1",
44+
"v_str": "resource_val1"
45+
},
46+
{
47+
"key": "opencensus.resourcetype",
48+
"v_str": "k8s.io/container"
4149
}
4250
]
4351
},

translator/trace/jaeger/testdata/thrift_batch_no_binary_tags_01.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@
4646
"key": "a.binary",
4747
"vType": "STRING",
4848
"vStr": "AQIDBAMCAQ=="
49+
},
50+
{
51+
"key": "resource_key1",
52+
"vType": "STRING",
53+
"vStr": "resource_val1"
54+
},
55+
{
56+
"key": "opencensus.resourcetype",
57+
"vType": "STRING",
58+
"vStr": "k8s.io/container"
4959
}
5060
]
5161
},

0 commit comments

Comments
 (0)