计算 Graphite 中 groupByNode() 结果的百分比

Posted

技术标签:

【中文标题】计算 Graphite 中 groupByNode() 结果的百分比【英文标题】:Calculate percentage in Graphite for groupByNode() results 【发布时间】:2017-04-17 00:00:07 【问题描述】:

我有两组 Graphite 系列,都是这种格式。第二组是相同的,只是它的前缀不是“a.b”,而是“x.y”。

 a.b.ccc.a1.hr
 a.b.ccc.a2.hr
 a.b.ccc.a3.hr
 a.b.ddd.a1.hr
 a.b.ddd.a4.hr

要按第三个节点分组,我使用groupByNode(a.b.*.*.hr,2,"sumSeries"),这得到了两个系列:cccddd。我想将第一组中的cccddd 系列除以第二组中的相应系列。如何在 map/reduce 函数中使用groupByNode 的结果?

【问题讨论】:

【参考方案1】:

这是可能的,但很棘手,或者至少我不知道以可扩展的方式更简单的方法。

请注意,下面的方法使用了 mapSeries / reduceSeries 函数,这些函数仅在石墨网络 master 中可用(不是 0.9.x,请参阅下面的适用于 0.9.x 的手动方法)

我们从 2 个系列列表开始,每个系列列表都包含 cccddd

groupByNode(a.b.*.*.hr,2,"sumSeries")
groupByNode(x.y.*.*.hr,2,"sumSeries")

现在我们需要将它们放入包含所有项目的单个 seriesList 中,所以首先我们需要让它们再次可区分:

aliasSub(groupByNode(a.b.*.*.hr,2,"sumSeries"), "$", ".a_b")
aliasSub(groupByNode(x.y.*.*.hr,2,"sumSeries"), "$", ".x_y")

现在我们有了ccc.a_bddd.a_bccc.x_yddd.x_y,我们可以使用group 将它们放到一个列表中:

group(
  aliasSub(groupByNode(a.b.*.*.hr,2,"sumSeries"), "$", ".a_b"),
  aliasSub(groupByNode(x.y.*.*.hr,2,"sumSeries"), "$", ".x_y")
)

现在我们可以开始 map/reduce:

reduceSeries(
  mapSeries(
    group(
      aliasSub(groupByNode(a.b.*.*.hr,2,"sumSeries"), "$", ".a_b"),
      aliasSub(groupByNode(x.y.*.*.hr,2,"sumSeries"), "$", ".x_y")
    ),
    0
  ),
  "asPercent", 1, "a_b", "x_y"
)

此时我们将拥有ccc.reduce.asPercentddd.reduce.asPercent,然后如果您只想要cccddd,您可以将整个东西包装在另一个aliasByNode(<query>, 0) 中。

这与调用本质上是一样的:

group(
  alias(asPercent(
    groupByNode(a.b.ccc.*.hr,2,"sumSeries"),
    groupByNode(x.y.ccc.*.hr,2,"sumSeries"),
  ), "ccc"),
  alias(asPercent(
    groupByNode(a.b.ddd.*.hr,2,"sumSeries"),
    groupByNode(x.y.ddd.*.hr,2,"sumSeries"),
  ), "ddd")
)

当然,如果您添加 eee 等,它将继续工作。

【讨论】:

以上是关于计算 Graphite 中 groupByNode() 结果的百分比的主要内容,如果未能解决你的问题,请参考以下文章

在 Grafana 中与 groupBy 一起计算百分比

Graphite divideSeries(#E,#A) 不返回数据

交换 Graphite 在 Grafana 中返回的时间戳和值

Statsd & Graphite - 以 CSV 格式获取数据

graphite的搭建

将时间序列与Graphite相关联