1. 前言
项目中使用go-metrics
库统计指标,涉及到诸如登录时长、连接时长等指标项,采用直方图进行统计。
在创建直方图统计项时,发现直方图统计器构造函数需要传递样本(sample
),有以下三类样本:
NilSample
ExpDecaySample
UniformSample
2. Sample释义
2.1 NilSample
NilSample
是一个空样本,它不收集任何数据。通常用于禁用某些度量指标的采样功能。
作用:
禁用采样:当你不想收集任何样本数据时,可以使用 NilSample。
占位符:在某些情况下,你可能需要一个占位符样本来满足接口要求,但不实际收集数据。
package main
import (
"github.com/rcrowley/go-metrics"
)
func main() {
// 创建一个 NilSample
sample := metrics.NilSample{}
// 使用 NilSample 创建一个直方图
histogram := metrics.NewHistogram(sample)
// 更新直方图(不会实际收集数据)
histogram.Update(42)
// 打印直方图的统计信息(全为零)
snapshot := histogram.Snapshot()
println("Count:", snapshot.Count())
println("Min:", snapshot.Min())
println("Max:", snapshot.Max())
println("Mean:", snapshot.Mean())
}
2.2 ExpDecaySample
ExpDecaySample
是一种指数衰减样本,它更频繁地采样最近的数据,而较少地采样较早的数据。这种样本适用于需要反映最新状态的场景。
作用
反映最新状态:通过指数衰减算法,更频繁地采样最近的数据。
适应变化:适用于数据变化较快或流式场景,如实时监控和分析。
package main
import (
"github.com/rcrowley/go-metrics"
"math/rand"
"time"
)
func main() {
// 创建一个 ExpDecaySample
sample := metrics.NewExpDecaySample(1028, 0.015)
// 使用 ExpDecaySample 创建一个直方图
histogram := metrics.NewHistogram(sample)
// 模拟数据点并更新直方图
rand.Seed(time.Now().UnixNano())
for i := 0; i < 1000; i++ {
value := rand.Int63n(100)
histogram.Update(value)
}
// 打印直方图的统计信息
snapshot := histogram.Snapshot()
println("Count:", snapshot.Count())
println("Min:", snapshot.Min())
println("Max:", snapshot.Max())
println("Mean:", snapshot.Mean())
}
2.3 UniformSample
UniformSample
是一种固定大小的样本,它随机选择数据点进行采样。这种样本适用于需要均匀采样的场景。
作用
均匀采样:随机选择数据点,确保样本的均匀性。
固定大小:样本大小固定,适用于内存受限的场景。
package main
import (
"github.com/rcrowley/go-metrics"
"math/rand"
"time"
)
func main() {
// 创建一个 UniformSample
sample := metrics.NewUniformSample(1028)
// 使用 UniformSample 创建一个直方图
histogram := metrics.NewHistogram(sample)
// 模拟数据点并更新直方图
rand.Seed(time.Now().UnixNano())
for i := 0; i < 1000; i++ {
value := rand.Int63n(100)
histogram.Update(value)
}
// 打印直方图的统计信息
snapshot := histogram.Snapshot()
println("Count:", snapshot.Count())
println("Min:", snapshot.Min())
println("Max:", snapshot.Max())
println("Mean:", snapshot.Mean())
}
3. 总结
NilSample
:不收集任何数据,通常用于禁用采样功能或作为占位符。ExpDecaySample
:使用指数衰减算法,更频繁地采样最近的数据,适用于需要反映最新状态的场景。UniformSample
:随机选择数据点进行均匀采样,适用于需要均匀采样的场景。
考虑到项目是收集固定压测任务的耗时指标,统计窗口大小固定,因此最终选择UniformSample
样本。