mirror of https://github.com/tidwall/tile38.git
122 lines
3.7 KiB
Go
122 lines
3.7 KiB
Go
|
// Copyright 2017, 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 view
|
||
|
|
||
|
// AggType represents the type of aggregation function used on a View.
|
||
|
type AggType int
|
||
|
|
||
|
// All available aggregation types.
|
||
|
const (
|
||
|
AggTypeNone AggType = iota // no aggregation; reserved for future use.
|
||
|
AggTypeCount // the count aggregation, see Count.
|
||
|
AggTypeSum // the sum aggregation, see Sum.
|
||
|
AggTypeDistribution // the distribution aggregation, see Distribution.
|
||
|
AggTypeLastValue // the last value aggregation, see LastValue.
|
||
|
)
|
||
|
|
||
|
func (t AggType) String() string {
|
||
|
return aggTypeName[t]
|
||
|
}
|
||
|
|
||
|
var aggTypeName = map[AggType]string{
|
||
|
AggTypeNone: "None",
|
||
|
AggTypeCount: "Count",
|
||
|
AggTypeSum: "Sum",
|
||
|
AggTypeDistribution: "Distribution",
|
||
|
AggTypeLastValue: "LastValue",
|
||
|
}
|
||
|
|
||
|
// Aggregation represents a data aggregation method. Use one of the functions:
|
||
|
// Count, Sum, or Distribution to construct an Aggregation.
|
||
|
type Aggregation struct {
|
||
|
Type AggType // Type is the AggType of this Aggregation.
|
||
|
Buckets []float64 // Buckets are the bucket endpoints if this Aggregation represents a distribution, see Distribution.
|
||
|
|
||
|
newData func() AggregationData
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
aggCount = &Aggregation{
|
||
|
Type: AggTypeCount,
|
||
|
newData: func() AggregationData {
|
||
|
return &CountData{}
|
||
|
},
|
||
|
}
|
||
|
aggSum = &Aggregation{
|
||
|
Type: AggTypeSum,
|
||
|
newData: func() AggregationData {
|
||
|
return &SumData{}
|
||
|
},
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// Count indicates that data collected and aggregated
|
||
|
// with this method will be turned into a count value.
|
||
|
// For example, total number of accepted requests can be
|
||
|
// aggregated by using Count.
|
||
|
func Count() *Aggregation {
|
||
|
return aggCount
|
||
|
}
|
||
|
|
||
|
// Sum indicates that data collected and aggregated
|
||
|
// with this method will be summed up.
|
||
|
// For example, accumulated request bytes can be aggregated by using
|
||
|
// Sum.
|
||
|
func Sum() *Aggregation {
|
||
|
return aggSum
|
||
|
}
|
||
|
|
||
|
// Distribution indicates that the desired aggregation is
|
||
|
// a histogram distribution.
|
||
|
//
|
||
|
// A distribution aggregation may contain a histogram of the values in the
|
||
|
// population. The bucket boundaries for that histogram are described
|
||
|
// by the bounds. This defines len(bounds)+1 buckets.
|
||
|
//
|
||
|
// If len(bounds) >= 2 then the boundaries for bucket index i are:
|
||
|
//
|
||
|
// [-infinity, bounds[i]) for i = 0
|
||
|
// [bounds[i-1], bounds[i]) for 0 < i < length
|
||
|
// [bounds[i-1], +infinity) for i = length
|
||
|
//
|
||
|
// If len(bounds) is 0 then there is no histogram associated with the
|
||
|
// distribution. There will be a single bucket with boundaries
|
||
|
// (-infinity, +infinity).
|
||
|
//
|
||
|
// If len(bounds) is 1 then there is no finite buckets, and that single
|
||
|
// element is the common boundary of the overflow and underflow buckets.
|
||
|
func Distribution(bounds ...float64) *Aggregation {
|
||
|
agg := &Aggregation{
|
||
|
Type: AggTypeDistribution,
|
||
|
Buckets: bounds,
|
||
|
}
|
||
|
agg.newData = func() AggregationData {
|
||
|
return newDistributionData(agg)
|
||
|
}
|
||
|
return agg
|
||
|
}
|
||
|
|
||
|
// LastValue only reports the last value recorded using this
|
||
|
// aggregation. All other measurements will be dropped.
|
||
|
func LastValue() *Aggregation {
|
||
|
return &Aggregation{
|
||
|
Type: AggTypeLastValue,
|
||
|
newData: func() AggregationData {
|
||
|
return &LastValueData{}
|
||
|
},
|
||
|
}
|
||
|
}
|