194 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.0 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
 | 
						|
)
 |