我试图通过Kapacitor批处理|查询生成基线,通过从InfluxDB 1,2,3和4周前查询相同的间隔,然后将其向前移动并加入如下:
var w1 = batch
|query('SELECT mean(""value"") FROM ""MyDB"".""autogen"".""MetricName""')
.offset(1w).period(period).every(1m).align().groupBy(time(1m))
|shift(1w)
var w2 = batch
|query('SELECT mean(""value"") FROM ""MyDB"".""autogen"".""MetricName""')
.offset(2w).period(period).every(1m).align().groupBy(time(1m))
|shift(2w)
var w3 = batch
|query('SELECT mean(""value"") FROM ""MyDB"".""autogen"".""MetricName""')
.offset(3w).period(period).every(1m).align().groupBy(time(1m))
|shift(3w)
var w4 = batch
|query('SELECT mean(""value"") FROM ""MyDB"".""autogen"".""MetricName""')
.offset(4w).period(period).every(1m).align().groupBy(time(1m))
|shift(4w)
var bj = w1
|join(w2, w3, w3)
.as('w1', 'w2', 'w3', 'w4')
.fill('null')
var b = bj
|eval(lambda: (""w1.mean"" + ""w2.mean"" + ""w3.mean"" + ""w4.mean"") / float(4.0))
.as('avg')
我正在使用Full Outer Join,因为有些星期可能会遗漏一个值,在这种情况下,我会将基线计算为3个现值的平均值。
然而,似乎lambda不支持Mean()或任何此类数学函数。它似乎也不支持检查空值。
有没有办法像这样计算基线?
此外,一旦计算了基线,如何保持缓存以便可以根据基线检查传入的流数据?
任何帮助表示赞赏!谢谢
答案 0 :(得分:0)
首先,尝试在批处理var而不是shift上使用offset。
偏移量将取x前一分钟,小时,天......的值
转移节点应该用于加入过程,例如:
previous
|shift(1w)
|join(current)
......
这里有一个例子: https://github.com/influxdata/kapacitor/issues/746
关于加入4个不同的流,有不同的时间,并且由于我以前的评论,我想它不会起作用...也许用union而不是join节点工作,但不确定!
你总是可以有3个刻度,检查当前到过去一周,2周等等......
答案 1 :(得分:0)
“由于某些星期可能缺少值” -join将永远等待该值,而不发出其他相应的批处理并导致内存泄漏。
| barrier()节点可能有助于解决泄漏,但是尝试访问缺少的点属性时,仍然会出现评估错误。
您想将其拆分为多个脚本,例如一个可以计算所有4个周期的周期,并为每个周期添加一个标记,例如
|default().tag('stream', 'w1')
并将它们发送到
|kapacitorLoopback()
第二个监听您的回送流的脚本,| window()所有到达的点都没有分组,并且无论实际上有多少周期都计算| mean(“ mean”)。
答案 2 :(得分:0)
我最终使用并行运行的C#.NET Core创建UDF,查询InfluxDB,进行数学运算并缓存结果。