我正在尝试使用Kapacitor batch|query生成基线,方法是从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')
我使用完全外连接,因为有些星期可能缺少一个值,在这种情况下,我会将基线计算为3个当前值的平均值。
但是,lambda似乎不支持Mean()或任何类似的数学函数。它似乎也不支持对空值进行检查。
有没有像这样计算基线的方法?
此外,一旦计算出基线,如何缓存它,以便可以根据基线检查传入的流数据?
如有任何帮助,我们不胜感激!谢谢
发布于 2019-09-14 02:43:27
我最终使用C# .NET核心创建了一个自定义函数,作为一个并排运行的进程,查询InfluxDB,计算数学并缓存结果。
发布于 2018-02-27 20:18:26
首先,尝试在批处理变量上使用offset而不是shift。
偏移量将从x之前的分钟、小时、天数中获取值...
在联接过程中应使用shift节点,例如:
previous
|shift(1w)
|join(current)
......
下面是一个示例:https://github.com/influxdata/kapacitor/issues/746
关于加入4个不同的流,使用不同的时间,并且由于我之前的评论,我猜它不会使用联合而不是连接节点工作,但不确定!
您可以始终有3个滴答,检查当前到过去的一周,2周,等等…
发布于 2019-04-26 18:12:43
“因为某些星期可能缺少一个值”- join将永远等待此值,而不会发出其他相应的批处理并导致内存泄漏。
障碍()节点可能有助于泄漏,但您仍然会在尝试访问缺少的点属性时遇到eval错误。
你想把它拆分成多个脚本,例如一个计算所有4个句号的脚本,在每个脚本中添加一个类似这样的标签
|default().tag('stream', 'w1')
并将它们发送到
|kapacitorLoopback()
第二个脚本监听您的环回流,|window()所有到达的点都没有分组并计算|mean("mean"),而不管它实际得到了多少个周期。
https://stackoverflow.com/questions/45445193
复制相似问题