Source File
meter.go
Belonging Package
go.opentelemetry.io/otel/api/global/internal
package internal
import (
)
meters map[meterKey]*meterEntry
}
type meterImpl struct {
delegate unsafe.Pointer // (*metric.MeterImpl)
lock sync.Mutex
syncInsts []*syncImpl
asyncInsts []*asyncImpl
}
type meterEntry struct {
unique metric.MeterImpl
impl meterImpl
}
type instrument struct {
descriptor metric.Descriptor
}
type syncImpl struct {
delegate unsafe.Pointer // (*metric.SyncImpl)
instrument
}
type asyncImpl struct {
delegate unsafe.Pointer // (*metric.AsyncImpl)
instrument
runner metric.AsyncRunner
}
type SyncImpler interface {
SyncImpl() metric.SyncImpl
}
type AsyncImpler interface {
AsyncImpl() metric.AsyncImpl
}
type syncHandle struct {
delegate unsafe.Pointer // (*metric.HandleImpl)
inst *syncImpl
labels []label.KeyValue
initialize sync.Once
}
var _ metric.Provider = &meterProvider{}
var _ metric.MeterImpl = &meterImpl{}
var _ metric.InstrumentImpl = &syncImpl{}
var _ metric.BoundSyncImpl = &syncHandle{}
var _ metric.AsyncImpl = &asyncImpl{}
func ( *instrument) () metric.Descriptor {
return .descriptor
}
func () *meterProvider {
return &meterProvider{
meters: map[meterKey]*meterEntry{},
}
}
func ( *meterProvider) ( metric.Provider) {
.lock.Lock()
defer .lock.Unlock()
.delegate =
for , := range .meters {
.impl.setDelegate(.Name, .Version, )
}
.meters = nil
}
func ( *meterProvider) ( string, ...metric.MeterOption) metric.Meter {
.lock.Lock()
defer .lock.Unlock()
if .delegate != nil {
return .delegate.Meter(, ...)
}
:= meterKey{
Name: ,
Version: metric.ConfigureMeter().InstrumentationVersion,
}
, := .meters[]
if ! {
= &meterEntry{}
.unique = registry.NewUniqueInstrumentMeterImpl(&.impl)
.meters[] =
}
return metric.WrapMeterImpl(.unique, .Name, metric.WithInstrumentationVersion(.Version))
}
func ( *meterImpl) (, string, metric.Provider) {
.lock.Lock()
defer .lock.Unlock()
:= new(metric.MeterImpl)
* = .Meter(, metric.WithInstrumentationVersion()).MeterImpl()
.delegate = unsafe.Pointer()
for , := range .syncInsts {
.setDelegate(*)
}
.syncInsts = nil
for , := range .asyncInsts {
.setDelegate(*)
}
.asyncInsts = nil
}
func ( *meterImpl) ( metric.Descriptor) (metric.SyncImpl, error) {
.lock.Lock()
defer .lock.Unlock()
if := (*metric.MeterImpl)(atomic.LoadPointer(&.delegate)); != nil {
return (*).NewSyncInstrument()
}
:= &syncImpl{
instrument: instrument{
descriptor: ,
},
}
.syncInsts = append(.syncInsts, )
return , nil
}
func ( *syncImpl) ( metric.MeterImpl) {
:= new(metric.SyncImpl)
var error
*, = .NewSyncInstrument(.descriptor)
panic()
}
atomic.StorePointer(&.delegate, unsafe.Pointer())
}
func ( *syncImpl) () interface{} {
if := (*metric.SyncImpl)(atomic.LoadPointer(&.delegate)); != nil {
return (*).Implementation()
}
return
}
func ( *syncImpl) ( []label.KeyValue) metric.BoundSyncImpl {
if := (*metric.SyncImpl)(atomic.LoadPointer(&.delegate)); != nil {
return (*).Bind()
}
return &syncHandle{
inst: ,
labels: ,
}
}
func ( *syncHandle) () {
.initialize.Do(func() {})
:= (*metric.BoundSyncImpl)(atomic.LoadPointer(&.delegate))
if == nil {
return
}
(*).Unbind()
}
func ( *meterImpl) (
metric.Descriptor,
metric.AsyncRunner,
) (metric.AsyncImpl, error) {
.lock.Lock()
defer .lock.Unlock()
if := (*metric.MeterImpl)(atomic.LoadPointer(&.delegate)); != nil {
return (*).NewAsyncInstrument(, )
}
:= &asyncImpl{
instrument: instrument{
descriptor: ,
},
runner: ,
}
.asyncInsts = append(.asyncInsts, )
return , nil
}
func ( *asyncImpl) () interface{} {
if := (*metric.AsyncImpl)(atomic.LoadPointer(&.delegate)); != nil {
return (*).Implementation()
}
return
}
func ( *asyncImpl) ( metric.MeterImpl) {
:= new(metric.AsyncImpl)
var error
*, = .NewAsyncInstrument(.descriptor, .runner)
func ( *meterImpl) ( context.Context, []label.KeyValue, ...metric.Measurement) {
if := (*metric.MeterImpl)(atomic.LoadPointer(&.delegate)); != nil {
(*).RecordBatch(, , ...)
}
}
func ( *syncImpl) ( context.Context, metric.Number, []label.KeyValue) {
if := (*metric.SyncImpl)(atomic.LoadPointer(&.delegate)); != nil {
(*).RecordOne(, , )
}
}
func ( *syncHandle) ( context.Context, metric.Number) {
:= (*metric.SyncImpl)(atomic.LoadPointer(&.inst.delegate))
if == nil {
return
}
var *metric.BoundSyncImpl
.initialize.Do(func() {
= new(metric.BoundSyncImpl)
* = (*).Bind(.labels)
atomic.StorePointer(&.delegate, unsafe.Pointer())
})
if == nil {
= (*metric.BoundSyncImpl)(atomic.LoadPointer(&.delegate))
if == nil {
return
}
(*).RecordOne(, )
}
func () map[string]uintptr {
return map[string]uintptr{
"meterProvider.delegate": unsafe.Offsetof(meterProvider{}.delegate),
"meterImpl.delegate": unsafe.Offsetof(meterImpl{}.delegate),
"syncImpl.delegate": unsafe.Offsetof(syncImpl{}.delegate),
"asyncImpl.delegate": unsafe.Offsetof(asyncImpl{}.delegate),
"syncHandle.delegate": unsafe.Offsetof(syncHandle{}.delegate),
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |