在 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")
,这得到两个系列:ccc
和 ddd
。我想将第一组中的 ccc
和 ddd
系列除以第二组中的相应系列。如何在 map/reduce 函数中使用 groupByNode
的结果?
这是可能的,但很棘手,或者至少我不知道有更简单的可扩展方式。
请注意,下面的方法使用 mapSeries
/ reduceSeries
函数,这些函数仅在 graphite-web master
中可用(不是 0.9.x,请参见下面的适用于 0.9.x)
的手动方法
我们从 2 个系列列表开始,每个列表包含 ccc
和 ddd
:
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_b
、ddd.a_b
、ccc.x_y
和 ddd.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.asPercent
和 ddd.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
等,它会继续工作
我有两组石墨系列,都是这种格式。第二组是相同的,除了它没有 "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")
,这得到两个系列:ccc
和 ddd
。我想将第一组中的 ccc
和 ddd
系列除以第二组中的相应系列。如何在 map/reduce 函数中使用 groupByNode
的结果?
这是可能的,但很棘手,或者至少我不知道有更简单的可扩展方式。
请注意,下面的方法使用 mapSeries
/ reduceSeries
函数,这些函数仅在 graphite-web master
中可用(不是 0.9.x,请参见下面的适用于 0.9.x)
我们从 2 个系列列表开始,每个列表包含 ccc
和 ddd
:
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_b
、ddd.a_b
、ccc.x_y
和 ddd.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.asPercent
和 ddd.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
等,它会继续工作