Source File
aggregation_data.go
Belonging Package
go.opencensus.io/stats/view
package view
import (
)
type AggregationData interface {
isAggregationData() bool
addSample(v float64, attachments map[string]interface{}, t time.Time)
clone() AggregationData
equal(other AggregationData) bool
toPoint(t metricdata.Type, time time.Time) metricdata.Point
}
const epsilon = 1e-9
type CountData struct {
Value int64
}
func ( *CountData) () bool { return true }
func ( *CountData) ( float64, map[string]interface{}, time.Time) {
.Value = .Value + 1
}
func ( *CountData) () AggregationData {
return &CountData{Value: .Value}
}
func ( *CountData) ( AggregationData) bool {
, := .(*CountData)
if ! {
return false
}
return .Value == .Value
}
func ( *CountData) ( metricdata.Type, time.Time) metricdata.Point {
switch {
case metricdata.TypeCumulativeInt64:
return metricdata.NewInt64Point(, .Value)
default:
panic("unsupported metricdata.Type")
}
}
type SumData struct {
Value float64
}
func ( *SumData) () bool { return true }
func ( *SumData) ( float64, map[string]interface{}, time.Time) {
.Value +=
}
func ( *SumData) () AggregationData {
return &SumData{Value: .Value}
}
func ( *SumData) ( AggregationData) bool {
, := .(*SumData)
if ! {
return false
}
return math.Pow(.Value-.Value, 2) < epsilon
}
func ( *SumData) ( metricdata.Type, time.Time) metricdata.Point {
switch {
case metricdata.TypeCumulativeInt64:
return metricdata.NewInt64Point(, int64(.Value))
case metricdata.TypeCumulativeFloat64:
return metricdata.NewFloat64Point(, .Value)
default:
panic("unsupported metricdata.Type")
}
}
ExemplarsPerBucket []*metricdata.Exemplar
bounds []float64 // histogram distribution of the values
}
func ( *Aggregation) *DistributionData {
:= len(.Buckets) + 1
return &DistributionData{
CountPerBucket: make([]int64, ),
ExemplarsPerBucket: make([]*metricdata.Exemplar, ),
bounds: .Buckets,
Min: math.MaxFloat64,
Max: math.SmallestNonzeroFloat64,
}
}
func ( *DistributionData) () float64 { return .Mean * float64(.Count) }
func ( *DistributionData) () float64 {
if .Count <= 1 {
return 0
}
return .SumOfSquaredDev / float64(.Count-1)
}
func ( *DistributionData) () bool { return true }
func ( *DistributionData) ( float64, map[string]interface{}, time.Time) {
if < .Min {
.Min =
}
if > .Max {
.Max =
}
.Count++
.addToBucket(, , )
if .Count == 1 {
.Mean =
return
}
:= .Mean
.Mean = .Mean + (-.Mean)/float64(.Count)
.SumOfSquaredDev = .SumOfSquaredDev + (-)*(-.Mean)
}
func ( *DistributionData) ( float64, map[string]interface{}, time.Time) {
var *int64
var int
var float64
for , = range .bounds {
if < {
= &.CountPerBucket[]
break
}
}
if == nil { // Last bucket.
= len(.bounds)
= &.CountPerBucket[]
}
*++
if := getExemplar(, , ); != nil {
.ExemplarsPerBucket[] =
}
}
func ( float64, map[string]interface{}, time.Time) *metricdata.Exemplar {
if len() == 0 {
return nil
}
return &metricdata.Exemplar{
Value: ,
Timestamp: ,
Attachments: ,
}
}
func ( *DistributionData) () AggregationData {
:= *
.CountPerBucket = append([]int64(nil), .CountPerBucket...)
.ExemplarsPerBucket = append([]*metricdata.Exemplar(nil), .ExemplarsPerBucket...)
return &
}
func ( *DistributionData) ( AggregationData) bool {
, := .(*DistributionData)
if ! {
return false
}
if == nil {
return false
}
if len(.CountPerBucket) != len(.CountPerBucket) {
return false
}
for := range .CountPerBucket {
if .CountPerBucket[] != .CountPerBucket[] {
return false
}
}
return .Count == .Count && .Min == .Min && .Max == .Max && math.Pow(.Mean-.Mean, 2) < epsilon && math.Pow(.variance()-.variance(), 2) < epsilon
}
func ( *DistributionData) ( metricdata.Type, time.Time) metricdata.Point {
switch {
case metricdata.TypeCumulativeDistribution:
:= []metricdata.Bucket{}
for := 0; < len(.CountPerBucket); ++ {
= append(, metricdata.Bucket{
Count: .CountPerBucket[],
Exemplar: .ExemplarsPerBucket[],
})
}
:= &metricdata.BucketOptions{Bounds: .bounds}
:= &metricdata.Distribution{
Count: .Count,
Sum: .Sum(),
SumOfSquaredDeviation: .SumOfSquaredDev,
BucketOptions: ,
Buckets: ,
}
return metricdata.NewDistributionPoint(, )
panic("unsupported metricdata.Type")
}
}
type LastValueData struct {
Value float64
}
func ( *LastValueData) () bool {
return true
}
func ( *LastValueData) ( float64, map[string]interface{}, time.Time) {
.Value =
}
func ( *LastValueData) () AggregationData {
return &LastValueData{.Value}
}
func ( *LastValueData) ( AggregationData) bool {
, := .(*LastValueData)
if ! {
return false
}
return .Value == .Value
}
func ( *LastValueData) ( metricdata.Type, time.Time) metricdata.Point {
switch {
case metricdata.TypeGaugeInt64:
return metricdata.NewInt64Point(, int64(.Value))
case metricdata.TypeGaugeFloat64:
return metricdata.NewFloat64Point(, .Value)
default:
panic("unsupported metricdata.Type")
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |