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

时间:2016-12-02 06:22:30

标签: graphite grafana

我有两组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

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

1 个答案:

答案 0 :(得分:2)

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

请注意,下面的方法使用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,如果您只想要aliasByNode(<query>, 0)和{{{{}}},则可以将enire内容包装在另一个ccc中1}}。

这样做与调用基本相同:

ddd

当然,如果你添加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") ) 等,它会继续工作。