You've already forked opentelemetry-go
mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-11-25 22:41:46 +02:00
Create metric API Callback type (#3564)
* Create metric API Callback type Document the type according the OTel specification requirements. * Update all impls of the metric API with new type * Add changes to changelog * Update PR number in changelog entry
This commit is contained in:
@@ -13,6 +13,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
- Return a `Registration` from the `RegisterCallback` method of a `Meter` in the `go.opentelemetry.io/otel/metric` package.
|
- Return a `Registration` from the `RegisterCallback` method of a `Meter` in the `go.opentelemetry.io/otel/metric` package.
|
||||||
This `Registration` can be used to unregister callbacks. (#3522)
|
This `Registration` can be used to unregister callbacks. (#3522)
|
||||||
- Add `Producer` interface and `Reader.RegisterProducer(Producer)` to `go.opentelemetry.io/otel/sdk/metric` to enable external metric Producers. (#3524)
|
- Add `Producer` interface and `Reader.RegisterProducer(Producer)` to `go.opentelemetry.io/otel/sdk/metric` to enable external metric Producers. (#3524)
|
||||||
|
- Add the `Callback` function type to the `go.opentelemetry.io/otel/metric` package.
|
||||||
|
This new named function type is registered with a `Meter`. (#3564)
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
@@ -52,6 +54,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|||||||
- `InstrumentKindAsyncCounter` is renamed to `InstrumentKindObservableCounter`
|
- `InstrumentKindAsyncCounter` is renamed to `InstrumentKindObservableCounter`
|
||||||
- `InstrumentKindAsyncUpDownCounter` is renamed to `InstrumentKindObservableUpDownCounter`
|
- `InstrumentKindAsyncUpDownCounter` is renamed to `InstrumentKindObservableUpDownCounter`
|
||||||
- `InstrumentKindAsyncGauge` is renamed to `InstrumentKindObservableGauge`
|
- `InstrumentKindAsyncGauge` is renamed to `InstrumentKindObservableGauge`
|
||||||
|
- Update the `RegisterCallback` method of the `Meter` in the `go.opentelemetry.io/otel/sdk/metric` package to accept the added `Callback` type instead of an inline function type definition.
|
||||||
|
The underlying type of a `Callback` is the same `func(context.Context)` that the method used to accept. (#3564)
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
|
|
||||||
|
|||||||
@@ -283,7 +283,7 @@ func (m *meter) Float64ObservableGauge(name string, options ...instrument.Option
|
|||||||
//
|
//
|
||||||
// It is only valid to call Observe within the scope of the passed function,
|
// It is only valid to call Observe within the scope of the passed function,
|
||||||
// and only on the instruments that were registered with this call.
|
// and only on the instruments that were registered with this call.
|
||||||
func (m *meter) RegisterCallback(insts []instrument.Asynchronous, f func(context.Context)) (metric.Registration, error) {
|
func (m *meter) RegisterCallback(insts []instrument.Asynchronous, f metric.Callback) (metric.Registration, error) {
|
||||||
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
if del, ok := m.delegate.Load().(metric.Meter); ok {
|
||||||
insts = unwrapInstruments(insts)
|
insts = unwrapInstruments(insts)
|
||||||
return del.RegisterCallback(insts, f)
|
return del.RegisterCallback(insts, f)
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ func (m *testMeter) Float64ObservableGauge(name string, options ...instrument.Op
|
|||||||
//
|
//
|
||||||
// It is only valid to call Observe within the scope of the passed function,
|
// It is only valid to call Observe within the scope of the passed function,
|
||||||
// and only on the instruments that were registered with this call.
|
// and only on the instruments that were registered with this call.
|
||||||
func (m *testMeter) RegisterCallback(i []instrument.Asynchronous, f func(context.Context)) (metric.Registration, error) {
|
func (m *testMeter) RegisterCallback(i []instrument.Asynchronous, f metric.Callback) (metric.Registration, error) {
|
||||||
m.callbacks = append(m.callbacks, f)
|
m.callbacks = append(m.callbacks, f)
|
||||||
return testReg{
|
return testReg{
|
||||||
f: func(idx int) func() {
|
f: func(idx int) func() {
|
||||||
|
|||||||
@@ -106,9 +106,22 @@ type Meter interface {
|
|||||||
//
|
//
|
||||||
// If no instruments are passed, f should not be registered nor called
|
// If no instruments are passed, f should not be registered nor called
|
||||||
// during collection.
|
// during collection.
|
||||||
RegisterCallback(instruments []instrument.Asynchronous, f func(context.Context)) (Registration, error)
|
RegisterCallback(instruments []instrument.Asynchronous, f Callback) (Registration, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Callback is a function registered with a Meter that makes observations for
|
||||||
|
// the set of instruments it is registered with.
|
||||||
|
//
|
||||||
|
// The function needs to complete in a finite amount of time and the deadline
|
||||||
|
// of the passed context is expected to be honored.
|
||||||
|
//
|
||||||
|
// The function needs to make unique observations across all registered
|
||||||
|
// Callbacks. Meaning, it should not report measurements for an instrument with
|
||||||
|
// the same attributes as another Callback will report.
|
||||||
|
//
|
||||||
|
// The function needs to be concurrent safe.
|
||||||
|
type Callback func(context.Context)
|
||||||
|
|
||||||
// Registration is an token representing the unique registration of a callback
|
// Registration is an token representing the unique registration of a callback
|
||||||
// for a set of instruments with a Meter.
|
// for a set of instruments with a Meter.
|
||||||
type Registration interface {
|
type Registration interface {
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ func (noopMeter) Float64ObservableGauge(string, ...instrument.Option) (asyncfloa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RegisterCallback creates a register callback that does not record any metrics.
|
// RegisterCallback creates a register callback that does not record any metrics.
|
||||||
func (noopMeter) RegisterCallback([]instrument.Asynchronous, func(context.Context)) (Registration, error) {
|
func (noopMeter) RegisterCallback([]instrument.Asynchronous, Callback) (Registration, error) {
|
||||||
return noopReg{}, nil
|
return noopReg{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,6 @@
|
|||||||
package metric // import "go.opentelemetry.io/otel/sdk/metric"
|
package metric // import "go.opentelemetry.io/otel/sdk/metric"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
|
|
||||||
"go.opentelemetry.io/otel/metric"
|
"go.opentelemetry.io/otel/metric"
|
||||||
"go.opentelemetry.io/otel/metric/instrument"
|
"go.opentelemetry.io/otel/metric/instrument"
|
||||||
"go.opentelemetry.io/otel/metric/instrument/asyncfloat64"
|
"go.opentelemetry.io/otel/metric/instrument/asyncfloat64"
|
||||||
@@ -143,7 +141,7 @@ func (m *meter) Float64ObservableGauge(name string, options ...instrument.Option
|
|||||||
|
|
||||||
// RegisterCallback registers the function f to be called when any of the
|
// RegisterCallback registers the function f to be called when any of the
|
||||||
// insts Collect method is called.
|
// insts Collect method is called.
|
||||||
func (m *meter) RegisterCallback(insts []instrument.Asynchronous, f func(context.Context)) (metric.Registration, error) {
|
func (m *meter) RegisterCallback(insts []instrument.Asynchronous, f metric.Callback) (metric.Registration, error) {
|
||||||
for _, inst := range insts {
|
for _, inst := range insts {
|
||||||
// Only register if at least one instrument has a non-drop aggregation.
|
// Only register if at least one instrument has a non-drop aggregation.
|
||||||
// Otherwise, calling f during collection will be wasted computation.
|
// Otherwise, calling f during collection will be wasted computation.
|
||||||
@@ -174,9 +172,7 @@ func (noopRegister) Unregister() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type callback func(context.Context)
|
func (m *meter) registerCallback(c metric.Callback) (metric.Registration, error) {
|
||||||
|
|
||||||
func (m *meter) registerCallback(c callback) (metric.Registration, error) {
|
|
||||||
return m.pipes.registerCallback(c), nil
|
return m.pipes.registerCallback(c), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ func (p *pipeline) addSync(scope instrumentation.Scope, iSync instrumentSync) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// addCallback registers a callback to be run when `produce()` is called.
|
// addCallback registers a callback to be run when `produce()` is called.
|
||||||
func (p *pipeline) addCallback(c callback) (unregister func()) {
|
func (p *pipeline) addCallback(c metric.Callback) (unregister func()) {
|
||||||
p.Lock()
|
p.Lock()
|
||||||
defer p.Unlock()
|
defer p.Unlock()
|
||||||
e := p.callbacks.PushBack(c)
|
e := p.callbacks.PushBack(c)
|
||||||
@@ -126,7 +126,7 @@ func (p *pipeline) produce(ctx context.Context) (metricdata.ResourceMetrics, err
|
|||||||
|
|
||||||
for e := p.callbacks.Front(); e != nil; e = e.Next() {
|
for e := p.callbacks.Front(); e != nil; e = e.Next() {
|
||||||
// TODO make the callbacks parallel. ( #3034 )
|
// TODO make the callbacks parallel. ( #3034 )
|
||||||
f := e.Value.(callback)
|
f := e.Value.(metric.Callback)
|
||||||
f(ctx)
|
f(ctx)
|
||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
// This means the context expired before we finished running callbacks.
|
// This means the context expired before we finished running callbacks.
|
||||||
@@ -447,7 +447,7 @@ func newPipelines(res *resource.Resource, readers []Reader, views []View) pipeli
|
|||||||
return pipes
|
return pipes
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p pipelines) registerCallback(c callback) metric.Registration {
|
func (p pipelines) registerCallback(c metric.Callback) metric.Registration {
|
||||||
unregs := make([]func(), len(p))
|
unregs := make([]func(), len(p))
|
||||||
for i, pipe := range p {
|
for i, pipe := range p {
|
||||||
unregs[i] = pipe.addCallback(c)
|
unregs[i] = pipe.addCallback(c)
|
||||||
|
|||||||
Reference in New Issue
Block a user