不显示时间范围内没有数据的石墨指标

时间:2014-12-19 19:03:52

标签: graphite

我有一组AWS服务器,我使用Graphite跟踪统计信息。随着新版本软件的部署或群集大小的增大或缩小,群集中的服务器也会发生变化。

例如

  

昨天增加了指标
      servers.1.cpu
      servers.2.cpu

     

今天增加了指标
      servers.2.cpu
      servers.3.cpu

当我通过Graphite查看我的数据时,我只希望它向我显示具有我查询时间段数据的服务器的指标。但是,由于我不知道在该时间段内哪些服务器可用,我在查询中指定了*,这导致群集中已存在的所有服务器都包含在该系列中。

  

查询最后15分钟
      服务器。* CPU

  结果
      servers.1.cpu
      servers.2.cpu
      servers.3.cpu

有没有办法过滤掉那些没有系列数据的服务器?因此,在上面的示例中,我不包含来自servers.1.cpu的指标。但是,如果我的查询时间段是昨天,我会得到servers.1.cpu,但不是servers.3.cpu

2 个答案:

答案 0 :(得分:1)

Graphite在第一次收到单个值时为度量标准分配所有空间。对于指标稀疏的任何系统,这导致非常低效的表示。例如,在服务器高度动态的系统中。我决定采用两种可能的解决方案:

  1. 使用指标的插槽名称而不是实际的服务器标识符(IP)。我真的不喜欢这样,因为它会导致您使用插槽名称查找服务器,然后才能真正转到生成指标的服务器。

  2. 请改用InfluxDB。 InfluxDB仅存储您实际提供的指标,而查询仅返回实际存在要返回的数据的数据。此结果是一个紧凑的表示形式,仅显示在查询的时间跨度内实际具有数据的度量标准的数据。

答案 1 :(得分:0)

我们对通过statsd发送到Graphite的指标存在类似问题。在某些情况下,我已经能够使用currentAbove(0)过滤掉没有“有趣”值的系列;这对于collectd load plugin的值来说是成功的。

仪表是一个特殊的问题,因为一旦AWS实例终止,该实例的所有仪表量度将保持“卡在”它们的最后一个值。

我在这个领域有一些想法:

  • 使用CloudWatch Events将已终止实例的所有计量器设置为0;不幸的是,Graphite糟糕的搜索API会让这有点挑战
  • custom functions添加到Graphite,例如,编写一个函数来过滤掉第一个&最后的价值是相同的
  • 我们正在使用Grafana,因此我们可以添加scripted dashboard脚本获取当前AWS主机名(来自Salt master,handwavey handwavey)&动态填充仪表板的系列。

开发过滤常数系列的想法,averageAbove(integral(nonNegativeDerivative(...)), 1)似乎是一个好的开始,但我无法弄清楚如何仅显示原始系列。