StatsD计量器(gauge)有什么用处?

7
我不太理解statsd中gauge的概念。请您解释一下它的工作原理,并且提供一些使用实例。
我发现文档并不是很清晰。
引用如下:
设置一个当前值的gauge。stat:要设置的计量器的名称。value:计量器的当前值。rate:样本率,介于0和1之间的浮点数。只会发送此百分比的数据。对于gauge类型,statsd服务器不考虑样本率。请谨慎使用。delta:是否将其视为增量值或绝对值。有关更多详细信息,请参见计量表类型。
1个回答

6
计量器只是反映您系统的状态或者一些不想被聚合的指标。
让我给您举几个例子。
1)在您的程序中,您可以使用某些特定于语言的API来了解此进程正在使用多少内存。例如,在Golang中,我们可以这样做:
var stat runtime.MemStats
runtime.ReadMemStats(&stat)
heapAlloc := memStat.HeapAlloc
heapInuse := memStat.HeapInuse
heapObjects := memStat.HeapObjects
statsd.Gauge("machine01.memory.heap.alloc", heapAlloc)
statsd.Gauge("machine01.memory.heap.inuse", heapInuse)
statsd.Gauge("machine01.memory.heap.objects, heapObjects)

为了简单起见,您可以将这些指标视为代码调用运行时API时的内存使用情况。因此,您可以使用计量表将其发送到StatsD,因为每个计量表都可以完美地显示在10秒内的内存使用情况,这是StatsD中默认的刷新周期。此外,对于这些指标,您不需要使用任何聚合方法,因为聚合(如求和)没有任何意义。
除了上述情况外,还有许多用例可用,例如CPU使用率、操作系统的系统负载、进程中的线程数、服务器上的在线连接数以及交易系统中当前活动事务的数量。
2) 有时,我们还可以使用计量表来跟踪某件事情发生的时间。例如,
res, err := something()
if err != nil {
   statsd.Gauge("machine01.something.error", time.Now().Unix())
}

一旦出现错误,您可以通过查看Graphite仪表板上的行来感知。此外,您还可以通过查看线条的形状来分析和获取发生频率。


“聚合,例如求和,没有任何意义”-但是服务器农场呢?假设您拥有类似Redis集群的东西,并且想要衡量整个集群中可用的总内存?这种聚合是否内置或由仪表板应用程序(例如DataDog)完成? - sergiopereira
1
我脑海中有两个选项:1)为整个集群使用一个计数度量,并使每个Redis节点发出到此度量的统计数据statsd.Count("cluster.mycluster.totalAvailableMemory", xxx);2)为每个节点使用一个仪表盘度量statsd.Gauge("cluster.mycluster.node.hostName1.totalAvailableMemory", xxx)。就个人而言,我建议选择第二个选项,因为您不会失去每个节点的可见性,正如您所说,您可以轻松地使用仪表盘应用程序将集群的所有指标聚合在一个图表中。 - pfctgeorge
pfctgeorge,感谢您的建议。我需要实现类似这样的东西,我自己也倾向于选项2。只是我不确定在仪表板本身尝试聚合是否会遇到问题。 - sergiopereira
如果你有太多节点(比如超过1k),需要仪表板检索数千个指标并进行聚合,那么这将是一个问题,因为这可能花费几十秒钟来加载仪表板。在这种情况下,你可以使用选项1和2的组合,在仪表板中添加选项1的指标,并在需要时逐个调查指标。 - pfctgeorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接