diff --git a/pkg/opentelemetry/gauge.go b/pkg/opentelemetry/gauge.go deleted file mode 100644 index 7dc60e7..0000000 --- a/pkg/opentelemetry/gauge.go +++ /dev/null @@ -1,67 +0,0 @@ -package opentelemetry - -import ( - "context" - "errors" - "fmt" - "sync" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" -) - -// NewFloat64Gauge returns a new Float64Gauge. -func NewFloat64Gauge() *Float64Gauge { - return &Float64Gauge{} -} - -// Float64Gauge is a temporary implementation of the OpenTelemetry sync gauge -// it will be replaced by the official implementation once it's available. -// -// https://github.com/open-telemetry/opentelemetry-go/issues/3984 -type Float64Gauge struct { - observations sync.Map -} - -// Callback implements the callback function for the underlying asynchronous gauge -// it observes the current state of all previous Set() calls. -func (f *Float64Gauge) Callback(_ context.Context, o metric.Float64Observer) error { - var err error - - f.observations.Range(func(key, value interface{}) bool { - var v float64 - - // TODO: improve type assertion - switch val := value.(type) { - case float64: - v = val - case int64: - v = float64(val) - default: - err = errors.New("unexpected type for value " + fmt.Sprintf("%T", val)) - return false - } - - attrs, ok := key.(attribute.Set) - if !ok { - err = errors.New("unexpected type for key") - return false - } - - o.Observe(v, metric.WithAttributeSet(attrs)) - - return true - }) - - return err -} - -// Set sets the value of the gauge. -func (f *Float64Gauge) Set(val float64, attrs attribute.Set) { - f.observations.Store(attrs, val) -} - -// Delete deletes the gauge. -func (f *Float64Gauge) Delete(attrs attribute.Set) { - f.observations.Delete(attrs) -} diff --git a/pkg/opentelemetry/output.go b/pkg/opentelemetry/output.go index 65ec406..2795e7f 100644 --- a/pkg/opentelemetry/output.go +++ b/pkg/opentelemetry/output.go @@ -164,7 +164,7 @@ func (o *Output) dispatch(entry metrics.Sample) error { return err } - gauge.Set(entry.Value, attributeSet) + gauge.Record(ctx, entry.Value, attributeSetOpt) case metrics.Trend: trend, err := o.metricsRegistry.getOrCreateHistogram(name, unit) if err != nil { diff --git a/pkg/opentelemetry/registry.go b/pkg/opentelemetry/registry.go index d31217d..ed0420c 100644 --- a/pkg/opentelemetry/registry.go +++ b/pkg/opentelemetry/registry.go @@ -125,32 +125,27 @@ func (r *registry) getOrCreateCountersForRate(name string) (otelMetric.Int64Coun return nonZeroCounter, totalCounter, nil } -func (r *registry) getOrCreateGauge(name, unit string) (*Float64Gauge, error) { +func (r *registry) getOrCreateGauge(name, unit string) (otelMetric.Float64Gauge, error) { if gauge, ok := r.gauges.Load(name); ok { - if v, ok := gauge.(*Float64Gauge); ok { + if v, ok := gauge.(otelMetric.Float64Gauge); ok { return v, nil } return nil, fmt.Errorf("metric %q is not a gauge", name) } - g := NewFloat64Gauge() - - opts := []otelMetric.Float64ObservableGaugeOption{ - otelMetric.WithFloat64Callback(g.Callback), - } - + opts := []otelMetric.Float64GaugeOption{} if unit != "" { opts = append(opts, otelMetric.WithUnit(unit)) } - _, err := r.meter.Float64ObservableGauge(name, opts...) + gauge, err := r.meter.Float64Gauge(name, opts...) if err != nil { return nil, fmt.Errorf("failed to create gauge for %q: %w", name, err) } r.logger.Debugf("registered gauge metric %q ", name) - r.gauges.Store(name, g) - return g, nil + r.gauges.Store(name, gauge) + return gauge, nil }