state.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. package global // import "go.opentelemetry.io/otel/internal/global"
  4. import (
  5. "errors"
  6. "sync"
  7. "sync/atomic"
  8. "go.opentelemetry.io/otel/internal/errorhandler"
  9. "go.opentelemetry.io/otel/metric"
  10. "go.opentelemetry.io/otel/propagation"
  11. "go.opentelemetry.io/otel/trace"
  12. )
  13. type (
  14. tracerProviderHolder struct {
  15. tp trace.TracerProvider
  16. }
  17. propagatorsHolder struct {
  18. tm propagation.TextMapPropagator
  19. }
  20. meterProviderHolder struct {
  21. mp metric.MeterProvider
  22. }
  23. )
  24. var (
  25. globalTracer = defaultTracerValue()
  26. globalPropagators = defaultPropagatorsValue()
  27. globalMeterProvider = defaultMeterProvider()
  28. delegateTraceOnce sync.Once
  29. delegateTextMapPropagatorOnce sync.Once
  30. delegateMeterOnce sync.Once
  31. )
  32. // GetErrorHandler returns the global ErrorHandler instance.
  33. //
  34. // The default ErrorHandler instance returned will log all errors to STDERR
  35. // until an override ErrorHandler is set with SetErrorHandler. All
  36. // ErrorHandler returned prior to this will automatically forward errors to
  37. // the set instance instead of logging.
  38. //
  39. // Subsequent calls to SetErrorHandler after the first will not forward errors
  40. // to the new ErrorHandler for prior returned instances.
  41. func GetErrorHandler() ErrorHandler {
  42. return errorhandler.GetErrorHandler()
  43. }
  44. // SetErrorHandler sets the global ErrorHandler to h.
  45. //
  46. // The first time this is called all ErrorHandler previously returned from
  47. // GetErrorHandler will send errors to h instead of the default logging
  48. // ErrorHandler. Subsequent calls will set the global ErrorHandler, but not
  49. // delegate errors to h.
  50. func SetErrorHandler(h ErrorHandler) {
  51. errorhandler.SetErrorHandler(h)
  52. }
  53. // TracerProvider is the internal implementation for global.TracerProvider.
  54. func TracerProvider() trace.TracerProvider {
  55. return globalTracer.Load().(tracerProviderHolder).tp
  56. }
  57. // SetTracerProvider is the internal implementation for global.SetTracerProvider.
  58. func SetTracerProvider(tp trace.TracerProvider) {
  59. current := TracerProvider()
  60. if _, cOk := current.(*tracerProvider); cOk {
  61. if _, tpOk := tp.(*tracerProvider); tpOk && current == tp {
  62. // Do not assign the default delegating TracerProvider to delegate
  63. // to itself.
  64. Error(
  65. errors.New("no delegate configured in tracer provider"),
  66. "Setting tracer provider to its current value. No delegate will be configured",
  67. )
  68. return
  69. }
  70. }
  71. delegateTraceOnce.Do(func() {
  72. if def, ok := current.(*tracerProvider); ok {
  73. def.setDelegate(tp)
  74. }
  75. })
  76. globalTracer.Store(tracerProviderHolder{tp: tp})
  77. }
  78. // TextMapPropagator is the internal implementation for global.TextMapPropagator.
  79. func TextMapPropagator() propagation.TextMapPropagator {
  80. return globalPropagators.Load().(propagatorsHolder).tm
  81. }
  82. // SetTextMapPropagator is the internal implementation for global.SetTextMapPropagator.
  83. func SetTextMapPropagator(p propagation.TextMapPropagator) {
  84. current := TextMapPropagator()
  85. if _, cOk := current.(*textMapPropagator); cOk {
  86. if _, pOk := p.(*textMapPropagator); pOk && current == p {
  87. // Do not assign the default delegating TextMapPropagator to
  88. // delegate to itself.
  89. Error(
  90. errors.New("no delegate configured in text map propagator"),
  91. "Setting text map propagator to its current value. No delegate will be configured",
  92. )
  93. return
  94. }
  95. }
  96. // For the textMapPropagator already returned by TextMapPropagator
  97. // delegate to p.
  98. delegateTextMapPropagatorOnce.Do(func() {
  99. if def, ok := current.(*textMapPropagator); ok {
  100. def.SetDelegate(p)
  101. }
  102. })
  103. // Return p when subsequent calls to TextMapPropagator are made.
  104. globalPropagators.Store(propagatorsHolder{tm: p})
  105. }
  106. // MeterProvider is the internal implementation for global.MeterProvider.
  107. func MeterProvider() metric.MeterProvider {
  108. return globalMeterProvider.Load().(meterProviderHolder).mp
  109. }
  110. // SetMeterProvider is the internal implementation for global.SetMeterProvider.
  111. func SetMeterProvider(mp metric.MeterProvider) {
  112. current := MeterProvider()
  113. if _, cOk := current.(*meterProvider); cOk {
  114. if _, mpOk := mp.(*meterProvider); mpOk && current == mp {
  115. // Do not assign the default delegating MeterProvider to delegate
  116. // to itself.
  117. Error(
  118. errors.New("no delegate configured in meter provider"),
  119. "Setting meter provider to its current value. No delegate will be configured",
  120. )
  121. return
  122. }
  123. }
  124. delegateMeterOnce.Do(func() {
  125. if def, ok := current.(*meterProvider); ok {
  126. def.setDelegate(mp)
  127. }
  128. })
  129. globalMeterProvider.Store(meterProviderHolder{mp: mp})
  130. }
  131. func defaultTracerValue() *atomic.Value {
  132. v := &atomic.Value{}
  133. v.Store(tracerProviderHolder{tp: &tracerProvider{}})
  134. return v
  135. }
  136. func defaultPropagatorsValue() *atomic.Value {
  137. v := &atomic.Value{}
  138. v.Store(propagatorsHolder{tm: newTextMapPropagator()})
  139. return v
  140. }
  141. func defaultMeterProvider() *atomic.Value {
  142. v := &atomic.Value{}
  143. v.Store(meterProviderHolder{mp: &meterProvider{}})
  144. return v
  145. }