83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
package opentracer
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
|
|
|
|
opentracing "github.com/opentracing/opentracing-go"
|
|
"github.com/opentracing/opentracing-go/log"
|
|
)
|
|
|
|
var _ opentracing.Span = (*span)(nil)
|
|
|
|
// span implements opentracing.Span on top of ddtrace.Span.
|
|
type span struct {
|
|
ddtrace.Span
|
|
*opentracer
|
|
}
|
|
|
|
func (s *span) Context() opentracing.SpanContext { return s.Span.Context() }
|
|
func (s *span) Finish() { s.Span.Finish() }
|
|
func (s *span) Tracer() opentracing.Tracer { return s.opentracer }
|
|
func (s *span) LogEvent(event string) { /* deprecated */ }
|
|
func (s *span) LogEventWithPayload(event string, payload interface{}) { /* deprecated */ }
|
|
func (s *span) Log(data opentracing.LogData) { /* deprecated */ }
|
|
|
|
func (s *span) FinishWithOptions(opts opentracing.FinishOptions) {
|
|
for _, lr := range opts.LogRecords {
|
|
if len(lr.Fields) > 0 {
|
|
s.LogFields(lr.Fields...)
|
|
}
|
|
}
|
|
s.Span.Finish(tracer.FinishTime(opts.FinishTime))
|
|
}
|
|
|
|
func (s *span) LogFields(fields ...log.Field) {
|
|
// catch standard opentracing keys and adjust to internal ones as per spec:
|
|
// https://github.com/opentracing/specification/blob/master/semantic_conventions.md#log-fields-table
|
|
for _, f := range fields {
|
|
switch f.Key() {
|
|
case "event":
|
|
if v, ok := f.Value().(string); ok && v == "error" {
|
|
s.SetTag("error", true)
|
|
}
|
|
case "error", "error.object":
|
|
if err, ok := f.Value().(error); ok {
|
|
s.SetTag("error", err)
|
|
}
|
|
case "message":
|
|
s.SetTag(ext.ErrorMsg, fmt.Sprint(f.Value()))
|
|
case "stack":
|
|
s.SetTag(ext.ErrorStack, fmt.Sprint(f.Value()))
|
|
default:
|
|
// not implemented
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *span) LogKV(keyVals ...interface{}) {
|
|
fields, err := log.InterleavedKVToFields(keyVals...)
|
|
if err != nil {
|
|
// TODO(gbbr): create a log package
|
|
return
|
|
}
|
|
s.LogFields(fields...)
|
|
}
|
|
|
|
func (s *span) SetBaggageItem(key, val string) opentracing.Span {
|
|
s.Span.SetBaggageItem(key, val)
|
|
return s
|
|
}
|
|
|
|
func (s *span) SetOperationName(operationName string) opentracing.Span {
|
|
s.Span.SetOperationName(operationName)
|
|
return s
|
|
}
|
|
|
|
func (s *span) SetTag(key string, value interface{}) opentracing.Span {
|
|
s.Span.SetTag(key, value)
|
|
return s
|
|
}
|