2023-11-20 15:43:55 +00:00
|
|
|
// 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 metricdata // import "go.opentelemetry.io/otel/sdk/metric/metricdata"
|
|
|
|
|
|
|
|
import (
|
2024-03-11 14:34:34 +00:00
|
|
|
"encoding/json"
|
2023-11-20 15:43:55 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
|
|
"go.opentelemetry.io/otel/sdk/instrumentation"
|
|
|
|
"go.opentelemetry.io/otel/sdk/resource"
|
|
|
|
)
|
|
|
|
|
|
|
|
// ResourceMetrics is a collection of ScopeMetrics and the associated Resource
|
|
|
|
// that created them.
|
|
|
|
type ResourceMetrics struct {
|
|
|
|
// Resource represents the entity that collected the metrics.
|
|
|
|
Resource *resource.Resource
|
|
|
|
// ScopeMetrics are the collection of metrics with unique Scopes.
|
|
|
|
ScopeMetrics []ScopeMetrics
|
|
|
|
}
|
|
|
|
|
|
|
|
// ScopeMetrics is a collection of Metrics Produces by a Meter.
|
|
|
|
type ScopeMetrics struct {
|
|
|
|
// Scope is the Scope that the Meter was created with.
|
|
|
|
Scope instrumentation.Scope
|
|
|
|
// Metrics are a list of aggregations created by the Meter.
|
|
|
|
Metrics []Metrics
|
|
|
|
}
|
|
|
|
|
|
|
|
// Metrics is a collection of one or more aggregated timeseries from an Instrument.
|
|
|
|
type Metrics struct {
|
|
|
|
// Name is the name of the Instrument that created this data.
|
|
|
|
Name string
|
|
|
|
// Description is the description of the Instrument, which can be used in documentation.
|
|
|
|
Description string
|
|
|
|
// Unit is the unit in which the Instrument reports.
|
|
|
|
Unit string
|
|
|
|
// Data is the aggregated data from an Instrument.
|
|
|
|
Data Aggregation
|
|
|
|
}
|
|
|
|
|
|
|
|
// Aggregation is the store of data reported by an Instrument.
|
|
|
|
// It will be one of: Gauge, Sum, Histogram.
|
|
|
|
type Aggregation interface {
|
|
|
|
privateAggregation()
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gauge represents a measurement of the current value of an instrument.
|
|
|
|
type Gauge[N int64 | float64] struct {
|
|
|
|
// DataPoints are the individual aggregated measurements with unique
|
|
|
|
// Attributes.
|
|
|
|
DataPoints []DataPoint[N]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (Gauge[N]) privateAggregation() {}
|
|
|
|
|
|
|
|
// Sum represents the sum of all measurements of values from an instrument.
|
|
|
|
type Sum[N int64 | float64] struct {
|
|
|
|
// DataPoints are the individual aggregated measurements with unique
|
|
|
|
// Attributes.
|
|
|
|
DataPoints []DataPoint[N]
|
|
|
|
// Temporality describes if the aggregation is reported as the change from the
|
|
|
|
// last report time, or the cumulative changes since a fixed start time.
|
|
|
|
Temporality Temporality
|
|
|
|
// IsMonotonic represents if this aggregation only increases or decreases.
|
|
|
|
IsMonotonic bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func (Sum[N]) privateAggregation() {}
|
|
|
|
|
|
|
|
// DataPoint is a single data point in a timeseries.
|
|
|
|
type DataPoint[N int64 | float64] struct {
|
|
|
|
// Attributes is the set of key value pairs that uniquely identify the
|
|
|
|
// timeseries.
|
|
|
|
Attributes attribute.Set
|
|
|
|
// StartTime is when the timeseries was started. (optional)
|
|
|
|
StartTime time.Time `json:",omitempty"`
|
|
|
|
// Time is the time when the timeseries was recorded. (optional)
|
|
|
|
Time time.Time `json:",omitempty"`
|
|
|
|
// Value is the value of this data point.
|
|
|
|
Value N
|
|
|
|
|
|
|
|
// Exemplars is the sampled Exemplars collected during the timeseries.
|
|
|
|
Exemplars []Exemplar[N] `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Histogram represents the histogram of all measurements of values from an instrument.
|
|
|
|
type Histogram[N int64 | float64] struct {
|
|
|
|
// DataPoints are the individual aggregated measurements with unique
|
|
|
|
// Attributes.
|
|
|
|
DataPoints []HistogramDataPoint[N]
|
|
|
|
// Temporality describes if the aggregation is reported as the change from the
|
|
|
|
// last report time, or the cumulative changes since a fixed start time.
|
|
|
|
Temporality Temporality
|
|
|
|
}
|
|
|
|
|
|
|
|
func (Histogram[N]) privateAggregation() {}
|
|
|
|
|
|
|
|
// HistogramDataPoint is a single histogram data point in a timeseries.
|
|
|
|
type HistogramDataPoint[N int64 | float64] struct {
|
|
|
|
// Attributes is the set of key value pairs that uniquely identify the
|
|
|
|
// timeseries.
|
|
|
|
Attributes attribute.Set
|
|
|
|
// StartTime is when the timeseries was started.
|
|
|
|
StartTime time.Time
|
|
|
|
// Time is the time when the timeseries was recorded.
|
|
|
|
Time time.Time
|
|
|
|
|
|
|
|
// Count is the number of updates this histogram has been calculated with.
|
|
|
|
Count uint64
|
|
|
|
// Bounds are the upper bounds of the buckets of the histogram. Because the
|
|
|
|
// last boundary is +infinity this one is implied.
|
|
|
|
Bounds []float64
|
|
|
|
// BucketCounts is the count of each of the buckets.
|
|
|
|
BucketCounts []uint64
|
|
|
|
|
|
|
|
// Min is the minimum value recorded. (optional)
|
|
|
|
Min Extrema[N]
|
|
|
|
// Max is the maximum value recorded. (optional)
|
|
|
|
Max Extrema[N]
|
|
|
|
// Sum is the sum of the values recorded.
|
|
|
|
Sum N
|
|
|
|
|
|
|
|
// Exemplars is the sampled Exemplars collected during the timeseries.
|
|
|
|
Exemplars []Exemplar[N] `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExponentialHistogram represents the histogram of all measurements of values from an instrument.
|
|
|
|
type ExponentialHistogram[N int64 | float64] struct {
|
|
|
|
// DataPoints are the individual aggregated measurements with unique
|
|
|
|
// attributes.
|
|
|
|
DataPoints []ExponentialHistogramDataPoint[N]
|
|
|
|
// Temporality describes if the aggregation is reported as the change from the
|
|
|
|
// last report time, or the cumulative changes since a fixed start time.
|
|
|
|
Temporality Temporality
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ExponentialHistogram[N]) privateAggregation() {}
|
|
|
|
|
|
|
|
// ExponentialHistogramDataPoint is a single exponential histogram data point in a timeseries.
|
|
|
|
type ExponentialHistogramDataPoint[N int64 | float64] struct {
|
|
|
|
// Attributes is the set of key value pairs that uniquely identify the
|
|
|
|
// timeseries.
|
|
|
|
Attributes attribute.Set
|
|
|
|
// StartTime is when the timeseries was started.
|
|
|
|
StartTime time.Time
|
|
|
|
// Time is the time when the timeseries was recorded.
|
|
|
|
Time time.Time
|
|
|
|
|
|
|
|
// Count is the number of updates this histogram has been calculated with.
|
|
|
|
Count uint64
|
|
|
|
// Min is the minimum value recorded. (optional)
|
|
|
|
Min Extrema[N]
|
|
|
|
// Max is the maximum value recorded. (optional)
|
|
|
|
Max Extrema[N]
|
|
|
|
// Sum is the sum of the values recorded.
|
|
|
|
Sum N
|
|
|
|
|
|
|
|
// Scale describes the resolution of the histogram. Boundaries are
|
|
|
|
// located at powers of the base, where:
|
|
|
|
//
|
|
|
|
// base = 2 ^ (2 ^ -Scale)
|
|
|
|
Scale int32
|
|
|
|
// ZeroCount is the number of values whose absolute value
|
|
|
|
// is less than or equal to [ZeroThreshold].
|
|
|
|
// When ZeroThreshold is 0, this is the number of values that
|
|
|
|
// cannot be expressed using the standard exponential formula
|
|
|
|
// as well as values that have been rounded to zero.
|
|
|
|
// ZeroCount represents the special zero count bucket.
|
|
|
|
ZeroCount uint64
|
|
|
|
|
|
|
|
// PositiveBucket is range of positive value bucket counts.
|
|
|
|
PositiveBucket ExponentialBucket
|
|
|
|
// NegativeBucket is range of negative value bucket counts.
|
|
|
|
NegativeBucket ExponentialBucket
|
|
|
|
|
|
|
|
// ZeroThreshold is the width of the zero region. Where the zero region is
|
|
|
|
// defined as the closed interval [-ZeroThreshold, ZeroThreshold].
|
|
|
|
ZeroThreshold float64
|
|
|
|
|
|
|
|
// Exemplars is the sampled Exemplars collected during the timeseries.
|
|
|
|
Exemplars []Exemplar[N] `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// ExponentialBucket are a set of bucket counts, encoded in a contiguous array
|
|
|
|
// of counts.
|
|
|
|
type ExponentialBucket struct {
|
|
|
|
// Offset is the bucket index of the first entry in the Counts slice.
|
|
|
|
Offset int32
|
|
|
|
// Counts is an slice where Counts[i] carries the count of the bucket at
|
|
|
|
// index (Offset+i). Counts[i] is the count of values greater than
|
|
|
|
// base^(Offset+i) and less than or equal to base^(Offset+i+1).
|
|
|
|
Counts []uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
// Extrema is the minimum or maximum value of a dataset.
|
|
|
|
type Extrema[N int64 | float64] struct {
|
|
|
|
value N
|
|
|
|
valid bool
|
|
|
|
}
|
|
|
|
|
2024-03-11 14:34:34 +00:00
|
|
|
// MarshalText converts the Extrema value to text.
|
|
|
|
func (e Extrema[N]) MarshalText() ([]byte, error) {
|
|
|
|
if !e.valid {
|
|
|
|
return json.Marshal(nil)
|
|
|
|
}
|
|
|
|
return json.Marshal(e.value)
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON converts the Extrema value to JSON number.
|
|
|
|
func (e *Extrema[N]) MarshalJSON() ([]byte, error) {
|
|
|
|
return e.MarshalText()
|
|
|
|
}
|
|
|
|
|
2023-11-20 15:43:55 +00:00
|
|
|
// NewExtrema returns an Extrema set to v.
|
|
|
|
func NewExtrema[N int64 | float64](v N) Extrema[N] {
|
|
|
|
return Extrema[N]{value: v, valid: true}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Value returns the Extrema value and true if the Extrema is defined.
|
|
|
|
// Otherwise, if the Extrema is its zero-value, defined will be false.
|
|
|
|
func (e Extrema[N]) Value() (v N, defined bool) {
|
|
|
|
return e.value, e.valid
|
|
|
|
}
|
|
|
|
|
|
|
|
// Exemplar is a measurement sampled from a timeseries providing a typical
|
|
|
|
// example.
|
|
|
|
type Exemplar[N int64 | float64] struct {
|
|
|
|
// FilteredAttributes are the attributes recorded with the measurement but
|
|
|
|
// filtered out of the timeseries' aggregated data.
|
|
|
|
FilteredAttributes []attribute.KeyValue
|
|
|
|
// Time is the time when the measurement was recorded.
|
|
|
|
Time time.Time
|
|
|
|
// Value is the measured value.
|
|
|
|
Value N
|
|
|
|
// SpanID is the ID of the span that was active during the measurement. If
|
|
|
|
// no span was active or the span was not sampled this will be empty.
|
|
|
|
SpanID []byte `json:",omitempty"`
|
|
|
|
// TraceID is the ID of the trace the active span belonged to during the
|
|
|
|
// measurement. If no span was active or the span was not sampled this will
|
|
|
|
// be empty.
|
|
|
|
TraceID []byte `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Summary metric data are used to convey quantile summaries,
|
|
|
|
// a Prometheus (see: https://prometheus.io/docs/concepts/metric_types/#summary)
|
|
|
|
// data type.
|
|
|
|
//
|
|
|
|
// These data points cannot always be merged in a meaningful way. The Summary
|
|
|
|
// type is only used by bridges from other metrics libraries, and cannot be
|
|
|
|
// produced using OpenTelemetry instrumentation.
|
|
|
|
type Summary struct {
|
|
|
|
// DataPoints are the individual aggregated measurements with unique
|
|
|
|
// attributes.
|
|
|
|
DataPoints []SummaryDataPoint
|
|
|
|
}
|
|
|
|
|
|
|
|
func (Summary) privateAggregation() {}
|
|
|
|
|
|
|
|
// SummaryDataPoint is a single data point in a timeseries that describes the
|
|
|
|
// time-varying values of a Summary metric.
|
|
|
|
type SummaryDataPoint struct {
|
|
|
|
// Attributes is the set of key value pairs that uniquely identify the
|
|
|
|
// timeseries.
|
|
|
|
Attributes attribute.Set
|
|
|
|
|
|
|
|
// StartTime is when the timeseries was started.
|
|
|
|
StartTime time.Time
|
|
|
|
// Time is the time when the timeseries was recorded.
|
|
|
|
Time time.Time
|
|
|
|
|
|
|
|
// Count is the number of updates this summary has been calculated with.
|
|
|
|
Count uint64
|
|
|
|
|
|
|
|
// Sum is the sum of the values recorded.
|
|
|
|
Sum float64
|
|
|
|
|
|
|
|
// (Optional) list of values at different quantiles of the distribution calculated
|
|
|
|
// from the current snapshot. The quantiles must be strictly increasing.
|
|
|
|
QuantileValues []QuantileValue
|
|
|
|
}
|
|
|
|
|
|
|
|
// QuantileValue is the value at a given quantile of a summary.
|
|
|
|
type QuantileValue struct {
|
|
|
|
// Quantile is the quantile of this value.
|
|
|
|
//
|
|
|
|
// Must be in the interval [0.0, 1.0].
|
|
|
|
Quantile float64
|
|
|
|
|
|
|
|
// Value is the value at the given quantile of a summary.
|
|
|
|
//
|
|
|
|
// Quantile values must NOT be negative.
|
|
|
|
Value float64
|
|
|
|
}
|