mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-12-02 08:32:45 +00:00
54 lines
2.1 KiB
Go
54 lines
2.1 KiB
Go
|
// Copyright The 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 aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate"
|
||
|
|
||
|
import "go.opentelemetry.io/otel/attribute"
|
||
|
|
||
|
// overflowSet is the attribute set used to record a measurement when adding
|
||
|
// another distinct attribute set to the aggregate would exceed the aggregate
|
||
|
// limit.
|
||
|
var overflowSet = attribute.NewSet(attribute.Bool("otel.metric.overflow", true))
|
||
|
|
||
|
// limiter limits aggregate values.
|
||
|
type limiter[V any] struct {
|
||
|
// aggLimit is the maximum number of metric streams that can be aggregated.
|
||
|
//
|
||
|
// Any metric stream with attributes distinct from any set already
|
||
|
// aggregated once the aggLimit will be meet will instead be aggregated
|
||
|
// into an "overflow" metric stream. That stream will only contain the
|
||
|
// "otel.metric.overflow"=true attribute.
|
||
|
aggLimit int
|
||
|
}
|
||
|
|
||
|
// newLimiter returns a new Limiter with the provided aggregation limit.
|
||
|
func newLimiter[V any](aggregation int) limiter[V] {
|
||
|
return limiter[V]{aggLimit: aggregation}
|
||
|
}
|
||
|
|
||
|
// Attributes checks if adding a measurement for attrs will exceed the
|
||
|
// aggregation cardinality limit for the existing measurements. If it will,
|
||
|
// overflowSet is returned. Otherwise, if it will not exceed the limit, or the
|
||
|
// limit is not set (limit <= 0), attr is returned.
|
||
|
func (l limiter[V]) Attributes(attrs attribute.Set, measurements map[attribute.Set]V) attribute.Set {
|
||
|
if l.aggLimit > 0 {
|
||
|
_, exists := measurements[attrs]
|
||
|
if !exists && len(measurements) >= l.aggLimit-1 {
|
||
|
return overflowSet
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return attrs
|
||
|
}
|