Kapacitor Lambda意思

时间:2017-08-01 18:26:20

标签: influxdb kapacitor

我试图通过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()或任何此类数学函数。它似乎也不支持检查空值。

有没有办法像这样计算基线?

此外,一旦计算了基线,如何保持缓存以便可以根据基线检查传入的流数据?

任何帮助表示赞赏!谢谢

3 个答案:

答案 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,进行数学运算并缓存结果。