【问题标题】:Don't display graphite metrics without data in the time range不要在时间范围内显示没有数据的石墨指标
【发布时间】:2015-02-18 18:17:19
【问题描述】:

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

例如

昨天添加的指标
服务器.1.cpu
服务器.2.cpu

今天添加的指标
服务器.2.cpu
服务器.3.cpu

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

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

结果
服务器.1.cpu
服务器.2.cpu
服务器.3.cpu

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

【问题讨论】:

  • 这里有一个相关的问题。当服务器一直在变化时,您如何有效地存储指标。如果您在指标名称中使用服务器的 IP 地址,那么随着服务器轮换,您将拥有大量稀疏指标。这似乎是对磁盘空间的极其低效的使用。

标签: graphite


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我们对通过 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) 似乎是一个好的开始,但我不知道如何只显示原始系列。

    【讨论】:

    • 我强烈建议您将 Graphite 替换为 InfluxDB。功能和性能都很棒。 Grafana 对 influxDB 的支持很棒。如果您在 AWS 中,也可以跳过 Graphite,而只使用 Grafana 的 CloudWatch 连接器。缺点是您需要为查询支付一点费用,而且只能获得两周的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2021-10-13
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多