summaryrefslogtreecommitdiff
path: root/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/go.opentelemetry.io/otel/sdk/metric/meter.go')
-rw-r--r--vendor/go.opentelemetry.io/otel/sdk/metric/meter.go736
1 files changed, 0 insertions, 736 deletions
diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go b/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
deleted file mode 100644
index a6ccd117b..000000000
--- a/vendor/go.opentelemetry.io/otel/sdk/metric/meter.go
+++ /dev/null
@@ -1,736 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package metric // import "go.opentelemetry.io/otel/sdk/metric"
-
-import (
- "context"
- "errors"
- "fmt"
-
- "go.opentelemetry.io/otel/internal/global"
- "go.opentelemetry.io/otel/metric"
- "go.opentelemetry.io/otel/metric/embedded"
- "go.opentelemetry.io/otel/sdk/instrumentation"
-
- "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
-)
-
-// ErrInstrumentName indicates the created instrument has an invalid name.
-// Valid names must consist of 255 or fewer characters including alphanumeric, _, ., -, / and start with a letter.
-var ErrInstrumentName = errors.New("invalid instrument name")
-
-// meter handles the creation and coordination of all metric instruments. A
-// meter represents a single instrumentation scope; all metric telemetry
-// produced by an instrumentation scope will use metric instruments from a
-// single meter.
-type meter struct {
- embedded.Meter
-
- scope instrumentation.Scope
- pipes pipelines
-
- int64Insts *cacheWithErr[instID, *int64Inst]
- float64Insts *cacheWithErr[instID, *float64Inst]
- int64ObservableInsts *cacheWithErr[instID, int64Observable]
- float64ObservableInsts *cacheWithErr[instID, float64Observable]
-
- int64Resolver resolver[int64]
- float64Resolver resolver[float64]
-}
-
-func newMeter(s instrumentation.Scope, p pipelines) *meter {
- // viewCache ensures instrument conflicts, including number conflicts, this
- // meter is asked to create are logged to the user.
- var viewCache cache[string, instID]
-
- var int64Insts cacheWithErr[instID, *int64Inst]
- var float64Insts cacheWithErr[instID, *float64Inst]
- var int64ObservableInsts cacheWithErr[instID, int64Observable]
- var float64ObservableInsts cacheWithErr[instID, float64Observable]
-
- return &meter{
- scope: s,
- pipes: p,
- int64Insts: &int64Insts,
- float64Insts: &float64Insts,
- int64ObservableInsts: &int64ObservableInsts,
- float64ObservableInsts: &float64ObservableInsts,
- int64Resolver: newResolver[int64](p, &viewCache),
- float64Resolver: newResolver[float64](p, &viewCache),
- }
-}
-
-// Compile-time check meter implements metric.Meter.
-var _ metric.Meter = (*meter)(nil)
-
-// Int64Counter returns a new instrument identified by name and configured with
-// options. The instrument is used to synchronously record increasing int64
-// measurements during a computational operation.
-func (m *meter) Int64Counter(name string, options ...metric.Int64CounterOption) (metric.Int64Counter, error) {
- cfg := metric.NewInt64CounterConfig(options...)
- const kind = InstrumentKindCounter
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64UpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to synchronously record
-// int64 measurements during a computational operation.
-func (m *meter) Int64UpDownCounter(name string, options ...metric.Int64UpDownCounterOption) (metric.Int64UpDownCounter, error) {
- cfg := metric.NewInt64UpDownCounterConfig(options...)
- const kind = InstrumentKindUpDownCounter
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64Histogram returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of int64 measurements during a computational operation.
-func (m *meter) Int64Histogram(name string, options ...metric.Int64HistogramOption) (metric.Int64Histogram, error) {
- cfg := metric.NewInt64HistogramConfig(options...)
- p := int64InstProvider{m}
- i, err := p.lookupHistogram(name, cfg)
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Int64Gauge returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of int64 measurements during a computational operation.
-func (m *meter) Int64Gauge(name string, options ...metric.Int64GaugeOption) (metric.Int64Gauge, error) {
- cfg := metric.NewInt64GaugeConfig(options...)
- const kind = InstrumentKindGauge
- p := int64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// int64ObservableInstrument returns a new observable identified by the Instrument.
-// It registers callbacks for each reader's pipeline.
-func (m *meter) int64ObservableInstrument(id Instrument, callbacks []metric.Int64Callback) (int64Observable, error) {
- key := instID{
- Name: id.Name,
- Description: id.Description,
- Unit: id.Unit,
- Kind: id.Kind,
- }
- if m.int64ObservableInsts.HasKey(key) && len(callbacks) > 0 {
- warnRepeatedObservableCallbacks(id)
- }
- return m.int64ObservableInsts.Lookup(key, func() (int64Observable, error) {
- inst := newInt64Observable(m, id.Kind, id.Name, id.Description, id.Unit)
- for _, insert := range m.int64Resolver.inserters {
- // Connect the measure functions for instruments in this pipeline with the
- // callbacks for this pipeline.
- in, err := insert.Instrument(id, insert.readerDefaultAggregation(id.Kind))
- if err != nil {
- return inst, err
- }
- // Drop aggregation
- if len(in) == 0 {
- inst.dropAggregation = true
- continue
- }
- inst.appendMeasures(in)
-
- // Add the measures to the pipeline. It is required to maintain
- // measures per pipeline to avoid calling the measure that
- // is not part of the pipeline.
- insert.pipeline.addInt64Measure(inst.observableID, in)
- for _, cback := range callbacks {
- inst := int64Observer{measures: in}
- fn := cback
- insert.addCallback(func(ctx context.Context) error { return fn(ctx, inst) })
- }
- }
- return inst, validateInstrumentName(id.Name)
- })
-}
-
-// Int64ObservableCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// increasing int64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableCounter(name string, options ...metric.Int64ObservableCounterOption) (metric.Int64ObservableCounter, error) {
- cfg := metric.NewInt64ObservableCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableCounter,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Int64ObservableUpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// int64 measurements once per a measurement collection cycle. Only the
-// measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableUpDownCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableUpDownCounter(name string, options ...metric.Int64ObservableUpDownCounterOption) (metric.Int64ObservableUpDownCounter, error) {
- cfg := metric.NewInt64ObservableUpDownCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableUpDownCounter,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Int64ObservableGauge returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// instantaneous int64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Int64ObservableGauge is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Int64ObservableGauge(name string, options ...metric.Int64ObservableGaugeOption) (metric.Int64ObservableGauge, error) {
- cfg := metric.NewInt64ObservableGaugeConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableGauge,
- Scope: m.scope,
- }
- return m.int64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64Counter returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record increasing
-// float64 measurements during a computational operation.
-func (m *meter) Float64Counter(name string, options ...metric.Float64CounterOption) (metric.Float64Counter, error) {
- cfg := metric.NewFloat64CounterConfig(options...)
- const kind = InstrumentKindCounter
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64UpDownCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to synchronously record
-// float64 measurements during a computational operation.
-func (m *meter) Float64UpDownCounter(name string, options ...metric.Float64UpDownCounterOption) (metric.Float64UpDownCounter, error) {
- cfg := metric.NewFloat64UpDownCounterConfig(options...)
- const kind = InstrumentKindUpDownCounter
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64Histogram returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of float64 measurements during a computational operation.
-func (m *meter) Float64Histogram(name string, options ...metric.Float64HistogramOption) (metric.Float64Histogram, error) {
- cfg := metric.NewFloat64HistogramConfig(options...)
- p := float64InstProvider{m}
- i, err := p.lookupHistogram(name, cfg)
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// Float64Gauge returns a new instrument identified by name and configured
-// with options. The instrument is used to synchronously record the
-// distribution of float64 measurements during a computational operation.
-func (m *meter) Float64Gauge(name string, options ...metric.Float64GaugeOption) (metric.Float64Gauge, error) {
- cfg := metric.NewFloat64GaugeConfig(options...)
- const kind = InstrumentKindGauge
- p := float64InstProvider{m}
- i, err := p.lookup(kind, name, cfg.Description(), cfg.Unit())
- if err != nil {
- return i, err
- }
-
- return i, validateInstrumentName(name)
-}
-
-// float64ObservableInstrument returns a new observable identified by the Instrument.
-// It registers callbacks for each reader's pipeline.
-func (m *meter) float64ObservableInstrument(id Instrument, callbacks []metric.Float64Callback) (float64Observable, error) {
- key := instID{
- Name: id.Name,
- Description: id.Description,
- Unit: id.Unit,
- Kind: id.Kind,
- }
- if m.int64ObservableInsts.HasKey(key) && len(callbacks) > 0 {
- warnRepeatedObservableCallbacks(id)
- }
- return m.float64ObservableInsts.Lookup(key, func() (float64Observable, error) {
- inst := newFloat64Observable(m, id.Kind, id.Name, id.Description, id.Unit)
- for _, insert := range m.float64Resolver.inserters {
- // Connect the measure functions for instruments in this pipeline with the
- // callbacks for this pipeline.
- in, err := insert.Instrument(id, insert.readerDefaultAggregation(id.Kind))
- if err != nil {
- return inst, err
- }
- // Drop aggregation
- if len(in) == 0 {
- inst.dropAggregation = true
- continue
- }
- inst.appendMeasures(in)
-
- // Add the measures to the pipeline. It is required to maintain
- // measures per pipeline to avoid calling the measure that
- // is not part of the pipeline.
- insert.pipeline.addFloat64Measure(inst.observableID, in)
- for _, cback := range callbacks {
- inst := float64Observer{measures: in}
- fn := cback
- insert.addCallback(func(ctx context.Context) error { return fn(ctx, inst) })
- }
- }
- return inst, validateInstrumentName(id.Name)
- })
-}
-
-// Float64ObservableCounter returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// increasing float64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableCounter(name string, options ...metric.Float64ObservableCounterOption) (metric.Float64ObservableCounter, error) {
- cfg := metric.NewFloat64ObservableCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableCounter,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64ObservableUpDownCounter returns a new instrument identified by name
-// and configured with options. The instrument is used to asynchronously record
-// float64 measurements once per a measurement collection cycle. Only the
-// measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableUpDownCounter is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableUpDownCounter(name string, options ...metric.Float64ObservableUpDownCounterOption) (metric.Float64ObservableUpDownCounter, error) {
- cfg := metric.NewFloat64ObservableUpDownCounterConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableUpDownCounter,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-// Float64ObservableGauge returns a new instrument identified by name and
-// configured with options. The instrument is used to asynchronously record
-// instantaneous float64 measurements once per a measurement collection cycle.
-// Only the measurements recorded during the collection cycle are exported.
-//
-// If Float64ObservableGauge is invoked repeatedly with the same Name,
-// Description, and Unit, only the first set of callbacks provided are used.
-// Use meter.RegisterCallback and Registration.Unregister to manage callbacks
-// if instrumentation can be created multiple times with different callbacks.
-func (m *meter) Float64ObservableGauge(name string, options ...metric.Float64ObservableGaugeOption) (metric.Float64ObservableGauge, error) {
- cfg := metric.NewFloat64ObservableGaugeConfig(options...)
- id := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindObservableGauge,
- Scope: m.scope,
- }
- return m.float64ObservableInstrument(id, cfg.Callbacks())
-}
-
-func validateInstrumentName(name string) error {
- if len(name) == 0 {
- return fmt.Errorf("%w: %s: is empty", ErrInstrumentName, name)
- }
- if len(name) > 255 {
- return fmt.Errorf("%w: %s: longer than 255 characters", ErrInstrumentName, name)
- }
- if !isAlpha([]rune(name)[0]) {
- return fmt.Errorf("%w: %s: must start with a letter", ErrInstrumentName, name)
- }
- if len(name) == 1 {
- return nil
- }
- for _, c := range name[1:] {
- if !isAlphanumeric(c) && c != '_' && c != '.' && c != '-' && c != '/' {
- return fmt.Errorf("%w: %s: must only contain [A-Za-z0-9_.-/]", ErrInstrumentName, name)
- }
- }
- return nil
-}
-
-func isAlpha(c rune) bool {
- return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
-}
-
-func isAlphanumeric(c rune) bool {
- return isAlpha(c) || ('0' <= c && c <= '9')
-}
-
-func warnRepeatedObservableCallbacks(id Instrument) {
- inst := fmt.Sprintf(
- "Instrument{Name: %q, Description: %q, Kind: %q, Unit: %q}",
- id.Name, id.Description, "InstrumentKind"+id.Kind.String(), id.Unit,
- )
- global.Warn("Repeated observable instrument creation with callbacks. Ignoring new callbacks. Use meter.RegisterCallback and Registration.Unregister to manage callbacks.",
- "instrument", inst,
- )
-}
-
-// RegisterCallback registers f to be called each collection cycle so it will
-// make observations for insts during those cycles.
-//
-// The only instruments f can make observations for are insts. All other
-// observations will be dropped and an error will be logged.
-//
-// Only instruments from this meter can be registered with f, an error is
-// returned if other instrument are provided.
-//
-// Only observations made in the callback will be exported. Unlike synchronous
-// instruments, asynchronous callbacks can "forget" attribute sets that are no
-// longer relevant by omitting the observation during the callback.
-//
-// The returned Registration can be used to unregister f.
-func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable) (metric.Registration, error) {
- if len(insts) == 0 {
- // Don't allocate a observer if not needed.
- return noopRegister{}, nil
- }
-
- var err error
- validInstruments := make([]metric.Observable, 0, len(insts))
- for _, inst := range insts {
- switch o := inst.(type) {
- case int64Observable:
- if e := o.registerable(m); e != nil {
- if !errors.Is(e, errEmptyAgg) {
- err = errors.Join(err, e)
- }
- continue
- }
-
- validInstruments = append(validInstruments, inst)
- case float64Observable:
- if e := o.registerable(m); e != nil {
- if !errors.Is(e, errEmptyAgg) {
- err = errors.Join(err, e)
- }
- continue
- }
-
- validInstruments = append(validInstruments, inst)
- default:
- // Instrument external to the SDK.
- return nil, errors.New("invalid observable: from different implementation")
- }
- }
-
- if len(validInstruments) == 0 {
- // All insts use drop aggregation or are invalid.
- return noopRegister{}, err
- }
-
- unregs := make([]func(), len(m.pipes))
- for ix, pipe := range m.pipes {
- reg := newObserver(pipe)
- for _, inst := range validInstruments {
- switch o := inst.(type) {
- case int64Observable:
- reg.registerInt64(o.observableID)
- case float64Observable:
- reg.registerFloat64(o.observableID)
- }
- }
-
- // Some or all instruments were valid.
- cBack := func(ctx context.Context) error { return f(ctx, reg) }
- unregs[ix] = pipe.addMultiCallback(cBack)
- }
-
- return unregisterFuncs{f: unregs}, err
-}
-
-type observer struct {
- embedded.Observer
-
- pipe *pipeline
- float64 map[observableID[float64]]struct{}
- int64 map[observableID[int64]]struct{}
-}
-
-func newObserver(p *pipeline) observer {
- return observer{
- pipe: p,
- float64: make(map[observableID[float64]]struct{}),
- int64: make(map[observableID[int64]]struct{}),
- }
-}
-
-func (r observer) registerFloat64(id observableID[float64]) {
- r.float64[id] = struct{}{}
-}
-
-func (r observer) registerInt64(id observableID[int64]) {
- r.int64[id] = struct{}{}
-}
-
-var (
- errUnknownObserver = errors.New("unknown observable instrument")
- errUnregObserver = errors.New("observable instrument not registered for callback")
-)
-
-func (r observer) ObserveFloat64(o metric.Float64Observable, v float64, opts ...metric.ObserveOption) {
- var oImpl float64Observable
- switch conv := o.(type) {
- case float64Observable:
- oImpl = conv
- default:
- global.Error(errUnknownObserver, "failed to record")
- return
- }
-
- if _, registered := r.float64[oImpl.observableID]; !registered {
- if !oImpl.dropAggregation {
- global.Error(errUnregObserver, "failed to record",
- "name", oImpl.name,
- "description", oImpl.description,
- "unit", oImpl.unit,
- "number", fmt.Sprintf("%T", float64(0)),
- )
- }
- return
- }
- c := metric.NewObserveConfig(opts)
- // Access to r.pipe.float64Measure is already guarded by a lock in pipeline.produce.
- // TODO (#5946): Refactor pipeline and observable measures.
- measures := r.pipe.float64Measures[oImpl.observableID]
- for _, m := range measures {
- m(context.Background(), v, c.Attributes())
- }
-}
-
-func (r observer) ObserveInt64(o metric.Int64Observable, v int64, opts ...metric.ObserveOption) {
- var oImpl int64Observable
- switch conv := o.(type) {
- case int64Observable:
- oImpl = conv
- default:
- global.Error(errUnknownObserver, "failed to record")
- return
- }
-
- if _, registered := r.int64[oImpl.observableID]; !registered {
- if !oImpl.dropAggregation {
- global.Error(errUnregObserver, "failed to record",
- "name", oImpl.name,
- "description", oImpl.description,
- "unit", oImpl.unit,
- "number", fmt.Sprintf("%T", int64(0)),
- )
- }
- return
- }
- c := metric.NewObserveConfig(opts)
- // Access to r.pipe.int64Measures is already guarded b a lock in pipeline.produce.
- // TODO (#5946): Refactor pipeline and observable measures.
- measures := r.pipe.int64Measures[oImpl.observableID]
- for _, m := range measures {
- m(context.Background(), v, c.Attributes())
- }
-}
-
-type noopRegister struct{ embedded.Registration }
-
-func (noopRegister) Unregister() error {
- return nil
-}
-
-// int64InstProvider provides int64 OpenTelemetry instruments.
-type int64InstProvider struct{ *meter }
-
-func (p int64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]aggregate.Measure[int64], error) {
- inst := Instrument{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- Scope: p.scope,
- }
- return p.int64Resolver.Aggregators(inst)
-}
-
-func (p int64InstProvider) histogramAggs(name string, cfg metric.Int64HistogramConfig) ([]aggregate.Measure[int64], error) {
- boundaries := cfg.ExplicitBucketBoundaries()
- aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
- if aggError != nil {
- // If boundaries are invalid, ignore them.
- boundaries = nil
- }
- inst := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- Scope: p.scope,
- }
- measures, err := p.int64Resolver.HistogramAggregators(inst, boundaries)
- return measures, errors.Join(aggError, err)
-}
-
-// lookup returns the resolved instrumentImpl.
-func (p int64InstProvider) lookup(kind InstrumentKind, name, desc, u string) (*int64Inst, error) {
- return p.meter.int64Insts.Lookup(instID{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- }, func() (*int64Inst, error) {
- aggs, err := p.aggs(kind, name, desc, u)
- return &int64Inst{measures: aggs}, err
- })
-}
-
-// lookupHistogram returns the resolved instrumentImpl.
-func (p int64InstProvider) lookupHistogram(name string, cfg metric.Int64HistogramConfig) (*int64Inst, error) {
- return p.meter.int64Insts.Lookup(instID{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- }, func() (*int64Inst, error) {
- aggs, err := p.histogramAggs(name, cfg)
- return &int64Inst{measures: aggs}, err
- })
-}
-
-// float64InstProvider provides float64 OpenTelemetry instruments.
-type float64InstProvider struct{ *meter }
-
-func (p float64InstProvider) aggs(kind InstrumentKind, name, desc, u string) ([]aggregate.Measure[float64], error) {
- inst := Instrument{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- Scope: p.scope,
- }
- return p.float64Resolver.Aggregators(inst)
-}
-
-func (p float64InstProvider) histogramAggs(name string, cfg metric.Float64HistogramConfig) ([]aggregate.Measure[float64], error) {
- boundaries := cfg.ExplicitBucketBoundaries()
- aggError := AggregationExplicitBucketHistogram{Boundaries: boundaries}.err()
- if aggError != nil {
- // If boundaries are invalid, ignore them.
- boundaries = nil
- }
- inst := Instrument{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- Scope: p.scope,
- }
- measures, err := p.float64Resolver.HistogramAggregators(inst, boundaries)
- return measures, errors.Join(aggError, err)
-}
-
-// lookup returns the resolved instrumentImpl.
-func (p float64InstProvider) lookup(kind InstrumentKind, name, desc, u string) (*float64Inst, error) {
- return p.meter.float64Insts.Lookup(instID{
- Name: name,
- Description: desc,
- Unit: u,
- Kind: kind,
- }, func() (*float64Inst, error) {
- aggs, err := p.aggs(kind, name, desc, u)
- return &float64Inst{measures: aggs}, err
- })
-}
-
-// lookupHistogram returns the resolved instrumentImpl.
-func (p float64InstProvider) lookupHistogram(name string, cfg metric.Float64HistogramConfig) (*float64Inst, error) {
- return p.meter.float64Insts.Lookup(instID{
- Name: name,
- Description: cfg.Description(),
- Unit: cfg.Unit(),
- Kind: InstrumentKindHistogram,
- }, func() (*float64Inst, error) {
- aggs, err := p.histogramAggs(name, cfg)
- return &float64Inst{measures: aggs}, err
- })
-}
-
-type int64Observer struct {
- embedded.Int64Observer
- measures[int64]
-}
-
-func (o int64Observer) Observe(val int64, opts ...metric.ObserveOption) {
- c := metric.NewObserveConfig(opts)
- o.observe(val, c.Attributes())
-}
-
-type float64Observer struct {
- embedded.Float64Observer
- measures[float64]
-}
-
-func (o float64Observer) Observe(val float64, opts ...metric.ObserveOption) {
- c := metric.NewObserveConfig(opts)
- o.observe(val, c.Attributes())
-}