TICKScript никогда не сбрасывает уровень в OK
Я пишу 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()
Сценарий, похоже, делает свое дело, но есть критическая проблема - никогда не возвращать уровень обратно в 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 ОК. Где все перечисленные выше временные метки находятся в пределах 25-часового периода.
Однако на самом деле происходит то, что я получаю 2 предупреждения и никаких ОК.
Может ли кто-нибудь дать совет о том, как двигаться вперед?
1 ответ
Обновление - коллега рассказал мне об узлах, о которых я понятия не имел. Добавление узла 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()
Винт этот проклятый язык.