instruments.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  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. "context"
  6. "sync/atomic"
  7. "go.opentelemetry.io/otel/metric"
  8. "go.opentelemetry.io/otel/metric/embedded"
  9. )
  10. // unwrapper unwraps to return the underlying instrument implementation.
  11. type unwrapper interface {
  12. unwrap() metric.Observable
  13. }
  14. type afCounter struct {
  15. embedded.Float64ObservableCounter
  16. metric.Float64Observable
  17. name string
  18. opts []metric.Float64ObservableCounterOption
  19. delegate atomic.Value // metric.Float64ObservableCounter
  20. }
  21. var (
  22. _ unwrapper = (*afCounter)(nil)
  23. _ metric.Float64ObservableCounter = (*afCounter)(nil)
  24. )
  25. func (i *afCounter) setDelegate(m metric.Meter) {
  26. ctr, err := m.Float64ObservableCounter(i.name, i.opts...)
  27. if err != nil {
  28. GetErrorHandler().Handle(err)
  29. return
  30. }
  31. i.delegate.Store(ctr)
  32. }
  33. func (i *afCounter) unwrap() metric.Observable {
  34. if ctr := i.delegate.Load(); ctr != nil {
  35. return ctr.(metric.Float64ObservableCounter)
  36. }
  37. return nil
  38. }
  39. type afUpDownCounter struct {
  40. embedded.Float64ObservableUpDownCounter
  41. metric.Float64Observable
  42. name string
  43. opts []metric.Float64ObservableUpDownCounterOption
  44. delegate atomic.Value // metric.Float64ObservableUpDownCounter
  45. }
  46. var (
  47. _ unwrapper = (*afUpDownCounter)(nil)
  48. _ metric.Float64ObservableUpDownCounter = (*afUpDownCounter)(nil)
  49. )
  50. func (i *afUpDownCounter) setDelegate(m metric.Meter) {
  51. ctr, err := m.Float64ObservableUpDownCounter(i.name, i.opts...)
  52. if err != nil {
  53. GetErrorHandler().Handle(err)
  54. return
  55. }
  56. i.delegate.Store(ctr)
  57. }
  58. func (i *afUpDownCounter) unwrap() metric.Observable {
  59. if ctr := i.delegate.Load(); ctr != nil {
  60. return ctr.(metric.Float64ObservableUpDownCounter)
  61. }
  62. return nil
  63. }
  64. type afGauge struct {
  65. embedded.Float64ObservableGauge
  66. metric.Float64Observable
  67. name string
  68. opts []metric.Float64ObservableGaugeOption
  69. delegate atomic.Value // metric.Float64ObservableGauge
  70. }
  71. var (
  72. _ unwrapper = (*afGauge)(nil)
  73. _ metric.Float64ObservableGauge = (*afGauge)(nil)
  74. )
  75. func (i *afGauge) setDelegate(m metric.Meter) {
  76. ctr, err := m.Float64ObservableGauge(i.name, i.opts...)
  77. if err != nil {
  78. GetErrorHandler().Handle(err)
  79. return
  80. }
  81. i.delegate.Store(ctr)
  82. }
  83. func (i *afGauge) unwrap() metric.Observable {
  84. if ctr := i.delegate.Load(); ctr != nil {
  85. return ctr.(metric.Float64ObservableGauge)
  86. }
  87. return nil
  88. }
  89. type aiCounter struct {
  90. embedded.Int64ObservableCounter
  91. metric.Int64Observable
  92. name string
  93. opts []metric.Int64ObservableCounterOption
  94. delegate atomic.Value // metric.Int64ObservableCounter
  95. }
  96. var (
  97. _ unwrapper = (*aiCounter)(nil)
  98. _ metric.Int64ObservableCounter = (*aiCounter)(nil)
  99. )
  100. func (i *aiCounter) setDelegate(m metric.Meter) {
  101. ctr, err := m.Int64ObservableCounter(i.name, i.opts...)
  102. if err != nil {
  103. GetErrorHandler().Handle(err)
  104. return
  105. }
  106. i.delegate.Store(ctr)
  107. }
  108. func (i *aiCounter) unwrap() metric.Observable {
  109. if ctr := i.delegate.Load(); ctr != nil {
  110. return ctr.(metric.Int64ObservableCounter)
  111. }
  112. return nil
  113. }
  114. type aiUpDownCounter struct {
  115. embedded.Int64ObservableUpDownCounter
  116. metric.Int64Observable
  117. name string
  118. opts []metric.Int64ObservableUpDownCounterOption
  119. delegate atomic.Value // metric.Int64ObservableUpDownCounter
  120. }
  121. var (
  122. _ unwrapper = (*aiUpDownCounter)(nil)
  123. _ metric.Int64ObservableUpDownCounter = (*aiUpDownCounter)(nil)
  124. )
  125. func (i *aiUpDownCounter) setDelegate(m metric.Meter) {
  126. ctr, err := m.Int64ObservableUpDownCounter(i.name, i.opts...)
  127. if err != nil {
  128. GetErrorHandler().Handle(err)
  129. return
  130. }
  131. i.delegate.Store(ctr)
  132. }
  133. func (i *aiUpDownCounter) unwrap() metric.Observable {
  134. if ctr := i.delegate.Load(); ctr != nil {
  135. return ctr.(metric.Int64ObservableUpDownCounter)
  136. }
  137. return nil
  138. }
  139. type aiGauge struct {
  140. embedded.Int64ObservableGauge
  141. metric.Int64Observable
  142. name string
  143. opts []metric.Int64ObservableGaugeOption
  144. delegate atomic.Value // metric.Int64ObservableGauge
  145. }
  146. var (
  147. _ unwrapper = (*aiGauge)(nil)
  148. _ metric.Int64ObservableGauge = (*aiGauge)(nil)
  149. )
  150. func (i *aiGauge) setDelegate(m metric.Meter) {
  151. ctr, err := m.Int64ObservableGauge(i.name, i.opts...)
  152. if err != nil {
  153. GetErrorHandler().Handle(err)
  154. return
  155. }
  156. i.delegate.Store(ctr)
  157. }
  158. func (i *aiGauge) unwrap() metric.Observable {
  159. if ctr := i.delegate.Load(); ctr != nil {
  160. return ctr.(metric.Int64ObservableGauge)
  161. }
  162. return nil
  163. }
  164. // Sync Instruments.
  165. type sfCounter struct {
  166. embedded.Float64Counter
  167. name string
  168. opts []metric.Float64CounterOption
  169. delegate atomic.Value // metric.Float64Counter
  170. }
  171. var _ metric.Float64Counter = (*sfCounter)(nil)
  172. func (i *sfCounter) setDelegate(m metric.Meter) {
  173. ctr, err := m.Float64Counter(i.name, i.opts...)
  174. if err != nil {
  175. GetErrorHandler().Handle(err)
  176. return
  177. }
  178. i.delegate.Store(ctr)
  179. }
  180. func (i *sfCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
  181. if ctr := i.delegate.Load(); ctr != nil {
  182. ctr.(metric.Float64Counter).Add(ctx, incr, opts...)
  183. }
  184. }
  185. func (i *sfCounter) Enabled(ctx context.Context) bool {
  186. if ctr := i.delegate.Load(); ctr != nil {
  187. return ctr.(metric.Float64Counter).Enabled(ctx)
  188. }
  189. return false
  190. }
  191. type sfUpDownCounter struct {
  192. embedded.Float64UpDownCounter
  193. name string
  194. opts []metric.Float64UpDownCounterOption
  195. delegate atomic.Value // metric.Float64UpDownCounter
  196. }
  197. var _ metric.Float64UpDownCounter = (*sfUpDownCounter)(nil)
  198. func (i *sfUpDownCounter) setDelegate(m metric.Meter) {
  199. ctr, err := m.Float64UpDownCounter(i.name, i.opts...)
  200. if err != nil {
  201. GetErrorHandler().Handle(err)
  202. return
  203. }
  204. i.delegate.Store(ctr)
  205. }
  206. func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, opts ...metric.AddOption) {
  207. if ctr := i.delegate.Load(); ctr != nil {
  208. ctr.(metric.Float64UpDownCounter).Add(ctx, incr, opts...)
  209. }
  210. }
  211. func (i *sfUpDownCounter) Enabled(ctx context.Context) bool {
  212. if ctr := i.delegate.Load(); ctr != nil {
  213. return ctr.(metric.Float64UpDownCounter).Enabled(ctx)
  214. }
  215. return false
  216. }
  217. type sfHistogram struct {
  218. embedded.Float64Histogram
  219. name string
  220. opts []metric.Float64HistogramOption
  221. delegate atomic.Value // metric.Float64Histogram
  222. }
  223. var _ metric.Float64Histogram = (*sfHistogram)(nil)
  224. func (i *sfHistogram) setDelegate(m metric.Meter) {
  225. ctr, err := m.Float64Histogram(i.name, i.opts...)
  226. if err != nil {
  227. GetErrorHandler().Handle(err)
  228. return
  229. }
  230. i.delegate.Store(ctr)
  231. }
  232. func (i *sfHistogram) Record(ctx context.Context, x float64, opts ...metric.RecordOption) {
  233. if ctr := i.delegate.Load(); ctr != nil {
  234. ctr.(metric.Float64Histogram).Record(ctx, x, opts...)
  235. }
  236. }
  237. func (i *sfHistogram) Enabled(ctx context.Context) bool {
  238. if ctr := i.delegate.Load(); ctr != nil {
  239. return ctr.(metric.Float64Histogram).Enabled(ctx)
  240. }
  241. return false
  242. }
  243. type sfGauge struct {
  244. embedded.Float64Gauge
  245. name string
  246. opts []metric.Float64GaugeOption
  247. delegate atomic.Value // metric.Float64Gauge
  248. }
  249. var _ metric.Float64Gauge = (*sfGauge)(nil)
  250. func (i *sfGauge) setDelegate(m metric.Meter) {
  251. ctr, err := m.Float64Gauge(i.name, i.opts...)
  252. if err != nil {
  253. GetErrorHandler().Handle(err)
  254. return
  255. }
  256. i.delegate.Store(ctr)
  257. }
  258. func (i *sfGauge) Record(ctx context.Context, x float64, opts ...metric.RecordOption) {
  259. if ctr := i.delegate.Load(); ctr != nil {
  260. ctr.(metric.Float64Gauge).Record(ctx, x, opts...)
  261. }
  262. }
  263. func (i *sfGauge) Enabled(ctx context.Context) bool {
  264. if ctr := i.delegate.Load(); ctr != nil {
  265. return ctr.(metric.Float64Gauge).Enabled(ctx)
  266. }
  267. return false
  268. }
  269. type siCounter struct {
  270. embedded.Int64Counter
  271. name string
  272. opts []metric.Int64CounterOption
  273. delegate atomic.Value // metric.Int64Counter
  274. }
  275. var _ metric.Int64Counter = (*siCounter)(nil)
  276. func (i *siCounter) setDelegate(m metric.Meter) {
  277. ctr, err := m.Int64Counter(i.name, i.opts...)
  278. if err != nil {
  279. GetErrorHandler().Handle(err)
  280. return
  281. }
  282. i.delegate.Store(ctr)
  283. }
  284. func (i *siCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
  285. if ctr := i.delegate.Load(); ctr != nil {
  286. ctr.(metric.Int64Counter).Add(ctx, x, opts...)
  287. }
  288. }
  289. func (i *siCounter) Enabled(ctx context.Context) bool {
  290. if ctr := i.delegate.Load(); ctr != nil {
  291. return ctr.(metric.Int64Counter).Enabled(ctx)
  292. }
  293. return false
  294. }
  295. type siUpDownCounter struct {
  296. embedded.Int64UpDownCounter
  297. name string
  298. opts []metric.Int64UpDownCounterOption
  299. delegate atomic.Value // metric.Int64UpDownCounter
  300. }
  301. var _ metric.Int64UpDownCounter = (*siUpDownCounter)(nil)
  302. func (i *siUpDownCounter) setDelegate(m metric.Meter) {
  303. ctr, err := m.Int64UpDownCounter(i.name, i.opts...)
  304. if err != nil {
  305. GetErrorHandler().Handle(err)
  306. return
  307. }
  308. i.delegate.Store(ctr)
  309. }
  310. func (i *siUpDownCounter) Add(ctx context.Context, x int64, opts ...metric.AddOption) {
  311. if ctr := i.delegate.Load(); ctr != nil {
  312. ctr.(metric.Int64UpDownCounter).Add(ctx, x, opts...)
  313. }
  314. }
  315. func (i *siUpDownCounter) Enabled(ctx context.Context) bool {
  316. if ctr := i.delegate.Load(); ctr != nil {
  317. return ctr.(metric.Int64UpDownCounter).Enabled(ctx)
  318. }
  319. return false
  320. }
  321. type siHistogram struct {
  322. embedded.Int64Histogram
  323. name string
  324. opts []metric.Int64HistogramOption
  325. delegate atomic.Value // metric.Int64Histogram
  326. }
  327. var _ metric.Int64Histogram = (*siHistogram)(nil)
  328. func (i *siHistogram) setDelegate(m metric.Meter) {
  329. ctr, err := m.Int64Histogram(i.name, i.opts...)
  330. if err != nil {
  331. GetErrorHandler().Handle(err)
  332. return
  333. }
  334. i.delegate.Store(ctr)
  335. }
  336. func (i *siHistogram) Record(ctx context.Context, x int64, opts ...metric.RecordOption) {
  337. if ctr := i.delegate.Load(); ctr != nil {
  338. ctr.(metric.Int64Histogram).Record(ctx, x, opts...)
  339. }
  340. }
  341. func (i *siHistogram) Enabled(ctx context.Context) bool {
  342. if ctr := i.delegate.Load(); ctr != nil {
  343. return ctr.(metric.Int64Histogram).Enabled(ctx)
  344. }
  345. return false
  346. }
  347. type siGauge struct {
  348. embedded.Int64Gauge
  349. name string
  350. opts []metric.Int64GaugeOption
  351. delegate atomic.Value // metric.Int64Gauge
  352. }
  353. var _ metric.Int64Gauge = (*siGauge)(nil)
  354. func (i *siGauge) setDelegate(m metric.Meter) {
  355. ctr, err := m.Int64Gauge(i.name, i.opts...)
  356. if err != nil {
  357. GetErrorHandler().Handle(err)
  358. return
  359. }
  360. i.delegate.Store(ctr)
  361. }
  362. func (i *siGauge) Record(ctx context.Context, x int64, opts ...metric.RecordOption) {
  363. if ctr := i.delegate.Load(); ctr != nil {
  364. ctr.(metric.Int64Gauge).Record(ctx, x, opts...)
  365. }
  366. }
  367. func (i *siGauge) Enabled(ctx context.Context) bool {
  368. if ctr := i.delegate.Load(); ctr != nil {
  369. return ctr.(metric.Int64Gauge).Enabled(ctx)
  370. }
  371. return false
  372. }