globaltracer.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 internal // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal"
  6. import (
  7. "sync/atomic"
  8. "gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
  9. )
  10. var (
  11. // globalTracer stores the current tracer as *ddtrace.Tracer (pointer to interface). The
  12. // atomic.Value type requires types to be consistent, which requires using *ddtrace.Tracer.
  13. globalTracer atomic.Value
  14. )
  15. func init() {
  16. var tracer ddtrace.Tracer = &NoopTracer{}
  17. globalTracer.Store(&tracer)
  18. }
  19. // SetGlobalTracer sets the global tracer to t.
  20. func SetGlobalTracer(t ddtrace.Tracer) {
  21. old := *globalTracer.Swap(&t).(*ddtrace.Tracer)
  22. if !Testing {
  23. old.Stop()
  24. }
  25. }
  26. // GetGlobalTracer returns the currently active tracer.
  27. func GetGlobalTracer() ddtrace.Tracer {
  28. return *globalTracer.Load().(*ddtrace.Tracer)
  29. }
  30. // Testing is set to true when the mock tracer is active. It usually signifies that we are in a test
  31. // environment. This value is used by tracer.Start to prevent overriding the GlobalTracer in tests.
  32. var Testing = false
  33. var _ ddtrace.Tracer = (*NoopTracer)(nil)
  34. // NoopTracer is an implementation of ddtrace.Tracer that is a no-op.
  35. type NoopTracer struct{}
  36. // StartSpan implements ddtrace.Tracer.
  37. func (NoopTracer) StartSpan(operationName string, opts ...ddtrace.StartSpanOption) ddtrace.Span {
  38. return NoopSpan{}
  39. }
  40. // SetServiceInfo implements ddtrace.Tracer.
  41. func (NoopTracer) SetServiceInfo(name, app, appType string) {}
  42. // Extract implements ddtrace.Tracer.
  43. func (NoopTracer) Extract(carrier interface{}) (ddtrace.SpanContext, error) {
  44. return NoopSpanContext{}, nil
  45. }
  46. // Inject implements ddtrace.Tracer.
  47. func (NoopTracer) Inject(context ddtrace.SpanContext, carrier interface{}) error { return nil }
  48. // Stop implements ddtrace.Tracer.
  49. func (NoopTracer) Stop() {}
  50. var _ ddtrace.Span = (*NoopSpan)(nil)
  51. // NoopSpan is an implementation of ddtrace.Span that is a no-op.
  52. type NoopSpan struct{}
  53. // SetTag implements ddtrace.Span.
  54. func (NoopSpan) SetTag(key string, value interface{}) {}
  55. // SetOperationName implements ddtrace.Span.
  56. func (NoopSpan) SetOperationName(operationName string) {}
  57. // BaggageItem implements ddtrace.Span.
  58. func (NoopSpan) BaggageItem(key string) string { return "" }
  59. // SetBaggageItem implements ddtrace.Span.
  60. func (NoopSpan) SetBaggageItem(key, val string) {}
  61. // Finish implements ddtrace.Span.
  62. func (NoopSpan) Finish(opts ...ddtrace.FinishOption) {}
  63. // Tracer implements ddtrace.Span.
  64. func (NoopSpan) Tracer() ddtrace.Tracer { return NoopTracer{} }
  65. // Context implements ddtrace.Span.
  66. func (NoopSpan) Context() ddtrace.SpanContext { return NoopSpanContext{} }
  67. var _ ddtrace.SpanContext = (*NoopSpanContext)(nil)
  68. // NoopSpanContext is an implementation of ddtrace.SpanContext that is a no-op.
  69. type NoopSpanContext struct{}
  70. // SpanID implements ddtrace.SpanContext.
  71. func (NoopSpanContext) SpanID() uint64 { return 0 }
  72. // TraceID implements ddtrace.SpanContext.
  73. func (NoopSpanContext) TraceID() uint64 { return 0 }
  74. // ForeachBaggageItem implements ddtrace.SpanContext.
  75. func (NoopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {}