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

Calculate percentage in Graphite for groupByNode() results

我有两组石墨系列,都是这种格式。第二组是相同的,除了它没有 "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

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

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

请注意,下面的方法使用 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")

现在我们需要将它们放入包含所有项目的单个 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,如果您只需要 ccc 和 [=,您可以将整个内容包装在另一个 aliasByNode(<query>, 0) 中19=].

这与调用基本相同:

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 等,它会继续工作