mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2025-01-26 03:52:03 +02:00
481f4983f7
Part of https://github.com/open-telemetry/opentelemetry-go/issues/5249 This makes all existing types designed to implement the public Exemplar API public by moving most of `internal/exemplar` to `exemplar`. The only types that are not being made public are `exemplar.Drop`, and `exemplar.FilteredReservoir`. Those types are moved to `internal/aggregate`, and are renamed to `DropReservoir` and `FilteredExemplarReservoir`. The following types are made public: * `exemplar.Exemplar` * `exemplar.Filter` * `exemplar.SampledFilter` * `exemplar.AlwaysOnFilter` * `exemplar.HistogramReservoir` * `exemplar.FixedSizeReservoir` * `exemplar.Reservoir` * `exemplar.Value` * `exemplar.ValueType`
43 lines
1.0 KiB
Go
43 lines
1.0 KiB
Go
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"go.opentelemetry.io/otel/sdk/metric/exemplar"
|
|
"go.opentelemetry.io/otel/sdk/metric/metricdata"
|
|
)
|
|
|
|
var exemplarPool = sync.Pool{
|
|
New: func() any { return new([]exemplar.Exemplar) },
|
|
}
|
|
|
|
func collectExemplars[N int64 | float64](out *[]metricdata.Exemplar[N], f func(*[]exemplar.Exemplar)) {
|
|
dest := exemplarPool.Get().(*[]exemplar.Exemplar)
|
|
defer func() {
|
|
*dest = (*dest)[:0]
|
|
exemplarPool.Put(dest)
|
|
}()
|
|
|
|
*dest = reset(*dest, len(*out), cap(*out))
|
|
|
|
f(dest)
|
|
|
|
*out = reset(*out, len(*dest), cap(*dest))
|
|
for i, e := range *dest {
|
|
(*out)[i].FilteredAttributes = e.FilteredAttributes
|
|
(*out)[i].Time = e.Time
|
|
(*out)[i].SpanID = e.SpanID
|
|
(*out)[i].TraceID = e.TraceID
|
|
|
|
switch e.Value.Type() {
|
|
case exemplar.Int64ValueType:
|
|
(*out)[i].Value = N(e.Value.Int64())
|
|
case exemplar.Float64ValueType:
|
|
(*out)[i].Value = N(e.Value.Float64())
|
|
}
|
|
}
|
|
}
|