0

我正在编写一个 TickScript,它作用于一系列可能有两个结果的点。

结果要么是通过,要么是“不通过”(通常是退出 NUM 的一些变体)。

我的脚本看起来像这样:

// RP: autogen
// Monitor the result of updates
// WARNING if the result is anything other than pass
batch
    |query('''SELECT * FROM "mydb"."autogen"."measurement"''')
        .period(25h)
        .every(24h)
        .groupBy('host')
    |alert()
        .id('kapacitor/{{ .TaskName }}/{{ .Group }}')
        .infoReset(lambda: TRUE)
        .warn(lambda: "result" != 'pass')
        .message(
            '{{ index .Tags "host" }}' +
            '{{ if eq .Level "OK" }} are updating again.' +
            '{{ else }}' +
            'are failing to update.' +
            '{{ end }}'
        )
        .idField('id')
        .levelField('level')
        .messageField('description')
        .stateChangesOnly()
    @alertFilterAdapter()
    @alertFilter()

该脚本似乎确实在做它的事情,但有一个关键问题是永远不会将 Level 设置回 OK。

如果我喂大量涌入这 4 点:

time                host     name                   result
----                ----     ----                   ------
1544079584447374994 fakeS176 /usr/bin/yum update -y pass
1544079584447374994 fakeS177 /usr/bin/yum update -y exit 1
1544129084447375177 fakeS176 /usr/bin/yum update -y exit 1
1544129084447375177 fakeS177 /usr/bin/yum update -y pass

我期望 1 个警告和 1 个 OK。上面列出的所有时间戳都在 25 小时内。

然而,实际发生的是我收到 2 个警告并且没有 OK。

有人可以就如何前进提供一些建议吗?

4

1 回答 1

0

更新 - 一位同事告诉我一个我不知道的节点。添加一个 last() 节点并添加一个 as(),然后删除 infoReset() 节点似乎可以做到这一点。

// RP: autogen
// Monitor the result of updates
// WARNING if the result is anything other than pass
batch
    |query('''SELECT * FROM "mydb"."autogen"."measurement"''')
        .period(25h)
        .every(24h)
        .groupBy('host')
    |last('result')
         .as('result')
    |alert()
        .id('kapacitor/{{ .TaskName }}/{{ .Group }}')
        .warn(lambda: "result" != 'pass')
        .message(
            '{{ index .Tags "host" }}' +
            '{{ if eq .Level "OK" }} are updating again.' +
            '{{ else }}' +
            'are failing to update.' +
            '{{ end }}'
        )
        .idField('id')
        .levelField('level')
        .messageField('description')
        .stateChangesOnly()
    @alertFilterAdapter()
    @alertFilter()

搞砸这该死的语言。

于 2018-12-16T16:38:19.687 回答