core/metrics/meter.go
package metrics
import (
"context"
"fmt"
"go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/metric/embedded"
"go.opentelemetry.io/otel/metric/noop"
)
// MeterProvider is an interface for creating and registering meters.
// It also allows the provider to be managed.
type MeterProvider interface {
metric.MeterProvider
// Shutdown shuts down the MeterProvider flushing all pending telemetry and
// releasing any held computational resources.
//
// This call is idempotent. The first call will perform all flush and
// releasing operations. Subsequent calls will perform no action and will
// return an error stating this.
//
// Measurements made by instruments from meters this MeterProvider created
// will not be exported after Shutdown is called.
//
// This method honors the deadline or cancellation of ctx. An appropriate
// error will be returned in these situations. There is no guaranteed that all
// telemetry be flushed or all resources have been released in these
// situations.
//
// This method is safe to call concurrently.
Shutdown(ctx context.Context) error
// ForceFlush flushes all pending telemetry.
//
// This method honors the deadline or cancellation of ctx. An appropriate
// error will be returned in these situations. There is no guaranteed that all
// telemetry be flushed or all resources have been released in these
// situations.
//
// This method is safe to call concurrently.
ForceFlush(ctx context.Context) error
}
// Meter is an interface for counter and histogram.
// Deprecated: will be removed in a future version.
type Meter interface {
// NewCounter creates a new meter counter instrument.
NewCounter(meterName string, counterName string, desc string, units string) (metric.Int64Counter, error)
// NewHistogram creates a new meter histogram instrument.
NewHistogram(meterName string, histName string, desc string, units string) (metric.Int64Histogram, error)
}
// MeterImpl is an implementation of the MeterProvider interface.
type MeterImpl struct {
mp MeterProvider
}
// NewOtelMeter creates a new meter provider.
// Deprecated: will be removed in a future version.
func NewOtelMeter(mp MeterProvider) *MeterImpl {
return &MeterImpl{mp: mp}
}
// NewCounter creates a new meter counter instrument.
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#counter
// Deprecated: will be removed in a future version.
func (m *MeterImpl) NewCounter(meterName string, counterName string, desc string, units string) (metric.Int64Counter, error) {
counter, err := m.mp.Meter(
meterName,
).
Int64Counter(
counterName,
metric.WithDescription(desc),
metric.WithUnit(units),
)
if err != nil {
return nil, fmt.Errorf("creating counter failed %w", err)
}
return counter, nil
}
// NewHistogram creates a new meter histogram instrument.
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/api.md#histogram
// Deprecated: will be removed in a future version.
func (m *MeterImpl) NewHistogram(meterName string, histName string, desc string, units string) (metric.Int64Histogram, error) {
histogram, err := m.mp.Meter(
meterName,
).Int64Histogram(
histName,
metric.WithDescription(desc),
metric.WithUnit(units),
)
if err != nil {
return nil, fmt.Errorf("creating histogram failed %w", err)
}
return histogram, nil
}
// NullMeterImpl is a no-op implementation of the Meter interface.
// Deprecated: will be removed in a future version.
type NullMeterImpl struct{}
// Meter providees a no-op implementation of the Meter interface.
func (m *NullMeterImpl) Meter() metric.Meter {
return noop.Meter{}
}
// NewCounter creates a new meter counter instrument.
func (m *NullMeterImpl) NewCounter(_ string, _ string, _ string, _ string) (metric.Int64Counter, error) {
return &NullCounter{}, nil
}
// NewHistogram creates a new meter histogram instrument.
func (m *NullMeterImpl) NewHistogram(_ string, _ string, _ string, _ string) (metric.Int64Histogram, error) {
return &NullHistogram{}, nil
}
// NullCounter is a no-op implementation of the metric.Int64Counter.
type NullCounter struct {
embedded.Int64Counter
}
// Add is a no-op implementation of Int64Counter Add() function.
func (n *NullCounter) Add(_ context.Context, _ int64, _ ...metric.AddOption) {}
// NullHistogram is a no-op implementation of the metric.Int64Histogram.
type NullHistogram struct {
embedded.Int64Histogram
}
// Record is a no-op implementation of RecordOption Record() function.
func (n *NullHistogram) Record(_ context.Context, _ int64, _ ...metric.RecordOption) {}