ec47096efc
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
193 lines
6 KiB
Go
193 lines
6 KiB
Go
// Copyright 2018, OpenCensus 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 (
|
|
"time"
|
|
)
|
|
|
|
// Point is a single data point of a time series.
|
|
type Point struct {
|
|
// Time is the point in time that this point represents in a time series.
|
|
Time time.Time
|
|
// Value is the value of this point. Prefer using ReadValue to switching on
|
|
// the value type, since new value types might be added.
|
|
Value interface{}
|
|
}
|
|
|
|
//go:generate stringer -type ValueType
|
|
|
|
// NewFloat64Point creates a new Point holding a float64 value.
|
|
func NewFloat64Point(t time.Time, val float64) Point {
|
|
return Point{
|
|
Value: val,
|
|
Time: t,
|
|
}
|
|
}
|
|
|
|
// NewInt64Point creates a new Point holding an int64 value.
|
|
func NewInt64Point(t time.Time, val int64) Point {
|
|
return Point{
|
|
Value: val,
|
|
Time: t,
|
|
}
|
|
}
|
|
|
|
// NewDistributionPoint creates a new Point holding a Distribution value.
|
|
func NewDistributionPoint(t time.Time, val *Distribution) Point {
|
|
return Point{
|
|
Value: val,
|
|
Time: t,
|
|
}
|
|
}
|
|
|
|
// NewSummaryPoint creates a new Point holding a Summary value.
|
|
func NewSummaryPoint(t time.Time, val *Summary) Point {
|
|
return Point{
|
|
Value: val,
|
|
Time: t,
|
|
}
|
|
}
|
|
|
|
// ValueVisitor allows reading the value of a point.
|
|
type ValueVisitor interface {
|
|
VisitFloat64Value(float64)
|
|
VisitInt64Value(int64)
|
|
VisitDistributionValue(*Distribution)
|
|
VisitSummaryValue(*Summary)
|
|
}
|
|
|
|
// ReadValue accepts a ValueVisitor and calls the appropriate method with the
|
|
// value of this point.
|
|
// Consumers of Point should use this in preference to switching on the type
|
|
// of the value directly, since new value types may be added.
|
|
func (p Point) ReadValue(vv ValueVisitor) {
|
|
switch v := p.Value.(type) {
|
|
case int64:
|
|
vv.VisitInt64Value(v)
|
|
case float64:
|
|
vv.VisitFloat64Value(v)
|
|
case *Distribution:
|
|
vv.VisitDistributionValue(v)
|
|
case *Summary:
|
|
vv.VisitSummaryValue(v)
|
|
default:
|
|
panic("unexpected value type")
|
|
}
|
|
}
|
|
|
|
// Distribution contains summary statistics for a population of values. It
|
|
// optionally contains a histogram representing the distribution of those
|
|
// values across a set of buckets.
|
|
type Distribution struct {
|
|
// Count is the number of values in the population. Must be non-negative. This value
|
|
// must equal the sum of the values in bucket_counts if a histogram is
|
|
// provided.
|
|
Count int64
|
|
// Sum is the sum of the values in the population. If count is zero then this field
|
|
// must be zero.
|
|
Sum float64
|
|
// SumOfSquaredDeviation is the sum of squared deviations from the mean of the values in the
|
|
// population. For values x_i this is:
|
|
//
|
|
// Sum[i=1..n]((x_i - mean)^2)
|
|
//
|
|
// Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition
|
|
// describes Welford's method for accumulating this sum in one pass.
|
|
//
|
|
// If count is zero then this field must be zero.
|
|
SumOfSquaredDeviation float64
|
|
// BucketOptions describes the bounds of the histogram buckets in this
|
|
// distribution.
|
|
//
|
|
// A Distribution may optionally contain a histogram of the values in the
|
|
// population.
|
|
//
|
|
// If nil, there is no associated histogram.
|
|
BucketOptions *BucketOptions
|
|
// Bucket If the distribution does not have a histogram, then omit this field.
|
|
// If there is a histogram, then the sum of the values in the Bucket counts
|
|
// must equal the value in the count field of the distribution.
|
|
Buckets []Bucket
|
|
}
|
|
|
|
// BucketOptions describes the bounds of the histogram buckets in this
|
|
// distribution.
|
|
type BucketOptions struct {
|
|
// Bounds specifies a set of bucket upper bounds.
|
|
// This defines len(bounds) + 1 (= N) buckets. The boundaries for bucket
|
|
// index i are:
|
|
//
|
|
// [0, Bounds[i]) for i == 0
|
|
// [Bounds[i-1], Bounds[i]) for 0 < i < N-1
|
|
// [Bounds[i-1], +infinity) for i == N-1
|
|
Bounds []float64
|
|
}
|
|
|
|
// Bucket represents a single bucket (value range) in a distribution.
|
|
type Bucket struct {
|
|
// Count is the number of values in each bucket of the histogram, as described in
|
|
// bucket_bounds.
|
|
Count int64
|
|
// Exemplar associated with this bucket (if any).
|
|
Exemplar *Exemplar
|
|
}
|
|
|
|
// Summary is a representation of percentiles.
|
|
type Summary struct {
|
|
// Count is the cumulative count (if available).
|
|
Count int64
|
|
// Sum is the cumulative sum of values (if available).
|
|
Sum float64
|
|
// HasCountAndSum is true if Count and Sum are available.
|
|
HasCountAndSum bool
|
|
// Snapshot represents percentiles calculated over an arbitrary time window.
|
|
// The values in this struct can be reset at arbitrary unknown times, with
|
|
// the requirement that all of them are reset at the same time.
|
|
Snapshot Snapshot
|
|
}
|
|
|
|
// Snapshot represents percentiles over an arbitrary time.
|
|
// The values in this struct can be reset at arbitrary unknown times, with
|
|
// the requirement that all of them are reset at the same time.
|
|
type Snapshot struct {
|
|
// Count is the number of values in the snapshot. Optional since some systems don't
|
|
// expose this. Set to 0 if not available.
|
|
Count int64
|
|
// Sum is the sum of values in the snapshot. Optional since some systems don't
|
|
// expose this. If count is 0 then this field must be zero.
|
|
Sum float64
|
|
// Percentiles is a map from percentile (range (0-100.0]) to the value of
|
|
// the percentile.
|
|
Percentiles map[float64]float64
|
|
}
|
|
|
|
//go:generate stringer -type Type
|
|
|
|
// Type is the overall type of metric, including its value type and whether it
|
|
// represents a cumulative total (since the start time) or if it represents a
|
|
// gauge value.
|
|
type Type int
|
|
|
|
// Metric types.
|
|
const (
|
|
TypeGaugeInt64 Type = iota
|
|
TypeGaugeFloat64
|
|
TypeGaugeDistribution
|
|
TypeCumulativeInt64
|
|
TypeCumulativeFloat64
|
|
TypeCumulativeDistribution
|
|
TypeSummary
|
|
)
|