pkg/translator/jaeger/jaegerthriftcoverter/from_domain.go (116 lines of code) (raw):
// Copyright The OpenTelemetry Authors
// Copyright (c) 2019 The Jaeger Authors.
// Copyright (c) 2017 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0
package jaeger // import "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger/jaegerthriftcoverter"
import (
"fmt"
"github.com/jaegertracing/jaeger-idl/model/v1"
"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
)
// FromDomain takes an array of model.Span and returns
// an array of jaeger.Span. If errors are found during
// conversion of tags, then error tags are appended.
func FromDomain(spans []*model.Span) []*jaeger.Span {
jSpans := make([]*jaeger.Span, len(spans))
dToJ := domainToJaegerTransformer{}
for idx, span := range spans {
jSpans[idx] = dToJ.transformSpan(span)
}
return jSpans
}
// FromDomainSpan takes a single model.Span and
// converts it into a jaeger.Span. If errors are found
// during conversion of tags, then error tags are appended.
func FromDomainSpan(span *model.Span) *jaeger.Span {
dToJ := &domainToJaegerTransformer{}
return dToJ.transformSpan(span)
}
type domainToJaegerTransformer struct{}
func (domainToJaegerTransformer) keyValueToTag(kv *model.KeyValue) *jaeger.Tag {
if kv.VType == model.StringType {
stringValue := kv.VStr
return &jaeger.Tag{
Key: kv.Key,
VType: jaeger.TagType_STRING,
VStr: &stringValue,
}
}
if kv.VType == model.Int64Type {
intValue := kv.Int64()
return &jaeger.Tag{
Key: kv.Key,
VType: jaeger.TagType_LONG,
VLong: &intValue,
}
}
if kv.VType == model.BinaryType {
binaryValue := kv.Binary()
return &jaeger.Tag{
Key: kv.Key,
VType: jaeger.TagType_BINARY,
VBinary: binaryValue,
}
}
if kv.VType == model.BoolType {
boolValue := kv.Bool()
return &jaeger.Tag{
Key: kv.Key,
VType: jaeger.TagType_BOOL,
VBool: &boolValue,
}
}
if kv.VType == model.Float64Type {
floatValue := kv.Float64()
return &jaeger.Tag{
Key: kv.Key,
VType: jaeger.TagType_DOUBLE,
VDouble: &floatValue,
}
}
errString := fmt.Sprintf("No suitable tag type found for: %#v", kv.VType)
errTag := &jaeger.Tag{
Key: "Error",
VType: jaeger.TagType_STRING,
VStr: &errString,
}
return errTag
}
func (d domainToJaegerTransformer) convertKeyValuesToTags(kvs model.KeyValues) []*jaeger.Tag {
jaegerTags := make([]*jaeger.Tag, len(kvs))
for idx, kv := range kvs {
jaegerTags[idx] = d.keyValueToTag(&kv)
}
return jaegerTags
}
func (d domainToJaegerTransformer) convertLogs(logs []model.Log) []*jaeger.Log {
jaegerLogs := make([]*jaeger.Log, len(logs))
for idx, log := range logs {
jaegerLogs[idx] = &jaeger.Log{
Timestamp: int64(model.TimeAsEpochMicroseconds(log.Timestamp)),
Fields: d.convertKeyValuesToTags(log.Fields),
}
}
return jaegerLogs
}
func (domainToJaegerTransformer) convertSpanRefs(refs []model.SpanRef) []*jaeger.SpanRef {
jaegerSpanRefs := make([]*jaeger.SpanRef, len(refs))
for idx, ref := range refs {
jaegerSpanRefs[idx] = &jaeger.SpanRef{
RefType: jaeger.SpanRefType(ref.RefType),
TraceIdLow: int64(ref.TraceID.Low),
TraceIdHigh: int64(ref.TraceID.High),
SpanId: int64(ref.SpanID),
}
}
return jaegerSpanRefs
}
func (d domainToJaegerTransformer) transformSpan(span *model.Span) *jaeger.Span {
tags := d.convertKeyValuesToTags(span.Tags)
logs := d.convertLogs(span.Logs)
refs := d.convertSpanRefs(span.References)
jaegerSpan := &jaeger.Span{
TraceIdLow: int64(span.TraceID.Low),
TraceIdHigh: int64(span.TraceID.High),
SpanId: int64(span.SpanID),
ParentSpanId: int64(span.ParentSpanID()),
OperationName: span.OperationName,
References: refs,
Flags: int32(span.Flags),
StartTime: int64(model.TimeAsEpochMicroseconds(span.StartTime)),
Duration: int64(model.DurationAsMicroseconds(span.Duration)),
Tags: tags,
Logs: logs,
}
return jaegerSpan
}