state.go 5.6 KB

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