mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-10 09:50:58 +02:00
Introduce metric constructor errors, MeterMust
wrapper (#529)
* Update api for Must constructors, with SDK helpers * Update for Must constructors, leaving TODOs about global errors * Add tests * Move Must methods into metric.Must * Apply the feedback * Remove interfaces * Remove more interfaces * Again... * Remove a sentence about a dead inteface
This commit is contained in:
parent
288821cd22
commit
4047c0877a
@ -18,6 +18,8 @@ import (
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
)
|
||||
|
||||
var Must = metric.Must
|
||||
|
||||
// benchFixture is copied from sdk/metric/benchmark_test.go.
|
||||
// TODO refactor to share this code.
|
||||
type benchFixture struct {
|
||||
@ -72,7 +74,7 @@ func BenchmarkGlobalInt64CounterAddNoSDK(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
sdk := global.Meter("test")
|
||||
labs := sdk.Labels(key.String("A", "B"))
|
||||
cnt := sdk.NewInt64Counter("int64.counter")
|
||||
cnt := Must(sdk).NewInt64Counter("int64.counter")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -91,7 +93,7 @@ func BenchmarkGlobalInt64CounterAddWithSDK(b *testing.B) {
|
||||
global.SetMeterProvider(fix)
|
||||
|
||||
labs := sdk.Labels(key.String("A", "B"))
|
||||
cnt := sdk.NewInt64Counter("int64.counter")
|
||||
cnt := Must(sdk).NewInt64Counter("int64.counter")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
|
@ -2,6 +2,7 @@ package internal
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
@ -80,6 +81,10 @@ type obsImpl struct {
|
||||
callback interface{}
|
||||
}
|
||||
|
||||
type hasImpl interface {
|
||||
Impl() metric.InstrumentImpl
|
||||
}
|
||||
|
||||
type int64ObsImpl struct {
|
||||
observer *obsImpl
|
||||
}
|
||||
@ -122,6 +127,8 @@ var _ metric.Float64Observer = float64ObsImpl{}
|
||||
var _ observerUnregister = (metric.Int64Observer)(nil)
|
||||
var _ observerUnregister = (metric.Float64Observer)(nil)
|
||||
|
||||
var errInvalidMetricKind = errors.New("Invalid Metric kind")
|
||||
|
||||
// Provider interface and delegation
|
||||
|
||||
func (p *meterProvider) setDelegate(provider metric.Provider) {
|
||||
@ -174,7 +181,7 @@ func (m *meter) setDelegate(provider metric.Provider) {
|
||||
m.orderedObservers = nil
|
||||
}
|
||||
|
||||
func (m *meter) newInst(name string, mkind metricKind, nkind core.NumberKind, opts interface{}) metric.InstrumentImpl {
|
||||
func (m *meter) newInst(name string, mkind metricKind, nkind core.NumberKind, opts interface{}) (metric.InstrumentImpl, error) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
|
||||
@ -189,23 +196,33 @@ func (m *meter) newInst(name string, mkind metricKind, nkind core.NumberKind, op
|
||||
opts: opts,
|
||||
}
|
||||
m.instruments = append(m.instruments, inst)
|
||||
return inst
|
||||
return inst, nil
|
||||
}
|
||||
|
||||
func newInstDelegate(m metric.Meter, name string, mkind metricKind, nkind core.NumberKind, opts interface{}) metric.InstrumentImpl {
|
||||
func delegateCheck(has hasImpl, err error) (metric.InstrumentImpl, error) {
|
||||
if has != nil {
|
||||
return has.Impl(), err
|
||||
}
|
||||
if err == nil {
|
||||
err = metric.ErrSDKReturnedNilImpl
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func newInstDelegate(m metric.Meter, name string, mkind metricKind, nkind core.NumberKind, opts interface{}) (metric.InstrumentImpl, error) {
|
||||
switch mkind {
|
||||
case counterKind:
|
||||
if nkind == core.Int64NumberKind {
|
||||
return m.NewInt64Counter(name, opts.([]metric.CounterOptionApplier)...).Impl()
|
||||
return delegateCheck(m.NewInt64Counter(name, opts.([]metric.CounterOptionApplier)...))
|
||||
}
|
||||
return m.NewFloat64Counter(name, opts.([]metric.CounterOptionApplier)...).Impl()
|
||||
return delegateCheck(m.NewFloat64Counter(name, opts.([]metric.CounterOptionApplier)...))
|
||||
case measureKind:
|
||||
if nkind == core.Int64NumberKind {
|
||||
return m.NewInt64Measure(name, opts.([]metric.MeasureOptionApplier)...).Impl()
|
||||
return delegateCheck(m.NewInt64Measure(name, opts.([]metric.MeasureOptionApplier)...))
|
||||
}
|
||||
return m.NewFloat64Measure(name, opts.([]metric.MeasureOptionApplier)...).Impl()
|
||||
return delegateCheck(m.NewFloat64Measure(name, opts.([]metric.MeasureOptionApplier)...))
|
||||
}
|
||||
return nil
|
||||
return nil, errInvalidMetricKind
|
||||
}
|
||||
|
||||
// Instrument delegation
|
||||
@ -213,7 +230,16 @@ func newInstDelegate(m metric.Meter, name string, mkind metricKind, nkind core.N
|
||||
func (inst *instImpl) setDelegate(d metric.Meter) {
|
||||
implPtr := new(metric.InstrumentImpl)
|
||||
|
||||
*implPtr = newInstDelegate(d, inst.name, inst.mkind, inst.nkind, inst.opts)
|
||||
var err error
|
||||
*implPtr, err = newInstDelegate(d, inst.name, inst.mkind, inst.nkind, inst.opts)
|
||||
|
||||
if err != nil {
|
||||
// TODO: There is no standard way to deliver this error to the user.
|
||||
// See https://github.com/open-telemetry/opentelemetry-go/issues/514
|
||||
// Note that the default SDK will not generate any errors yet, this is
|
||||
// only for added safety.
|
||||
panic(err)
|
||||
}
|
||||
|
||||
atomic.StorePointer(&inst.delegate, unsafe.Pointer(implPtr))
|
||||
}
|
||||
@ -281,7 +307,18 @@ func (obs *obsImpl) getUnregister() observerUnregister {
|
||||
func (obs *obsImpl) setInt64Delegate(d metric.Meter) {
|
||||
obsPtr := new(metric.Int64Observer)
|
||||
cb := obs.callback.(metric.Int64ObserverCallback)
|
||||
*obsPtr = d.RegisterInt64Observer(obs.name, cb, obs.opts...)
|
||||
|
||||
var err error
|
||||
*obsPtr, err = d.RegisterInt64Observer(obs.name, cb, obs.opts...)
|
||||
|
||||
if err != nil {
|
||||
// TODO: There is no standard way to deliver this error to the user.
|
||||
// See https://github.com/open-telemetry/opentelemetry-go/issues/514
|
||||
// Note that the default SDK will not generate any errors yet, this is
|
||||
// only for added safety.
|
||||
panic(err)
|
||||
}
|
||||
|
||||
atomic.StorePointer(&obs.delegate, unsafe.Pointer(obsPtr))
|
||||
}
|
||||
|
||||
@ -294,7 +331,17 @@ func (obs int64ObsImpl) Unregister() {
|
||||
func (obs *obsImpl) setFloat64Delegate(d metric.Meter) {
|
||||
obsPtr := new(metric.Float64Observer)
|
||||
cb := obs.callback.(metric.Float64ObserverCallback)
|
||||
*obsPtr = d.RegisterFloat64Observer(obs.name, cb, obs.opts...)
|
||||
|
||||
var err error
|
||||
*obsPtr, err = d.RegisterFloat64Observer(obs.name, cb, obs.opts...)
|
||||
if err != nil {
|
||||
// TODO: There is no standard way to deliver this error to the user.
|
||||
// See https://github.com/open-telemetry/opentelemetry-go/issues/514
|
||||
// Note that the default SDK will not generate any errors yet, this is
|
||||
// only for added safety.
|
||||
panic(err)
|
||||
}
|
||||
|
||||
atomic.StorePointer(&obs.delegate, unsafe.Pointer(obsPtr))
|
||||
}
|
||||
|
||||
@ -372,23 +419,23 @@ func (labels *labelSet) Delegate() metric.LabelSet {
|
||||
|
||||
// Constructors
|
||||
|
||||
func (m *meter) NewInt64Counter(name string, opts ...metric.CounterOptionApplier) metric.Int64Counter {
|
||||
func (m *meter) NewInt64Counter(name string, opts ...metric.CounterOptionApplier) (metric.Int64Counter, error) {
|
||||
return metric.WrapInt64CounterInstrument(m.newInst(name, counterKind, core.Int64NumberKind, opts))
|
||||
}
|
||||
|
||||
func (m *meter) NewFloat64Counter(name string, opts ...metric.CounterOptionApplier) metric.Float64Counter {
|
||||
func (m *meter) NewFloat64Counter(name string, opts ...metric.CounterOptionApplier) (metric.Float64Counter, error) {
|
||||
return metric.WrapFloat64CounterInstrument(m.newInst(name, counterKind, core.Float64NumberKind, opts))
|
||||
}
|
||||
|
||||
func (m *meter) NewInt64Measure(name string, opts ...metric.MeasureOptionApplier) metric.Int64Measure {
|
||||
func (m *meter) NewInt64Measure(name string, opts ...metric.MeasureOptionApplier) (metric.Int64Measure, error) {
|
||||
return metric.WrapInt64MeasureInstrument(m.newInst(name, measureKind, core.Int64NumberKind, opts))
|
||||
}
|
||||
|
||||
func (m *meter) NewFloat64Measure(name string, opts ...metric.MeasureOptionApplier) metric.Float64Measure {
|
||||
func (m *meter) NewFloat64Measure(name string, opts ...metric.MeasureOptionApplier) (metric.Float64Measure, error) {
|
||||
return metric.WrapFloat64MeasureInstrument(m.newInst(name, measureKind, core.Float64NumberKind, opts))
|
||||
}
|
||||
|
||||
func (m *meter) RegisterInt64Observer(name string, callback metric.Int64ObserverCallback, oos ...metric.ObserverOptionApplier) metric.Int64Observer {
|
||||
func (m *meter) RegisterInt64Observer(name string, callback metric.Int64ObserverCallback, oos ...metric.ObserverOptionApplier) (metric.Int64Observer, error) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
|
||||
@ -406,10 +453,10 @@ func (m *meter) RegisterInt64Observer(name string, callback metric.Int64Observer
|
||||
m.addObserver(obs)
|
||||
return int64ObsImpl{
|
||||
observer: obs,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (m *meter) RegisterFloat64Observer(name string, callback metric.Float64ObserverCallback, oos ...metric.ObserverOptionApplier) metric.Float64Observer {
|
||||
func (m *meter) RegisterFloat64Observer(name string, callback metric.Float64ObserverCallback, oos ...metric.ObserverOptionApplier) (metric.Float64Observer, error) {
|
||||
m.lock.Lock()
|
||||
defer m.lock.Unlock()
|
||||
|
||||
@ -427,7 +474,7 @@ func (m *meter) RegisterFloat64Observer(name string, callback metric.Float64Obse
|
||||
m.addObserver(obs)
|
||||
return float64ObsImpl{
|
||||
observer: obs,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (m *meter) addObserver(obs *obsImpl) {
|
||||
|
@ -2,6 +2,7 @@ package internal_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
@ -30,25 +31,25 @@ func TestDirect(t *testing.T) {
|
||||
lvals3 := key.String("E", "F")
|
||||
labels3 := meter2.Labels(lvals3)
|
||||
|
||||
counter := meter1.NewInt64Counter("test.counter")
|
||||
counter := Must(meter1).NewInt64Counter("test.counter")
|
||||
counter.Add(ctx, 1, labels1)
|
||||
counter.Add(ctx, 1, labels1)
|
||||
|
||||
measure := meter1.NewFloat64Measure("test.measure")
|
||||
measure := Must(meter1).NewFloat64Measure("test.measure")
|
||||
measure.Record(ctx, 1, labels1)
|
||||
measure.Record(ctx, 2, labels1)
|
||||
|
||||
_ = meter1.RegisterFloat64Observer("test.observer.float", func(result metric.Float64ObserverResult) {
|
||||
_ = Must(meter1).RegisterFloat64Observer("test.observer.float", func(result metric.Float64ObserverResult) {
|
||||
result.Observe(1., labels1)
|
||||
result.Observe(2., labels2)
|
||||
})
|
||||
|
||||
_ = meter1.RegisterInt64Observer("test.observer.int", func(result metric.Int64ObserverResult) {
|
||||
_ = Must(meter1).RegisterInt64Observer("test.observer.int", func(result metric.Int64ObserverResult) {
|
||||
result.Observe(1, labels1)
|
||||
result.Observe(2, labels2)
|
||||
})
|
||||
|
||||
second := meter2.NewFloat64Measure("test.second")
|
||||
second := Must(meter2).NewFloat64Measure("test.second")
|
||||
second.Record(ctx, 1, labels3)
|
||||
second.Record(ctx, 2, labels3)
|
||||
|
||||
@ -145,12 +146,12 @@ func TestBound(t *testing.T) {
|
||||
lvals1 := key.String("A", "B")
|
||||
labels1 := glob.Labels(lvals1)
|
||||
|
||||
counter := glob.NewFloat64Counter("test.counter")
|
||||
counter := Must(glob).NewFloat64Counter("test.counter")
|
||||
boundC := counter.Bind(labels1)
|
||||
boundC.Add(ctx, 1)
|
||||
boundC.Add(ctx, 1)
|
||||
|
||||
measure := glob.NewInt64Measure("test.measure")
|
||||
measure := Must(glob).NewInt64Measure("test.measure")
|
||||
boundM := measure.Bind(labels1)
|
||||
boundM.Record(ctx, 1)
|
||||
boundM.Record(ctx, 2)
|
||||
@ -195,14 +196,14 @@ func TestUnbind(t *testing.T) {
|
||||
lvals1 := key.New("A").String("B")
|
||||
labels1 := glob.Labels(lvals1)
|
||||
|
||||
counter := glob.NewFloat64Counter("test.counter")
|
||||
counter := Must(glob).NewFloat64Counter("test.counter")
|
||||
boundC := counter.Bind(labels1)
|
||||
|
||||
measure := glob.NewInt64Measure("test.measure")
|
||||
measure := Must(glob).NewInt64Measure("test.measure")
|
||||
boundM := measure.Bind(labels1)
|
||||
|
||||
observerInt := glob.RegisterInt64Observer("test.observer.int", nil)
|
||||
observerFloat := glob.RegisterFloat64Observer("test.observer.float", nil)
|
||||
observerInt := Must(glob).RegisterInt64Observer("test.observer.int", nil)
|
||||
observerFloat := Must(glob).RegisterFloat64Observer("test.observer.float", nil)
|
||||
|
||||
boundC.Unbind()
|
||||
boundM.Unbind()
|
||||
@ -218,7 +219,7 @@ func TestDefaultSDK(t *testing.T) {
|
||||
lvals1 := key.String("A", "B")
|
||||
labels1 := meter1.Labels(lvals1)
|
||||
|
||||
counter := meter1.NewInt64Counter("test.builtin")
|
||||
counter := Must(meter1).NewInt64Counter("test.builtin")
|
||||
counter.Add(ctx, 1, labels1)
|
||||
counter.Add(ctx, 1, labels1)
|
||||
|
||||
@ -251,8 +252,9 @@ func TestUnbindThenRecordOne(t *testing.T) {
|
||||
|
||||
ctx := context.Background()
|
||||
sdk := metrictest.NewProvider()
|
||||
|
||||
meter := global.Meter("test")
|
||||
counter := meter.NewInt64Counter("test.counter")
|
||||
counter := Must(meter).NewInt64Counter("test.counter")
|
||||
boundC := counter.Bind(meter.Labels())
|
||||
global.SetMeterProvider(sdk)
|
||||
boundC.Unbind()
|
||||
@ -263,3 +265,38 @@ func TestUnbindThenRecordOne(t *testing.T) {
|
||||
mock := global.Meter("test").(*metrictest.Meter)
|
||||
require.Equal(t, 0, len(mock.MeasurementBatches))
|
||||
}
|
||||
|
||||
type meterProviderWithConstructorError struct {
|
||||
metric.Provider
|
||||
}
|
||||
|
||||
type meterWithConstructorError struct {
|
||||
metric.Meter
|
||||
}
|
||||
|
||||
func (m *meterProviderWithConstructorError) Meter(name string) metric.Meter {
|
||||
return &meterWithConstructorError{m.Provider.Meter(name)}
|
||||
}
|
||||
|
||||
func (m *meterWithConstructorError) NewInt64Counter(name string, cos ...metric.CounterOptionApplier) (metric.Int64Counter, error) {
|
||||
return metric.Int64Counter{}, errors.New("constructor error")
|
||||
}
|
||||
|
||||
func TestErrorInDeferredConstructor(t *testing.T) {
|
||||
internal.ResetForTest()
|
||||
|
||||
ctx := context.Background()
|
||||
meter := global.MeterProvider().Meter("builtin")
|
||||
|
||||
c1 := Must(meter).NewInt64Counter("test")
|
||||
c2 := Must(meter).NewInt64Counter("test")
|
||||
|
||||
sdk := &meterProviderWithConstructorError{metrictest.NewProvider()}
|
||||
|
||||
require.Panics(t, func() {
|
||||
global.SetMeterProvider(sdk)
|
||||
})
|
||||
|
||||
c1.Add(ctx, 1, meter.Labels())
|
||||
c2.Add(ctx, 2, meter.Labels())
|
||||
}
|
||||
|
@ -108,30 +108,36 @@ type Meter interface {
|
||||
// be read by the application.
|
||||
Labels(...core.KeyValue) LabelSet
|
||||
|
||||
// RecordBatch atomically records a batch of measurements.
|
||||
RecordBatch(context.Context, LabelSet, ...Measurement)
|
||||
|
||||
// All instrument constructors may return an error for
|
||||
// conditions such as:
|
||||
// `name` is an empty string
|
||||
// `name` was previously registered as a different kind of instrument
|
||||
// for a given named `Meter`.
|
||||
|
||||
// NewInt64Counter creates a new integral counter with a given
|
||||
// name and customized with passed options.
|
||||
NewInt64Counter(name string, cos ...CounterOptionApplier) Int64Counter
|
||||
NewInt64Counter(name string, cos ...CounterOptionApplier) (Int64Counter, error)
|
||||
// NewFloat64Counter creates a new floating point counter with
|
||||
// a given name and customized with passed options.
|
||||
NewFloat64Counter(name string, cos ...CounterOptionApplier) Float64Counter
|
||||
NewFloat64Counter(name string, cos ...CounterOptionApplier) (Float64Counter, error)
|
||||
// NewInt64Measure creates a new integral measure with a given
|
||||
// name and customized with passed options.
|
||||
NewInt64Measure(name string, mos ...MeasureOptionApplier) Int64Measure
|
||||
NewInt64Measure(name string, mos ...MeasureOptionApplier) (Int64Measure, error)
|
||||
// NewFloat64Measure creates a new floating point measure with
|
||||
// a given name and customized with passed options.
|
||||
NewFloat64Measure(name string, mos ...MeasureOptionApplier) Float64Measure
|
||||
NewFloat64Measure(name string, mos ...MeasureOptionApplier) (Float64Measure, error)
|
||||
|
||||
// RegisterInt64Observer creates a new integral observer with a
|
||||
// given name, running a given callback, and customized with passed
|
||||
// options. Callback can be nil.
|
||||
RegisterInt64Observer(name string, callback Int64ObserverCallback, oos ...ObserverOptionApplier) Int64Observer
|
||||
RegisterInt64Observer(name string, callback Int64ObserverCallback, oos ...ObserverOptionApplier) (Int64Observer, error)
|
||||
// RegisterFloat64Observer creates a new floating point observer
|
||||
// with a given name, running a given callback, and customized with
|
||||
// passed options. Callback can be nil.
|
||||
RegisterFloat64Observer(name string, callback Float64ObserverCallback, oos ...ObserverOptionApplier) Float64Observer
|
||||
|
||||
// RecordBatch atomically records a batch of measurements.
|
||||
RecordBatch(context.Context, LabelSet, ...Measurement)
|
||||
RegisterFloat64Observer(name string, callback Float64ObserverCallback, oos ...ObserverOptionApplier) (Float64Observer, error)
|
||||
}
|
||||
|
||||
// Int64ObserverResult is an interface for reporting integral
|
||||
|
@ -16,6 +16,7 @@ package metric_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
@ -27,8 +28,11 @@ import (
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
var Must = metric.Must
|
||||
|
||||
func TestCounterOptions(t *testing.T) {
|
||||
type testcase struct {
|
||||
name string
|
||||
@ -371,7 +375,7 @@ func checkOptions(t *testing.T, got *metric.Options, expected *metric.Options) {
|
||||
func TestCounter(t *testing.T) {
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
c := meter.NewFloat64Counter("test.counter.float")
|
||||
c := Must(meter).NewFloat64Counter("test.counter.float")
|
||||
ctx := context.Background()
|
||||
labels := meter.Labels()
|
||||
c.Add(ctx, 42, labels)
|
||||
@ -383,7 +387,7 @@ func TestCounter(t *testing.T) {
|
||||
}
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
c := meter.NewInt64Counter("test.counter.int")
|
||||
c := Must(meter).NewInt64Counter("test.counter.int")
|
||||
ctx := context.Background()
|
||||
labels := meter.Labels()
|
||||
c.Add(ctx, 42, labels)
|
||||
@ -398,7 +402,7 @@ func TestCounter(t *testing.T) {
|
||||
func TestMeasure(t *testing.T) {
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
m := meter.NewFloat64Measure("test.measure.float")
|
||||
m := Must(meter).NewFloat64Measure("test.measure.float")
|
||||
ctx := context.Background()
|
||||
labels := meter.Labels()
|
||||
m.Record(ctx, 42, labels)
|
||||
@ -410,7 +414,7 @@ func TestMeasure(t *testing.T) {
|
||||
}
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
m := meter.NewInt64Measure("test.measure.int")
|
||||
m := Must(meter).NewInt64Measure("test.measure.int")
|
||||
ctx := context.Background()
|
||||
labels := meter.Labels()
|
||||
m.Record(ctx, 42, labels)
|
||||
@ -426,7 +430,7 @@ func TestObserver(t *testing.T) {
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
labels := meter.Labels()
|
||||
o := meter.RegisterFloat64Observer("test.observer.float", func(result metric.Float64ObserverResult) {
|
||||
o := Must(meter).RegisterFloat64Observer("test.observer.float", func(result metric.Float64ObserverResult) {
|
||||
result.Observe(42, labels)
|
||||
})
|
||||
t.Log("Testing float observer")
|
||||
@ -436,7 +440,7 @@ func TestObserver(t *testing.T) {
|
||||
{
|
||||
meter := mock.NewMeter()
|
||||
labels := meter.Labels()
|
||||
o := meter.RegisterInt64Observer("test.observer.int", func(result metric.Int64ObserverResult) {
|
||||
o := Must(meter).RegisterInt64Observer("test.observer.int", func(result metric.Int64ObserverResult) {
|
||||
result.Observe(42, labels)
|
||||
})
|
||||
t.Log("Testing int observer")
|
||||
@ -527,3 +531,37 @@ func fortyTwo(t *testing.T, kind core.NumberKind) core.Number {
|
||||
t.Errorf("Invalid value kind %q", kind)
|
||||
return core.NewInt64Number(0)
|
||||
}
|
||||
|
||||
type testWrappedInst struct{}
|
||||
|
||||
func (*testWrappedInst) Bind(labels metric.LabelSet) metric.BoundInstrumentImpl {
|
||||
panic("Not called")
|
||||
}
|
||||
|
||||
func (*testWrappedInst) RecordOne(ctx context.Context, number core.Number, labels metric.LabelSet) {
|
||||
panic("Not called")
|
||||
}
|
||||
|
||||
func TestWrappedInstrumentError(t *testing.T) {
|
||||
i0 := &testWrappedInst{}
|
||||
e0 := errors.New("Test wrap error")
|
||||
inst, err := metric.WrapInt64MeasureInstrument(i0, e0)
|
||||
|
||||
// Check that error passes through w/o modifying instrument.
|
||||
require.Equal(t, inst.Impl().(*testWrappedInst), i0)
|
||||
require.Equal(t, err, e0)
|
||||
|
||||
// Check that nil instrument is handled.
|
||||
inst, err = metric.WrapInt64MeasureInstrument(nil, e0)
|
||||
|
||||
require.Equal(t, err, e0)
|
||||
require.NotNil(t, inst)
|
||||
require.NotNil(t, inst.Impl())
|
||||
|
||||
// Check that nil instrument generates an error.
|
||||
inst, err = metric.WrapInt64MeasureInstrument(nil, nil)
|
||||
|
||||
require.NotNil(t, err)
|
||||
require.NotNil(t, inst)
|
||||
require.NotNil(t, inst.Impl())
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ package metric
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"go.opentelemetry.io/otel/api/core"
|
||||
)
|
||||
@ -28,6 +29,8 @@ type commonBoundInstrument struct {
|
||||
boundInstrument BoundInstrumentImpl
|
||||
}
|
||||
|
||||
var ErrSDKReturnedNilImpl = errors.New("SDK returned a nil implementation")
|
||||
|
||||
func (m commonMetric) bind(labels LabelSet) commonBoundInstrument {
|
||||
return newCommonBoundInstrument(m.instrument.Bind(labels))
|
||||
}
|
||||
@ -56,10 +59,21 @@ func (h commonBoundInstrument) Unbind() {
|
||||
h.boundInstrument.Unbind()
|
||||
}
|
||||
|
||||
func newCommonMetric(instrument InstrumentImpl) commonMetric {
|
||||
func newCommonMetric(instrument InstrumentImpl, err error) (commonMetric, error) {
|
||||
if instrument == nil {
|
||||
if err == nil {
|
||||
err = ErrSDKReturnedNilImpl
|
||||
}
|
||||
// Note: an alternate behavior would be to synthesize a new name
|
||||
// or group all duplicately-named instruments of a certain type
|
||||
// together and use a tag for the original name, e.g.,
|
||||
// name = 'invalid.counter.int64'
|
||||
// label = 'original-name=duplicate-counter-name'
|
||||
instrument = noopInstrument{}
|
||||
}
|
||||
return commonMetric{
|
||||
instrument: instrument,
|
||||
}
|
||||
}, err
|
||||
}
|
||||
|
||||
func newCommonBoundInstrument(boundInstrument BoundInstrumentImpl) commonBoundInstrument {
|
||||
|
88
api/metric/must.go
Normal file
88
api/metric/must.go
Normal file
@ -0,0 +1,88 @@
|
||||
// Copyright 2020, OpenTelemetry Authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package metric
|
||||
|
||||
// MeterMust is a wrapper for Meter interfaces that panics when any
|
||||
// instrument constructor encounters an error.
|
||||
type MeterMust struct {
|
||||
meter Meter
|
||||
}
|
||||
|
||||
// Must constructs a MeterMust implementation from a Meter, allowing
|
||||
// the application to panic when any instrument constructor yields an
|
||||
// error.
|
||||
func Must(meter Meter) MeterMust {
|
||||
return MeterMust{meter: meter}
|
||||
}
|
||||
|
||||
// NewInt64Counter calls `Meter.NewInt64Counter` and returns the
|
||||
// instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) NewInt64Counter(name string, cos ...CounterOptionApplier) Int64Counter {
|
||||
if inst, err := mm.meter.NewInt64Counter(name, cos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
||||
|
||||
// NewFloat64Counter calls `Meter.NewFloat64Counter` and returns the
|
||||
// instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) NewFloat64Counter(name string, cos ...CounterOptionApplier) Float64Counter {
|
||||
if inst, err := mm.meter.NewFloat64Counter(name, cos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
||||
|
||||
// NewInt64Measure calls `Meter.NewInt64Measure` and returns the
|
||||
// instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) NewInt64Measure(name string, mos ...MeasureOptionApplier) Int64Measure {
|
||||
if inst, err := mm.meter.NewInt64Measure(name, mos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
||||
|
||||
// NewFloat64Measure calls `Meter.NewFloat64Measure` and returns the
|
||||
// instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) NewFloat64Measure(name string, mos ...MeasureOptionApplier) Float64Measure {
|
||||
if inst, err := mm.meter.NewFloat64Measure(name, mos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
||||
|
||||
// RegisterInt64Observer calls `Meter.RegisterInt64Observer` and
|
||||
// returns the instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) RegisterInt64Observer(name string, callback Int64ObserverCallback, oos ...ObserverOptionApplier) Int64Observer {
|
||||
if inst, err := mm.meter.RegisterInt64Observer(name, callback, oos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
||||
|
||||
// RegisterFloat64Observer calls `Meter.RegisterFloat64Observer` and
|
||||
// returns the instrument, panicking if it encounters an error.
|
||||
func (mm MeterMust) RegisterFloat64Observer(name string, callback Float64ObserverCallback, oos ...ObserverOptionApplier) Float64Observer {
|
||||
if inst, err := mm.meter.RegisterFloat64Observer(name, callback, oos...); err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
return inst
|
||||
}
|
||||
}
|
@ -7,7 +7,10 @@ import (
|
||||
)
|
||||
|
||||
type NoopProvider struct{}
|
||||
type NoopMeter struct{}
|
||||
|
||||
type NoopMeter struct {
|
||||
}
|
||||
|
||||
type noopBoundInstrument struct{}
|
||||
type noopLabelSet struct{}
|
||||
type noopInstrument struct{}
|
||||
@ -53,29 +56,29 @@ func (NoopMeter) Labels(...core.KeyValue) LabelSet {
|
||||
return noopLabelSet{}
|
||||
}
|
||||
|
||||
func (NoopMeter) NewInt64Counter(name string, cos ...CounterOptionApplier) Int64Counter {
|
||||
return WrapInt64CounterInstrument(noopInstrument{})
|
||||
}
|
||||
|
||||
func (NoopMeter) NewFloat64Counter(name string, cos ...CounterOptionApplier) Float64Counter {
|
||||
return WrapFloat64CounterInstrument(noopInstrument{})
|
||||
}
|
||||
|
||||
func (NoopMeter) NewInt64Measure(name string, mos ...MeasureOptionApplier) Int64Measure {
|
||||
return WrapInt64MeasureInstrument(noopInstrument{})
|
||||
}
|
||||
|
||||
func (NoopMeter) NewFloat64Measure(name string, mos ...MeasureOptionApplier) Float64Measure {
|
||||
return WrapFloat64MeasureInstrument(noopInstrument{})
|
||||
}
|
||||
|
||||
func (NoopMeter) RecordBatch(context.Context, LabelSet, ...Measurement) {
|
||||
}
|
||||
|
||||
func (NoopMeter) RegisterInt64Observer(name string, callback Int64ObserverCallback, oos ...ObserverOptionApplier) Int64Observer {
|
||||
return noopInt64Observer{}
|
||||
func (NoopMeter) NewInt64Counter(name string, cos ...CounterOptionApplier) (Int64Counter, error) {
|
||||
return WrapInt64CounterInstrument(noopInstrument{}, nil)
|
||||
}
|
||||
|
||||
func (NoopMeter) RegisterFloat64Observer(name string, callback Float64ObserverCallback, oos ...ObserverOptionApplier) Float64Observer {
|
||||
return noopFloat64Observer{}
|
||||
func (NoopMeter) NewFloat64Counter(name string, cos ...CounterOptionApplier) (Float64Counter, error) {
|
||||
return WrapFloat64CounterInstrument(noopInstrument{}, nil)
|
||||
}
|
||||
|
||||
func (NoopMeter) NewInt64Measure(name string, mos ...MeasureOptionApplier) (Int64Measure, error) {
|
||||
return WrapInt64MeasureInstrument(noopInstrument{}, nil)
|
||||
}
|
||||
|
||||
func (NoopMeter) NewFloat64Measure(name string, mos ...MeasureOptionApplier) (Float64Measure, error) {
|
||||
return WrapFloat64MeasureInstrument(noopInstrument{}, nil)
|
||||
}
|
||||
|
||||
func (NoopMeter) RegisterInt64Observer(name string, callback Int64ObserverCallback, oos ...ObserverOptionApplier) (Int64Observer, error) {
|
||||
return noopInt64Observer{}, nil
|
||||
}
|
||||
|
||||
func (NoopMeter) RegisterFloat64Observer(name string, callback Float64ObserverCallback, oos ...ObserverOptionApplier) (Float64Observer, error) {
|
||||
return noopFloat64Observer{}, nil
|
||||
}
|
||||
|
@ -55,32 +55,36 @@ type BoundInstrumentImpl interface {
|
||||
// wrapper as an integral counter.
|
||||
//
|
||||
// It is mostly intended for SDKs.
|
||||
func WrapInt64CounterInstrument(instrument InstrumentImpl) Int64Counter {
|
||||
return Int64Counter{commonMetric: newCommonMetric(instrument)}
|
||||
func WrapInt64CounterInstrument(instrument InstrumentImpl, err error) (Int64Counter, error) {
|
||||
common, err := newCommonMetric(instrument, err)
|
||||
return Int64Counter{commonMetric: common}, err
|
||||
}
|
||||
|
||||
// WrapFloat64CounterInstrument wraps the instrument in the type-safe
|
||||
// wrapper as an floating point counter.
|
||||
//
|
||||
// It is mostly intended for SDKs.
|
||||
func WrapFloat64CounterInstrument(instrument InstrumentImpl) Float64Counter {
|
||||
return Float64Counter{commonMetric: newCommonMetric(instrument)}
|
||||
func WrapFloat64CounterInstrument(instrument InstrumentImpl, err error) (Float64Counter, error) {
|
||||
common, err := newCommonMetric(instrument, err)
|
||||
return Float64Counter{commonMetric: common}, err
|
||||
}
|
||||
|
||||
// WrapInt64MeasureInstrument wraps the instrument in the type-safe
|
||||
// wrapper as an integral measure.
|
||||
//
|
||||
// It is mostly intended for SDKs.
|
||||
func WrapInt64MeasureInstrument(instrument InstrumentImpl) Int64Measure {
|
||||
return Int64Measure{commonMetric: newCommonMetric(instrument)}
|
||||
func WrapInt64MeasureInstrument(instrument InstrumentImpl, err error) (Int64Measure, error) {
|
||||
common, err := newCommonMetric(instrument, err)
|
||||
return Int64Measure{commonMetric: common}, err
|
||||
}
|
||||
|
||||
// WrapFloat64MeasureInstrument wraps the instrument in the type-safe
|
||||
// wrapper as an floating point measure.
|
||||
//
|
||||
// It is mostly intended for SDKs.
|
||||
func WrapFloat64MeasureInstrument(instrument InstrumentImpl) Float64Measure {
|
||||
return Float64Measure{commonMetric: newCommonMetric(instrument)}
|
||||
func WrapFloat64MeasureInstrument(instrument InstrumentImpl, err error) (Float64Measure, error) {
|
||||
common, err := newCommonMetric(instrument, err)
|
||||
return Float64Measure{commonMetric: common}, err
|
||||
}
|
||||
|
||||
// ApplyCounterOptions is a helper that applies all the counter
|
||||
|
@ -67,9 +67,6 @@ func main() {
|
||||
defer initMeter().Stop()
|
||||
initTracer()
|
||||
|
||||
// Note: Have to get the meter and tracer after the global is
|
||||
// initialized. See OTEP 0005.
|
||||
|
||||
tracer := global.Tracer("ex.com/basic")
|
||||
meter := global.Meter("ex.com/basic")
|
||||
|
||||
@ -78,13 +75,13 @@ func main() {
|
||||
oneMetricCB := func(result metric.Float64ObserverResult) {
|
||||
result.Observe(1, commonLabels)
|
||||
}
|
||||
oneMetric := meter.RegisterFloat64Observer("ex.com.one", oneMetricCB,
|
||||
oneMetric := metric.Must(meter).RegisterFloat64Observer("ex.com.one", oneMetricCB,
|
||||
metric.WithKeys(fooKey, barKey, lemonsKey),
|
||||
metric.WithDescription("An observer set to 1.0"),
|
||||
)
|
||||
defer oneMetric.Unregister()
|
||||
|
||||
measureTwo := meter.NewFloat64Measure("ex.com.two")
|
||||
measureTwo := metric.Must(meter).NewFloat64Measure("ex.com.two")
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
|
@ -61,14 +61,14 @@ func main() {
|
||||
(*observerLock).RUnlock()
|
||||
result.Observe(value, labelset)
|
||||
}
|
||||
oneMetric := meter.RegisterFloat64Observer("ex.com.one", cb,
|
||||
oneMetric := metric.Must(meter).RegisterFloat64Observer("ex.com.one", cb,
|
||||
metric.WithKeys(fooKey, barKey, lemonsKey),
|
||||
metric.WithDescription("A measure set to 1.0"),
|
||||
)
|
||||
defer oneMetric.Unregister()
|
||||
|
||||
measureTwo := meter.NewFloat64Measure("ex.com.two", metric.WithKeys(key.New("A")))
|
||||
measureThree := meter.NewFloat64Counter("ex.com.three")
|
||||
measureTwo := metric.Must(meter).NewFloat64Measure("ex.com.two", metric.WithKeys(key.New("A")))
|
||||
measureThree := metric.Must(meter).NewFloat64Counter("ex.com.three")
|
||||
|
||||
commonLabels := meter.Labels(lemonsKey.Int(10), key.String("A", "1"), key.String("B", "2"), key.String("C", "3"))
|
||||
notSoCommonLabels := meter.Labels(lemonsKey.Int(13))
|
||||
|
@ -59,7 +59,7 @@ func ExampleNew() {
|
||||
meter := pusher.Meter("example")
|
||||
|
||||
// Create and update a single counter:
|
||||
counter := meter.NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
counter := metric.Must(meter).NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
labels := meter.Labels(key.String("value"))
|
||||
|
||||
counter.Add(ctx, 100, labels)
|
||||
|
@ -27,7 +27,7 @@ func ExampleNewExportPipeline() {
|
||||
meter := pusher.Meter("example")
|
||||
|
||||
// Create and update a single counter:
|
||||
counter := meter.NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
counter := metric.Must(meter).NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
labels := meter.Labels(key.String("value"))
|
||||
|
||||
counter.Add(ctx, 100, labels)
|
||||
|
@ -49,7 +49,7 @@ type (
|
||||
|
||||
MeterProvider struct {
|
||||
lock sync.Mutex
|
||||
registered map[string]*Meter
|
||||
registered map[string]apimetric.Meter
|
||||
}
|
||||
|
||||
Meter struct {
|
||||
@ -154,13 +154,9 @@ func doRecordBatch(ctx context.Context, labelSet *LabelSet, instrument *Instrume
|
||||
})
|
||||
}
|
||||
|
||||
func (s *LabelSet) Meter() apimetric.Meter {
|
||||
return s.TheMeter
|
||||
}
|
||||
|
||||
func NewProvider() *MeterProvider {
|
||||
return &MeterProvider{
|
||||
registered: map[string]*Meter{},
|
||||
registered: map[string]apimetric.Meter{},
|
||||
}
|
||||
}
|
||||
|
||||
@ -191,14 +187,14 @@ func (m *Meter) Labels(labels ...core.KeyValue) apimetric.LabelSet {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Meter) NewInt64Counter(name string, cos ...apimetric.CounterOptionApplier) apimetric.Int64Counter {
|
||||
func (m *Meter) NewInt64Counter(name string, cos ...apimetric.CounterOptionApplier) (apimetric.Int64Counter, error) {
|
||||
instrument := m.newCounterInstrument(name, core.Int64NumberKind, cos...)
|
||||
return apimetric.WrapInt64CounterInstrument(instrument)
|
||||
return apimetric.WrapInt64CounterInstrument(instrument, nil)
|
||||
}
|
||||
|
||||
func (m *Meter) NewFloat64Counter(name string, cos ...apimetric.CounterOptionApplier) apimetric.Float64Counter {
|
||||
func (m *Meter) NewFloat64Counter(name string, cos ...apimetric.CounterOptionApplier) (apimetric.Float64Counter, error) {
|
||||
instrument := m.newCounterInstrument(name, core.Float64NumberKind, cos...)
|
||||
return apimetric.WrapFloat64CounterInstrument(instrument)
|
||||
return apimetric.WrapFloat64CounterInstrument(instrument, nil)
|
||||
}
|
||||
|
||||
func (m *Meter) newCounterInstrument(name string, numberKind core.NumberKind, cos ...apimetric.CounterOptionApplier) *Instrument {
|
||||
@ -212,14 +208,14 @@ func (m *Meter) newCounterInstrument(name string, numberKind core.NumberKind, co
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Meter) NewInt64Measure(name string, mos ...apimetric.MeasureOptionApplier) apimetric.Int64Measure {
|
||||
func (m *Meter) NewInt64Measure(name string, mos ...apimetric.MeasureOptionApplier) (apimetric.Int64Measure, error) {
|
||||
instrument := m.newMeasureInstrument(name, core.Int64NumberKind, mos...)
|
||||
return apimetric.WrapInt64MeasureInstrument(instrument)
|
||||
return apimetric.WrapInt64MeasureInstrument(instrument, nil)
|
||||
}
|
||||
|
||||
func (m *Meter) NewFloat64Measure(name string, mos ...apimetric.MeasureOptionApplier) apimetric.Float64Measure {
|
||||
func (m *Meter) NewFloat64Measure(name string, mos ...apimetric.MeasureOptionApplier) (apimetric.Float64Measure, error) {
|
||||
instrument := m.newMeasureInstrument(name, core.Float64NumberKind, mos...)
|
||||
return apimetric.WrapFloat64MeasureInstrument(instrument)
|
||||
return apimetric.WrapFloat64MeasureInstrument(instrument, nil)
|
||||
}
|
||||
|
||||
func (m *Meter) newMeasureInstrument(name string, numberKind core.NumberKind, mos ...apimetric.MeasureOptionApplier) *Instrument {
|
||||
@ -233,9 +229,9 @@ func (m *Meter) newMeasureInstrument(name string, numberKind core.NumberKind, mo
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Meter) RegisterInt64Observer(name string, callback apimetric.Int64ObserverCallback, oos ...apimetric.ObserverOptionApplier) apimetric.Int64Observer {
|
||||
func (m *Meter) RegisterInt64Observer(name string, callback apimetric.Int64ObserverCallback, oos ...apimetric.ObserverOptionApplier) (apimetric.Int64Observer, error) {
|
||||
wrappedCallback := wrapInt64ObserverCallback(callback)
|
||||
return m.newObserver(name, wrappedCallback, core.Int64NumberKind, oos...)
|
||||
return m.newObserver(name, wrappedCallback, core.Int64NumberKind, oos...), nil
|
||||
}
|
||||
|
||||
func wrapInt64ObserverCallback(callback apimetric.Int64ObserverCallback) observerCallback {
|
||||
@ -250,9 +246,9 @@ func wrapInt64ObserverCallback(callback apimetric.Int64ObserverCallback) observe
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Meter) RegisterFloat64Observer(name string, callback apimetric.Float64ObserverCallback, oos ...apimetric.ObserverOptionApplier) apimetric.Float64Observer {
|
||||
func (m *Meter) RegisterFloat64Observer(name string, callback apimetric.Float64ObserverCallback, oos ...apimetric.ObserverOptionApplier) (apimetric.Float64Observer, error) {
|
||||
wrappedCallback := wrapFloat64ObserverCallback(callback)
|
||||
return m.newObserver(name, wrappedCallback, core.Float64NumberKind, oos...)
|
||||
return m.newObserver(name, wrappedCallback, core.Float64NumberKind, oos...), nil
|
||||
}
|
||||
|
||||
func wrapFloat64ObserverCallback(callback apimetric.Float64ObserverCallback) observerCallback {
|
||||
|
@ -33,8 +33,9 @@ import (
|
||||
)
|
||||
|
||||
type benchFixture struct {
|
||||
sdk *sdk.SDK
|
||||
B *testing.B
|
||||
meter metric.MeterMust
|
||||
sdk *sdk.SDK
|
||||
B *testing.B
|
||||
}
|
||||
|
||||
func newFixture(b *testing.B) *benchFixture {
|
||||
@ -43,6 +44,7 @@ func newFixture(b *testing.B) *benchFixture {
|
||||
B: b,
|
||||
}
|
||||
bf.sdk = sdk.New(bf, sdk.NewDefaultLabelEncoder())
|
||||
bf.meter = metric.Must(bf.sdk)
|
||||
return bf
|
||||
}
|
||||
|
||||
@ -140,7 +142,7 @@ func BenchmarkLabels_16(b *testing.B) {
|
||||
func BenchmarkAcquireNewHandle(b *testing.B) {
|
||||
fix := newFixture(b)
|
||||
labelSets := makeLabelSets(b.N)
|
||||
cnt := fix.sdk.NewInt64Counter("int64.counter")
|
||||
cnt := fix.meter.NewInt64Counter("int64.counter")
|
||||
labels := make([]metric.LabelSet, b.N)
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -157,7 +159,7 @@ func BenchmarkAcquireNewHandle(b *testing.B) {
|
||||
func BenchmarkAcquireExistingHandle(b *testing.B) {
|
||||
fix := newFixture(b)
|
||||
labelSets := makeLabelSets(b.N)
|
||||
cnt := fix.sdk.NewInt64Counter("int64.counter")
|
||||
cnt := fix.meter.NewInt64Counter("int64.counter")
|
||||
labels := make([]metric.LabelSet, b.N)
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -175,7 +177,7 @@ func BenchmarkAcquireExistingHandle(b *testing.B) {
|
||||
func BenchmarkAcquireReleaseExistingHandle(b *testing.B) {
|
||||
fix := newFixture(b)
|
||||
labelSets := makeLabelSets(b.N)
|
||||
cnt := fix.sdk.NewInt64Counter("int64.counter")
|
||||
cnt := fix.meter.NewInt64Counter("int64.counter")
|
||||
labels := make([]metric.LabelSet, b.N)
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -196,7 +198,7 @@ func BenchmarkInt64CounterAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
cnt := fix.sdk.NewInt64Counter("int64.counter")
|
||||
cnt := fix.meter.NewInt64Counter("int64.counter")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -209,7 +211,7 @@ func BenchmarkInt64CounterHandleAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
cnt := fix.sdk.NewInt64Counter("int64.counter")
|
||||
cnt := fix.meter.NewInt64Counter("int64.counter")
|
||||
handle := cnt.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -223,7 +225,7 @@ func BenchmarkFloat64CounterAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
cnt := fix.sdk.NewFloat64Counter("float64.counter")
|
||||
cnt := fix.meter.NewFloat64Counter("float64.counter")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -236,7 +238,7 @@ func BenchmarkFloat64CounterHandleAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
cnt := fix.sdk.NewFloat64Counter("float64.counter")
|
||||
cnt := fix.meter.NewFloat64Counter("float64.counter")
|
||||
handle := cnt.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -252,7 +254,7 @@ func BenchmarkInt64LastValueAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewInt64Measure("int64.lastvalue")
|
||||
mea := fix.meter.NewInt64Measure("int64.lastvalue")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -265,7 +267,7 @@ func BenchmarkInt64LastValueHandleAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewInt64Measure("int64.lastvalue")
|
||||
mea := fix.meter.NewInt64Measure("int64.lastvalue")
|
||||
handle := mea.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -279,7 +281,7 @@ func BenchmarkFloat64LastValueAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewFloat64Measure("float64.lastvalue")
|
||||
mea := fix.meter.NewFloat64Measure("float64.lastvalue")
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -292,7 +294,7 @@ func BenchmarkFloat64LastValueHandleAdd(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewFloat64Measure("float64.lastvalue")
|
||||
mea := fix.meter.NewFloat64Measure("float64.lastvalue")
|
||||
handle := mea.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -308,7 +310,7 @@ func benchmarkInt64MeasureAdd(b *testing.B, name string) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewInt64Measure(name)
|
||||
mea := fix.meter.NewInt64Measure(name)
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -321,7 +323,7 @@ func benchmarkInt64MeasureHandleAdd(b *testing.B, name string) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewInt64Measure(name)
|
||||
mea := fix.meter.NewInt64Measure(name)
|
||||
handle := mea.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -335,7 +337,7 @@ func benchmarkFloat64MeasureAdd(b *testing.B, name string) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewFloat64Measure(name)
|
||||
mea := fix.meter.NewFloat64Measure(name)
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
@ -348,7 +350,7 @@ func benchmarkFloat64MeasureHandleAdd(b *testing.B, name string) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
mea := fix.sdk.NewFloat64Measure(name)
|
||||
mea := fix.meter.NewFloat64Measure(name)
|
||||
handle := mea.Bind(labs)
|
||||
|
||||
b.ResetTimer()
|
||||
@ -371,7 +373,7 @@ func BenchmarkObserverRegistration(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
fix.sdk.RegisterInt64Observer(names[i], cb)
|
||||
fix.meter.RegisterInt64Observer(names[i], cb)
|
||||
}
|
||||
}
|
||||
|
||||
@ -386,7 +388,7 @@ func BenchmarkObserverRegistrationUnregistration(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
fix.sdk.RegisterInt64Observer(names[i], cb).Unregister()
|
||||
fix.meter.RegisterInt64Observer(names[i], cb).Unregister()
|
||||
}
|
||||
}
|
||||
|
||||
@ -402,7 +404,7 @@ func BenchmarkObserverRegistrationUnregistrationBatched(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
observers = append(observers, fix.sdk.RegisterInt64Observer(names[i], cb))
|
||||
observers = append(observers, fix.meter.RegisterInt64Observer(names[i], cb))
|
||||
}
|
||||
for i := 0; i < b.N; i++ {
|
||||
observers[i].Unregister()
|
||||
@ -413,7 +415,7 @@ func BenchmarkObserverObservationInt64(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
_ = fix.sdk.RegisterInt64Observer("test.observer", func(result metric.Int64ObserverResult) {
|
||||
_ = fix.meter.RegisterInt64Observer("test.observer", func(result metric.Int64ObserverResult) {
|
||||
b.StartTimer()
|
||||
defer b.StopTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
@ -429,7 +431,7 @@ func BenchmarkObserverObservationFloat64(b *testing.B) {
|
||||
ctx := context.Background()
|
||||
fix := newFixture(b)
|
||||
labs := fix.sdk.Labels(makeLabels(1)...)
|
||||
_ = fix.sdk.RegisterFloat64Observer("test.observer", func(result metric.Float64ObserverResult) {
|
||||
_ = fix.meter.RegisterFloat64Observer("test.observer", func(result metric.Float64ObserverResult) {
|
||||
b.StartTimer()
|
||||
defer b.StopTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
|
@ -25,6 +25,7 @@ import (
|
||||
"github.com/benbjohnson/clock"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"go.opentelemetry.io/otel/api/metric"
|
||||
"go.opentelemetry.io/otel/exporters/metric/test"
|
||||
export "go.opentelemetry.io/otel/sdk/export/metric"
|
||||
"go.opentelemetry.io/otel/sdk/export/metric/aggregator"
|
||||
@ -178,7 +179,7 @@ func TestPushTicker(t *testing.T) {
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
counter := meter.NewInt64Counter("counter")
|
||||
counter := metric.Must(meter).NewInt64Counter("counter")
|
||||
|
||||
p.Start()
|
||||
|
||||
|
@ -33,6 +33,8 @@ import (
|
||||
"go.opentelemetry.io/otel/sdk/metric/aggregator/counter"
|
||||
)
|
||||
|
||||
var Must = metric.Must
|
||||
|
||||
type correctnessBatcher struct {
|
||||
t *testing.T
|
||||
|
||||
@ -82,7 +84,7 @@ func TestInputRangeTestCounter(t *testing.T) {
|
||||
sdkErr = handleErr
|
||||
})
|
||||
|
||||
counter := sdk.NewInt64Counter("name.counter", metric.WithMonotonic(true))
|
||||
counter := Must(sdk).NewInt64Counter("name.counter", metric.WithMonotonic(true))
|
||||
|
||||
counter.Add(ctx, -1, sdk.Labels())
|
||||
require.Equal(t, aggregator.ErrNegativeInput, sdkErr)
|
||||
@ -116,7 +118,7 @@ func TestInputRangeTestMeasure(t *testing.T) {
|
||||
sdkErr = handleErr
|
||||
})
|
||||
|
||||
measure := sdk.NewFloat64Measure("name.measure", metric.WithAbsolute(true))
|
||||
measure := Must(sdk).NewFloat64Measure("name.measure", metric.WithAbsolute(true))
|
||||
|
||||
measure.Record(ctx, -1, sdk.Labels())
|
||||
require.Equal(t, aggregator.ErrNegativeInput, sdkErr)
|
||||
@ -147,7 +149,7 @@ func TestDisabledInstrument(t *testing.T) {
|
||||
t: t,
|
||||
}
|
||||
sdk := sdk.New(batcher, sdk.NewDefaultLabelEncoder())
|
||||
measure := sdk.NewFloat64Measure("name.disabled", metric.WithAbsolute(true))
|
||||
measure := Must(sdk).NewFloat64Measure("name.disabled", metric.WithAbsolute(true))
|
||||
|
||||
measure.Record(ctx, -1, sdk.Labels())
|
||||
checkpointed := sdk.Collect(ctx)
|
||||
@ -167,7 +169,7 @@ func TestRecordNaN(t *testing.T) {
|
||||
sdk.SetErrorHandler(func(handleErr error) {
|
||||
sdkErr = handleErr
|
||||
})
|
||||
c := sdk.NewFloat64Counter("counter.name")
|
||||
c := Must(sdk).NewFloat64Counter("counter.name")
|
||||
|
||||
require.Nil(t, sdkErr)
|
||||
c.Add(ctx, math.NaN(), sdk.Labels())
|
||||
@ -181,7 +183,7 @@ func TestSDKAltLabelEncoder(t *testing.T) {
|
||||
}
|
||||
sdk := sdk.New(batcher, testLabelEncoder{})
|
||||
|
||||
measure := sdk.NewFloat64Measure("measure")
|
||||
measure := Must(sdk).NewFloat64Measure("measure")
|
||||
measure.Record(ctx, 1, sdk.Labels(key.String("A", "B"), key.String("C", "D")))
|
||||
|
||||
sdk.Collect(ctx)
|
||||
@ -199,7 +201,7 @@ func TestSDKLabelsDeduplication(t *testing.T) {
|
||||
}
|
||||
sdk := sdk.New(batcher, sdk.NewDefaultLabelEncoder())
|
||||
|
||||
counter := sdk.NewInt64Counter("counter")
|
||||
counter := Must(sdk).NewInt64Counter("counter")
|
||||
|
||||
const (
|
||||
maxKeys = 21
|
||||
|
@ -39,7 +39,7 @@ func ExampleNew() {
|
||||
key := key.New("key")
|
||||
meter := pusher.Meter("example")
|
||||
|
||||
counter := meter.NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
counter := metric.Must(meter).NewInt64Counter("a.counter", metric.WithKeys(key))
|
||||
labels := meter.Labels(key.String("value"))
|
||||
|
||||
counter.Add(ctx, 100, labels)
|
||||
|
@ -492,23 +492,23 @@ func (m *SDK) newMeasureInstrument(name string, numberKind core.NumberKind, mos
|
||||
return m.newInstrument(name, export.MeasureKind, numberKind, &opts)
|
||||
}
|
||||
|
||||
func (m *SDK) NewInt64Counter(name string, cos ...api.CounterOptionApplier) api.Int64Counter {
|
||||
return api.WrapInt64CounterInstrument(m.newCounterInstrument(name, core.Int64NumberKind, cos...))
|
||||
func (m *SDK) NewInt64Counter(name string, cos ...api.CounterOptionApplier) (api.Int64Counter, error) {
|
||||
return api.WrapInt64CounterInstrument(m.newCounterInstrument(name, core.Int64NumberKind, cos...), nil)
|
||||
}
|
||||
|
||||
func (m *SDK) NewFloat64Counter(name string, cos ...api.CounterOptionApplier) api.Float64Counter {
|
||||
return api.WrapFloat64CounterInstrument(m.newCounterInstrument(name, core.Float64NumberKind, cos...))
|
||||
func (m *SDK) NewFloat64Counter(name string, cos ...api.CounterOptionApplier) (api.Float64Counter, error) {
|
||||
return api.WrapFloat64CounterInstrument(m.newCounterInstrument(name, core.Float64NumberKind, cos...), nil)
|
||||
}
|
||||
|
||||
func (m *SDK) NewInt64Measure(name string, mos ...api.MeasureOptionApplier) api.Int64Measure {
|
||||
return api.WrapInt64MeasureInstrument(m.newMeasureInstrument(name, core.Int64NumberKind, mos...))
|
||||
func (m *SDK) NewInt64Measure(name string, mos ...api.MeasureOptionApplier) (api.Int64Measure, error) {
|
||||
return api.WrapInt64MeasureInstrument(m.newMeasureInstrument(name, core.Int64NumberKind, mos...), nil)
|
||||
}
|
||||
|
||||
func (m *SDK) NewFloat64Measure(name string, mos ...api.MeasureOptionApplier) api.Float64Measure {
|
||||
return api.WrapFloat64MeasureInstrument(m.newMeasureInstrument(name, core.Float64NumberKind, mos...))
|
||||
func (m *SDK) NewFloat64Measure(name string, mos ...api.MeasureOptionApplier) (api.Float64Measure, error) {
|
||||
return api.WrapFloat64MeasureInstrument(m.newMeasureInstrument(name, core.Float64NumberKind, mos...), nil)
|
||||
}
|
||||
|
||||
func (m *SDK) RegisterInt64Observer(name string, callback api.Int64ObserverCallback, oos ...api.ObserverOptionApplier) api.Int64Observer {
|
||||
func (m *SDK) RegisterInt64Observer(name string, callback api.Int64ObserverCallback, oos ...api.ObserverOptionApplier) (api.Int64Observer, error) {
|
||||
if callback == nil {
|
||||
return api.NoopMeter{}.RegisterInt64Observer("", nil)
|
||||
}
|
||||
@ -519,7 +519,7 @@ func (m *SDK) RegisterInt64Observer(name string, callback api.Int64ObserverCallb
|
||||
obs := m.newObserver(descriptor, cb)
|
||||
return int64Observer{
|
||||
observer: obs,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
func wrapInt64ObserverCallback(callback api.Int64ObserverCallback) observerCallback {
|
||||
@ -531,7 +531,7 @@ func wrapInt64ObserverCallback(callback api.Int64ObserverCallback) observerCallb
|
||||
}
|
||||
}
|
||||
|
||||
func (m *SDK) RegisterFloat64Observer(name string, callback api.Float64ObserverCallback, oos ...api.ObserverOptionApplier) api.Float64Observer {
|
||||
func (m *SDK) RegisterFloat64Observer(name string, callback api.Float64ObserverCallback, oos ...api.ObserverOptionApplier) (api.Float64Observer, error) {
|
||||
if callback == nil {
|
||||
return api.NoopMeter{}.RegisterFloat64Observer("", nil)
|
||||
}
|
||||
@ -542,7 +542,7 @@ func (m *SDK) RegisterFloat64Observer(name string, callback api.Float64ObserverC
|
||||
obs := m.newObserver(descriptor, cb)
|
||||
return float64Observer{
|
||||
observer: obs,
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
||||
func wrapFloat64ObserverCallback(callback api.Float64ObserverCallback) observerCallback {
|
||||
|
@ -339,7 +339,7 @@ func float64sEqual(a, b core.Number) bool {
|
||||
func intCounterTestImpl(nonMonotonic bool) testImpl {
|
||||
return testImpl{
|
||||
newInstrument: func(meter api.Meter, name string) withImpl {
|
||||
return meter.NewInt64Counter(name+".counter", api.WithMonotonic(!nonMonotonic))
|
||||
return Must(meter).NewInt64Counter(name+".counter", api.WithMonotonic(!nonMonotonic))
|
||||
},
|
||||
getUpdateValue: func() core.Number {
|
||||
var offset int64
|
||||
@ -385,7 +385,7 @@ func TestStressInt64CounterNonMonotonic(t *testing.T) {
|
||||
func floatCounterTestImpl(nonMonotonic bool) testImpl {
|
||||
return testImpl{
|
||||
newInstrument: func(meter api.Meter, name string) withImpl {
|
||||
return meter.NewFloat64Counter(name+".counter", api.WithMonotonic(!nonMonotonic))
|
||||
return Must(meter).NewFloat64Counter(name+".counter", api.WithMonotonic(!nonMonotonic))
|
||||
},
|
||||
getUpdateValue: func() core.Number {
|
||||
var offset float64
|
||||
@ -433,7 +433,7 @@ func TestStressFloat64CounterNonMonotonic(t *testing.T) {
|
||||
func intLastValueTestImpl() testImpl {
|
||||
return testImpl{
|
||||
newInstrument: func(meter api.Meter, name string) withImpl {
|
||||
return meter.NewInt64Measure(name+".lastvalue", metric.WithAbsolute(false))
|
||||
return Must(meter).NewInt64Measure(name+".lastvalue", metric.WithAbsolute(false))
|
||||
},
|
||||
getUpdateValue: func() core.Number {
|
||||
r1 := rand.Int63()
|
||||
@ -475,7 +475,7 @@ func TestStressInt64LastValue(t *testing.T) {
|
||||
func floatLastValueTestImpl() testImpl {
|
||||
return testImpl{
|
||||
newInstrument: func(meter api.Meter, name string) withImpl {
|
||||
return meter.NewFloat64Measure(name+".lastvalue", metric.WithAbsolute(false))
|
||||
return Must(meter).NewFloat64Measure(name+".lastvalue", metric.WithAbsolute(false))
|
||||
},
|
||||
getUpdateValue: func() core.Number {
|
||||
return core.NewFloat64Number((-0.5 + rand.Float64()) * 100000)
|
||||
|
Loading…
Reference in New Issue
Block a user