metrics/smithyotelmetrics/metrics.go (152 lines of code) (raw):

package smithyotelmetrics import ( "github.com/aws/smithy-go/metrics" otelmetric "go.opentelemetry.io/otel/metric" ) // Adapt wraps a concrete OpenTelemetry SDK MeterProvider for use with Smithy // SDK clients. // // Adapt can be called multiple times on a single MeterProvider. func Adapt(mp otelmetric.MeterProvider) metrics.MeterProvider { return &meterProvider{mp} } type meterProvider struct { otel otelmetric.MeterProvider } var _ metrics.MeterProvider = (*meterProvider)(nil) func (p *meterProvider) Meter(scope string, opts ...metrics.MeterOption) metrics.Meter { var options metrics.MeterOptions for _, opt := range opts { opt(&options) } m := p.otel.Meter(scope, otelmetric.WithInstrumentationAttributes( toOTELKeyValues(options.Properties)..., )) return &meter{m} } type meter struct { otel otelmetric.Meter } var _ metrics.Meter = (*meter)(nil) func (m *meter) Int64Counter(name string, opts ...metrics.InstrumentOption) (metrics.Int64Counter, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64Counter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &int64Counter{i}, nil } func (m *meter) Int64UpDownCounter(name string, opts ...metrics.InstrumentOption) (metrics.Int64UpDownCounter, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64UpDownCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &int64Counter{i}, nil } func (m *meter) Int64Gauge(name string, opts ...metrics.InstrumentOption) (metrics.Int64Gauge, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64Gauge(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &int64Gauge{i}, nil } func (m *meter) Int64Histogram(name string, opts ...metrics.InstrumentOption) (metrics.Int64Histogram, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64Histogram(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &int64Histogram{i}, nil } func (m *meter) Int64AsyncCounter(name string, callback metrics.Int64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64ObservableCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncInt64(i, callback) } func (m *meter) Int64AsyncUpDownCounter(name string, callback metrics.Int64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64ObservableUpDownCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncInt64(i, callback) } func (m *meter) Int64AsyncGauge(name string, callback metrics.Int64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Int64ObservableGauge(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncInt64(i, callback) } func (m *meter) Float64Counter(name string, opts ...metrics.InstrumentOption) (metrics.Float64Counter, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64Counter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &float64Counter{i}, nil } func (m *meter) Float64UpDownCounter(name string, opts ...metrics.InstrumentOption) (metrics.Float64UpDownCounter, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64UpDownCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &float64Counter{i}, nil } func (m *meter) Float64Gauge(name string, opts ...metrics.InstrumentOption) (metrics.Float64Gauge, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64Gauge(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &float64Gauge{i}, nil } func (m *meter) Float64Histogram(name string, opts ...metrics.InstrumentOption) (metrics.Float64Histogram, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64Histogram(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return &float64Histogram{i}, nil } func (m *meter) Float64AsyncCounter(name string, callback metrics.Float64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64ObservableCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncFloat64(i, callback) } func (m *meter) Float64AsyncUpDownCounter(name string, callback metrics.Float64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64ObservableUpDownCounter(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncFloat64(i, callback) } func (m *meter) Float64AsyncGauge(name string, callback metrics.Float64Callback, opts ...metrics.InstrumentOption) (metrics.AsyncInstrument, error) { unit, desc := toInstrumentOpts(opts...) i, err := m.otel.Float64ObservableGauge(name, otelmetric.WithUnit(unit), otelmetric.WithDescription(desc)) if err != nil { return nil, err } return m.registerAsyncFloat64(i, callback) } func (m *meter) registerAsyncInt64(i otelmetric.Int64Observable, cb metrics.Int64Callback) (metrics.AsyncInstrument, error) { r, err := m.otel.RegisterCallback(adaptInt64CB(i, cb), i) if err != nil { return nil, err } return &asyncInstrument{r}, nil } func (m *meter) registerAsyncFloat64(i otelmetric.Float64Observable, cb metrics.Float64Callback) (metrics.AsyncInstrument, error) { r, err := m.otel.RegisterCallback(adaptFloat64CB(i, cb), i) if err != nil { return nil, err } return &asyncInstrument{r}, nil }