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

Yur*_*rik 2 graphite grafana

我有两组石墨系列,都是这种格式。第二组是相同的,只是它具有“xy”前缀而不是“ab”。

 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
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

请注意,下面的方法使用的mapSeries/reduceSeries函数仅在 Graphite-web 中可用master(不是 0.9.x,请参阅下面的手动方法,该方法适用于 0.9.x)

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

groupByNode(a.b.*.*.hr,2,"sumSeries")
groupByNode(x.y.*.*.hr,2,"sumSeries")
Run Code Online (Sandbox Code Playgroud)

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

aliasSub(groupByNode(a.b.*.*.hr,2,"sumSeries"), "$", ".a_b")
aliasSub(groupByNode(x.y.*.*.hr,2,"sumSeries"), "$", ".x_y")
Run Code Online (Sandbox Code Playgroud)

现在我们有了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")
)
Run Code Online (Sandbox Code Playgroud)

现在我们可以开始映射/减少:

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"
)
Run Code Online (Sandbox Code Playgroud)

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

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

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")
)
Run Code Online (Sandbox Code Playgroud)

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