span.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Unless explicitly stated otherwise all files in this repository are licensed
  2. // under the Apache License Version 2.0.
  3. // This product includes software developed at Datadog (https://www.datadoghq.com/).
  4. // Copyright 2016 Datadog, Inc.
  5. package opentracer
  6. import (
  7. "fmt"
  8. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
  9. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
  10. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
  11. opentracing "github.com/opentracing/opentracing-go"
  12. "github.com/opentracing/opentracing-go/log"
  13. )
  14. var _ opentracing.Span = (*span)(nil)
  15. // span implements opentracing.Span on top of ddtrace.Span.
  16. type span struct {
  17. ddtrace.Span
  18. *opentracer
  19. }
  20. func (s *span) Context() opentracing.SpanContext { return s.Span.Context() }
  21. func (s *span) Finish() { s.Span.Finish() }
  22. func (s *span) Tracer() opentracing.Tracer { return s.opentracer }
  23. func (s *span) LogEvent(event string) { /* deprecated */ }
  24. func (s *span) LogEventWithPayload(event string, payload interface{}) { /* deprecated */ }
  25. func (s *span) Log(data opentracing.LogData) { /* deprecated */ }
  26. func (s *span) FinishWithOptions(opts opentracing.FinishOptions) {
  27. for _, lr := range opts.LogRecords {
  28. if len(lr.Fields) > 0 {
  29. s.LogFields(lr.Fields...)
  30. }
  31. }
  32. s.Span.Finish(tracer.FinishTime(opts.FinishTime))
  33. }
  34. func (s *span) LogFields(fields ...log.Field) {
  35. // catch standard opentracing keys and adjust to internal ones as per spec:
  36. // https://github.com/opentracing/specification/blob/master/semantic_conventions.md#log-fields-table
  37. for _, f := range fields {
  38. switch f.Key() {
  39. case "event":
  40. if v, ok := f.Value().(string); ok && v == "error" {
  41. s.SetTag("error", true)
  42. }
  43. case "error", "error.object":
  44. if err, ok := f.Value().(error); ok {
  45. s.SetTag("error", err)
  46. }
  47. case "message":
  48. s.SetTag(ext.ErrorMsg, fmt.Sprint(f.Value()))
  49. case "stack":
  50. s.SetTag(ext.ErrorStack, fmt.Sprint(f.Value()))
  51. default:
  52. // not implemented
  53. }
  54. }
  55. }
  56. func (s *span) LogKV(keyVals ...interface{}) {
  57. fields, err := log.InterleavedKVToFields(keyVals...)
  58. if err != nil {
  59. return
  60. }
  61. s.LogFields(fields...)
  62. }
  63. func (s *span) SetBaggageItem(key, val string) opentracing.Span {
  64. s.Span.SetBaggageItem(key, val)
  65. return s
  66. }
  67. func (s *span) SetOperationName(operationName string) opentracing.Span {
  68. s.Span.SetOperationName(operationName)
  69. return s
  70. }
  71. func (s *span) SetTag(key string, value interface{}) opentracing.Span {
  72. s.Span.SetTag(key, value)
  73. return s
  74. }