不要在没有时间范围内数据的情况下显示石墨指标



我有一个AWS服务器集群,我使用Graphite跟踪统计信息。群集中的服务器会随着软件新版本的部署或群集大小的增长或缩小而更改。

例如

昨天
添加的指标 服务器.1.中央处理器
服务器.2.中央处理器

今天
添加的指标 服务器.2.中央处理器
服务器.3.中央处理器

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

查询最近 15 分钟
服务器.*.cpu

结果:
服务器.1.中央处理器
服务器.2.中央处理器
服务器.3.中央处理器

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

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

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

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

我们通过statsd发送到Graphite的指标也有类似的问题。在某些情况下,我已经能够使用currentAbove(0)过滤掉没有"有趣"值的系列;这对于收集的加载插件中的值是成功的。

仪表是一个特殊的问题,因为一旦 AWS 实例终止,该实例中的所有仪表指标将"卡"在其最后一个值上。

我围绕这个领域的一些想法:

  • 使用 CloudWatch Events 将终止实例的所有仪表设置为 0;不幸的是,Graphite 糟糕的搜索 API 会使这有点挑战性
  • 向 Graphite 添加自定义函数,例如,编写一个函数来过滤掉第一个和最后一个值相同的序列会相当容易
  • 我们正在使用 Grafana,因此我们可以添加一个脚本化控制面板,其中脚本获取当前的 AWS 主机名(来自 Salt master,handwavey handwavey(并动态填充控制面板的系列。

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

相关内容

最新更新