เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡, เช†เชœเซ‡ เช•เซ‹เชˆ เชชเซ‚เช›เชคเซเช‚ เชจเชฅเซ€ เช•เซ‡ เชธเซ‡เชตเชพ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพ เชถเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เช†เช—เชณเชจเซเช‚ เชคเชพเชฐเซเช•เชฟเช• เชชเช—เชฒเซเช‚ เช เชเช•เชคเซเชฐเชฟเชค เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชฎเชพเชŸเซ‡ เชšเซ‡เชคเชตเชฃเซ€ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡, เชœเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เชšเซ‡เชจเชฒเซ‹ (เชฎเซ‡เชฒ, เชธเซเชฒเซ‡เช•, เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ) เชฎเชพเช‚ เชกเซ‡เชŸเชพเชฎเชพเช‚ เช•เซ‹เชˆเชชเชฃ เชตเชฟเชšเชฒเชจเซ‹ เชตเชฟเชถเซ‡ เชธเซ‚เชšเชฟเชค เช•เชฐเชถเซ‡. เช“เชจเชฒเชพเชˆเชจ เชนเซ‹เชŸเซ‡เชฒ เชฌเซเช•เชฟเช‚เช— เชธเซ‡เชตเชพเชฎเชพเช‚ Ostrovok.ru เช…เชฎเชพเชฐเซ€ เชธเซ‡เชตเชพเช“เชจเชพ เชคเชฎเชพเชฎ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ InfluxDB เชฎเชพเช‚ เชฐเซ‡เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ Grafana เชฎเชพเช‚ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชšเซ‡เชคเชตเชฃเซ€ เชชเชฃ เชคเซเชฏเชพเช‚ เช—เซ‹เช เชตเซ‡เชฒ เช›เซ‡. "เชคเชฎเชพเชฐเซ‡ เช•เช‚เชˆเช• เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡" เชœเซ‡เชตเชพ เช•เชพเชฐเซเชฏเซ‹ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช.

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“
เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐ เช TICK เชธเซเชŸเซ‡เช•เชจเซ‹ เชเช• เชญเชพเช— เช›เซ‡ เชœเซ‡ InfluxDB เชฅเซ€ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡ เช…เชจเซ‡เช• เชฎเชพเชชเชจเซ‡ เชเช•เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ€ เชถเช•เซ‡ เช›เซ‡ (เชœเซ‹เชกเชพเชถเซ‡), เชชเซเชฐเชพเชชเซเชค เชกเซ‡เชŸเชพเชฎเชพเช‚เชฅเซ€ เช•เช‚เชˆเช• เช‰เชชเชฏเซ‹เช—เซ€ เช—เชฃเซ€ เชถเช•เซ‡ เช›เซ‡, เชชเชฐเชฟเชฃเชพเชฎ InfluxDB เชชเชฐ เชชเชพเช›เซเช‚ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡, Slack/Telegram/mail เชชเชฐ เชšเซ‡เชคเชตเชฃเซ€ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‡ เช›เซ‡.

เชธเชฎเช—เซเชฐ เชธเซเชŸเซ‡เช• เชธเชฐเชธ เช…เชจเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เช›เซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ, เชชเชฐเช‚เชคเซ เชคเซเชฏเชพเช‚ เชนเช‚เชฎเซ‡เชถเชพ เช‰เชชเชฏเซ‹เช—เซ€ เชตเชธเซเชคเซเช“ เชนเชถเซ‡ เชœเซ‡ เชฎเซ‡เชจเซเชฏเซเช…เชฒเชฎเชพเช‚ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชธเซ‚เชšเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจเชฅเซ€. เช† เชฒเซ‡เช–เชฎเชพเช‚, เชฎเซ‡เช‚ เช†เชตเซ€ เช…เชธเช‚เช–เซเชฏ เช‰เชชเชฏเซ‹เช—เซ€, เชฌเชฟเชจ-เชธเซเชชเชทเซเชŸ เชŸเซ€เชชเซเชธ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ (TICKsciptเชจเซเช‚ เชฎเซ‚เชณเชญเซ‚เชค เชตเชพเช•เซเชฏเชฐเชšเชจเชพ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡. เช…เชนเซ€เช‚) เช…เชจเซ‡ เช…เชฎเชพเชฐเซ€ เชธเชฎเชธเซเชฏเชพเช“เชฎเชพเช‚เชฅเซ€ เชเช•เชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡ เชฌเชคเชพเชตเซ‹.

เชšเชพเชฒเซ‹ เชœเชˆเช!

เชซเซเชฒเซ‹เชŸ เช…เชจเซ‡ เชชเซ‚เชฐเซเชฃเชพเช‚เช•, เช—เชฃเชคเชฐเซ€เชจเซ€ เชญเซ‚เชฒเซ‹

เชเช•เชฆเชฎ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเชฎเชธเซเชฏเชพ, เชœเชพเชคเชฟเช“ เชฆเซเชตเชพเชฐเชพ เชนเชฒ:

var alert_float = 5.0
var alert_int = 10
data|eval(lambda: float("value") > alert_float OR float("value") < float("alert_int"))

เชกเชฟเชซเซ‰เชฒเซเชŸ() เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡

เชœเซ‹ เชŸเซ‡เช—/เชซเซ€เชฒเซเชก เชญเชฐเซ‡เชฒ เชจเชฅเซ€, เชคเซ‹ เช—เชฃเชคเชฐเซ€เชจเซ€ เชญเซ‚เชฒเซ‹ เชฅเชถเซ‡:

|default()
        .tag('status', 'empty')
        .field('value', 0)

เชœเซ‹เชกเชพเช“ เชญเชฐเซ‹ (เช†เช‚เชคเชฐเชฟเช• เชตเชฟ เชฌเชพเชนเซเชฏ)

เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, เชœเซ‹เชกเชพเชตเซเช‚ เชคเซ‡ เชฌเชฟเช‚เชฆเซเช“เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชถเซ‡ เชœเซเชฏเชพเช‚ เช•เซ‹เชˆ เชกเซ‡เชŸเชพ (เช†เช‚เชคเชฐเชฟเช•) เชจเชฅเซ€.
เชซเชฟเชฒ('เชจเชฒ') เชธเชพเชฅเซ‡, เชฌเชพเชนเซเชฏ เชœเซ‹เชกเชพเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เชœเซ‡เชจเชพ เชชเช›เซ€ เชคเชฎเชพเชฐเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸ() เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เช–เชพเชฒเซ€ เช•เชฟเช‚เชฎเชคเซ‹ เชญเชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

var data = res1
    |join(res2)
        .as('res1', 'res2)
        .fill('null')
    |default()
        .field('res1.value', 0.0)
        .field('res2.value', 100.0)

เช…เชนเซ€เช‚ เชนเชœเซ เชชเชฃ เชเช• เชธเซ‚เช•เซเชทเซเชฎเชคเชพ เช›เซ‡. เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชœเซ‹ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚เชฅเซ€ เชเช• (res1 เช…เชฅเชตเชพ res2) เช–เชพเชฒเซ€ เช›เซ‡, เชคเซ‹ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชถเซเชฐเซ‡เชฃเซ€ (เชกเซ‡เชŸเชพ) เชชเชฃ เช–เชพเชฒเซ€ เชนเชถเซ‡. เช—เซ€เชฅเชฌ เชชเชฐ เช† เชตเชฟเชทเชฏ เชชเชฐ เช˜เชฃเซ€ เชŸเชฟเช•เชฟเชŸเซ‹ เช›เซ‡ (1633, 1871, 6967) โ€“ เช…เชฎเซ‡ เชธเซเชงเชพเชฐเชพเชจเซ€ เชฐเชพเชน เชœเซ‹เชˆ เชฐเชนเซเชฏเชพ เช›เซ€เช เช…เชจเซ‡ เชฅเซ‹เชกเซ€ เชชเซ€เชกเชพ เช…เชจเซเชญเชตเซ€เช เช›เซ€เช.

เช—เชฃเชคเชฐเซ€เชฎเชพเช‚ เชถเชฐเชคเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ (เชœเซ‹ เชฒเซ‡เชฎเซเชฌเชกเชพเชฎเชพเช‚ เชนเซ‹เชฏ เชคเซ‹)

|eval(lambda: if("value" > 0, true, false)

เชธเชฎเชฏเช—เชพเชณเชพ เชฎเชพเชŸเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚เชฅเซ€ เช›เซ‡เชฒเซเชฒเซ€ เชชเชพเช‚เชš เชฎเชฟเชจเชฟเชŸ

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเชพเชฐเซ‡ เชชเชพเช›เชฒเชพ เช…เช เชตเชพเชกเชฟเชฏเชพ เชธเชพเชฅเซ‡ เช›เซ‡เชฒเซเชฒเชพ เชชเชพเช‚เชš เชฎเชฟเชจเชฟเชŸเชจเชพ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเชฎเซ‡ เชฌเซ‡ เช…เชฒเช—-เช…เชฒเช— เชฌเซ‡เชšเชฎเชพเช‚ เชกเซ‡เชŸเชพเชจเชพ เชฌเซ‡ เชฌเซ‡เชš เชฒเชˆ เชถเช•เซ‹ เช›เซ‹ เช…เชฅเชตเชพ เชฎเซ‹เชŸเชพ เชธเชฎเชฏเช—เชพเชณเชพเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเซ‹ เชเช• เชญเชพเช— เช•เชพเชขเซ€ เชถเช•เซ‹ เช›เซ‹:

 |where(lambda: duration((unixNano(now()) - unixNano("time"))/1000, 1u) < 5m)

เช›เซ‡เชฒเซเชฒเซ€ เชชเชพเช‚เชš เชฎเชฟเชจเชฟเชŸเชจเซ‹ เชตเชฟเช•เชฒเซเชช เชฌเซ‡เชฐเชฟเชฏเชฐเชจเซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชนเชถเซ‡, เชœเซ‡ เชจเชฟเชฐเซเชฆเชฟเชทเซเชŸ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชกเซ‡เชŸเชพเชจเซ‡ เช•เชพเชชเซ€ เชจเชพเช–เซ‡ เช›เซ‡:

|barrier()
        .period(5m)

เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เช—เซ‹ เชŸเซ‡เชฎเซเชชเซเชฒเซ‡เชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹

เชจเชฎเซ‚เชจเชพเช“ เชชเซ‡เช•เซ‡เชœเชฎเชพเช‚เชฅเซ€ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ text.templateเชจเซ€เชšเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชตเชพเชฐเช‚เชตเชพเชฐ เช†เชตเชคเซ€ เช•เซ‹เชฏเชกเชพเช“ เช›เซ‡.

เชœเซ‹ เชฌเซ€เชœเซ

เช…เชฎเซ‡ เชตเชธเซเชคเซเช“เชจเซ‡ เชตเซเชฏเชตเชธเซเชฅเชฟเชค เชฐเชพเช–เซ€เช เช›เซ€เช เช…เชจเซ‡ เชฒเซ‹เช•เซ‹เชจเซ‡ เชซเชฐเซ€ เชเช•เชตเชพเชฐ เชŸเซ‡เช•เซเชธเซเชŸ เชธเชพเชฅเซ‡ เชŸเซเชฐเชฟเช—เชฐ เช•เชฐเชคเชพ เชจเชฅเซ€:

|alert()
    ...
    .message(
        '{{ if eq .Level "OK" }}It is ok now{{ else }}Chief, everything is broken{{end}}'
    )

เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เชฆเชถเชพเช‚เชถ เชฌเชฟเช‚เชฆเซ เชชเช›เซ€เชจเชพ เชฌเซ‡ เช…เช‚เช•

เชธเช‚เชฆเซ‡เชถเชจเซ€ เชตเชพเช‚เชšเชจเช•เซเชทเชฎเชคเชพเชฎเชพเช‚ เชธเซเชงเชพเชฐเซ‹:

|alert()
    ...
    .message(
        'now value is {{ index .Fields "value" | printf "%0.2f" }}'
    )

เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เชšเชฒเซ‹เชจเซเช‚ เชตเชฟเชธเซเชคเชฐเชฃ

"เชคเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เชšเซ€เชธเซ‹ เชชเชพเชกเซ‡ เช›เซ‡" เชชเซเชฐเชถเซเชจเชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€เช เช›เซ€เช?

var warnAlert = 10
  |alert()
    ...
    .message(
       'Today value less then '+string(warnAlert)+'%'
    )

เช…เชจเชจเซเชฏ เชšเซ‡เชคเชตเชฃเซ€ เช“เชณเช–เช•เชฐเซเชคเชพ

เชœเซเชฏเชพเชฐเซ‡ เชกเซ‡เชŸเชพเชฎเชพเช‚ เชเช• เช•เชฐเชคเชพเช‚ เชตเชงเซ เชœเซ‚เชฅ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เชตเชธเซเชคเซ เช›เซ‡, เช…เชจเซเชฏเชฅเชพ เชซเช•เซเชค เชเช• เชšเซ‡เชคเชตเชฃเซ€ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡:

|alert()
      ...
      .id('{{ index .Tags "myname" }}/{{ index .Tags "myfield" }}')

เช•เชธเซเชŸเชฎ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ€

เชนเซ‡เชจเซเชกเชฒเชฐเซเชธเชจเซ€ เชฎเซ‹เชŸเซ€ เชธเซ‚เชšเชฟเชฎเชพเช‚ execเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ เชคเชฎเชจเซ‡ เชชเชพเชธ เช•เชฐเซ‡เชฒเชพ เชชเชฐเชฟเชฎเชพเชฃเซ‹ (stdin) เชธเชพเชฅเซ‡ เชคเชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ - เชธเชฐเซเชœเชจเชพเชคเซเชฎเช•เชคเชพ เช…เชจเซ‡ เชตเชงเซ เช•เช‚เชˆ เชจเชนเซ€เช‚!

เช…เชฎเชพเชฐเชพ เชฐเชฟเชตเชพเชœเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เชธเซเชฒเซ‡เช• เชชเชฐ เชธเซ‚เชšเชจเชพเช“ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชจเชพเชจเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡.
เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เช…เชฎเซ‡ เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ-เชธเช‚เชฐเช•เซเชทเชฟเชค เช—เซเชฐเชพเชซเชจเชพ เชšเชฟเชคเซเชฐ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเช—เชคเชพ เชนเชคเชพ. เชชเช›เซ€เชฅเซ€, เชธเชฎเชพเชจ เชœเซ‚เชฅเชฎเชพเช‚เชฅเซ€ เช…เช—เชพเช‰เชจเซ€ เชšเซ‡เชคเชตเชฃเซ€ เชชเชฐ เชฅเซเชฐเซ‡เชกเชฎเชพเช‚ OK เชฒเช–เซ‹, เช…เชฒเช— เชธเช‚เชฆเซ‡เชถ เชคเชฐเซ€เช•เซ‡ เชจเชนเซ€เช‚. เชฅเซ‹เชกเซ€ เชตเชพเชฐ เชชเช›เซ€ - เช›เซ‡เชฒเซเชฒเชพ X เชฎเชฟเชจเชฟเชŸเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชญเซ‚เชฒ เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹.

เชเช• เช…เชฒเช— เชตเชฟเชทเชฏ เช เช…เชจเซเชฏ เชธเซ‡เชตเชพเช“ เชธเชพเชฅเซ‡เชจเซ‹ เชธเช‚เชšเชพเชฐ เช…เชจเซ‡ เชšเซ‡เชคเชตเชฃเซ€ เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เช•เชฐเชพเชฏเซ‡เชฒเซ€ เช•เซ‹เชˆเชชเชฃ เช•เซเชฐเชฟเชฏเชพเช“ เช›เซ‡ (เชซเช•เซเชค เชœเซ‹ เชคเชฎเชพเชฐเซเช‚ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เชคเซ‹).
เชนเซ‡เชจเซเชกเชฒเชฐ เชตเชฐเซเชฃเชจเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ, เชœเซเชฏเชพเช‚ slack_handler.py เช เช†เชชเชฃเซ€ เชธเซเชต-เชฒเชฟเช–เชฟเชค เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช›เซ‡:

topic: slack_graph
id: slack_graph.alert
match: level() != INFO AND changed() == TRUE
kind: exec
options:
  prog: /sbin/slack_handler.py
  args: ["-c", "CHANNELID", "--graph", "--search"]

เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเซเช‚?

เชฒเซ‹เช— เช†เช‰เชŸเชชเซเชŸ เชธเชพเชฅเซ‡ เชตเชฟเช•เชฒเซเชช

|log()
      .level("error")
      .prefix("something")

เช˜เชกเชฟเชฏเชพเชณ (cli): kapacitor -url เชนเซ‹เชธเซเชŸ-เช…เชฅเชตเชพ-เช†เชˆเชชเซ€:9092 เชฒเซ‹เช— lvl=error

httpOut เชธเชพเชฅเซ‡ เชตเชฟเช•เชฒเซเชช

เชตเชฐเซเชคเชฎเชพเชจ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชฌเชคเชพเชตเซ‡ เช›เซ‡:

|httpOut('something')

เชœเซเช“ (เชฎเซ‡เชณเชตเซ‹): เชนเซ‹เชธเซเชŸ-เช…เชฅเชตเชพ-เช†เชˆเชชเซ€:9092/kapacitor/v1/tasks/task_name/something

เช…เชฎเชฒ เชฏเซ‹เชœเชจเชพ

  • เชฆเชฐเซ‡เช• เช•เชพเชฐเซเชฏ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช—เซ€ เชธเช‚เช–เซเชฏเชพเช“ เชธเชพเชฅเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชŸเซเชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เช—เซเชฐเชพเชซเชตเชฟเช.
  • เชเช• เชฌเซเชฒเซ‹เช• เชฒเซ‹ เชกเซ‹เชŸ.
  • เชคเซ‡เชจเซ‡ เชฆเชฐเซเชถเช•เชฎเชพเช‚ เชชเซ‡เชธเซเชŸ เช•เชฐเซ‹, เช†เชจเช‚เชฆ.

เชคเชฎเซ‡ เชฐเซ‡เช• เช•เซเชฏเชพเช‚เชฅเซ€ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹?

เชฐเชพเช‡เชŸเชฌเซ‡เช• เชชเชฐ influxdb เชฎเชพเช‚ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชฎเซ‡ เชชเซเชฐเชคเชฟ เช•เชฒเชพเช• (เชœเซ‚เชฅเชฌเชพเชฏ(1h)) เชตเชฟเชจเช‚เชคเซ€เช“เชจเชพ เชธเชฐเชตเชพเชณเชพ เชฎเชพเชŸเซ‡ เชเช• เชšเซ‡เชคเชตเชฃเซ€ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ influxdb เชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชšเซ‡เชคเชตเชฃเซ€เชจเซ‡ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช (เช—เซเชฐเชพเชซเชจเชพเชฎเชพเช‚ เช—เซเชฐเชพเชซ เชชเชฐ เชธเชฎเชธเซเชฏเชพเชจเซ€ เชนเช•เซ€เช•เชคเชจเซ‡ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡).

influxDBOut() เชšเซ‡เชคเชตเชฃเซ€เชฅเซ€ เชŸเชพเชˆเชฎเชธเซเชŸเซ‡เชฎเซเชช เชชเชฐ เชธเชฎเชฏ เชฎเซ‚เชฒเซเชฏ เชฒเช–เชถเซ‡; เชคเซ‡ เชฎเซเชœเชฌ, เชšเชพเชฐเซเชŸ เชชเชฐเชจเซ‹ เชฎเซเชฆเซเชฆเซ‹ เชšเซ‡เชคเชตเชฃเซ€ เช†เชตเซเชฏเชพ เช•เชฐเชคเชพเช‚ เชตเชนเซ‡เชฒเซ‹/เชชเช›เซ€เชฅเซ€ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชœเซเชฏเชพเชฐเซ‡ เชšเซ‹เช•เชธเชพเชˆเชจเซ€ เช†เชตเชถเซเชฏเช•เชคเชพ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡: เช…เชฎเซ‡ เช•เชธเซเชŸเชฎ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ€เชจเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซเช‚ เชธเชฎเชพเชงเชพเชจ เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชŸเชพเชˆเชฎเชธเซเชŸเซ‡เชฎเซเชช เชธเชพเชฅเซ‡ influxdb เชชเชฐ เชกเซ‡เชŸเชพ เชฒเช–เชถเซ‡.

เชกเซ‹เช•เชฐ, เชฌเชฟเชฒเซเชก เช…เชจเซ‡ เชœเชฎเชพเชตเชŸ

เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชตเช–เชคเซ‡, เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐ [เชฒเซ‹เชก] เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เช•เชพเชฐเซเชฏเซ‹, เชจเชฎเซ‚เชจเชพเช“ เช…เชจเซ‡ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช•เชพเชฐเซเชฏเชจเซ‡ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชตเชธเซเชคเซเช“เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  1. เชซเชพเช‡เชฒเชจเซเช‚ เชจเชพเชฎ - เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช†เชˆเชกเซ€/เชจเชพเชฎเชฎเชพเช‚ เชตเชฟเชธเซเชคเซƒเชค
  2. เชชเซเชฐเช•เชพเชฐ - เชธเซเชŸเซเชฐเซ€เชฎ/เชฌเซ‡เชš
  3. dbrp โ€“ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช•เชฏเชพ เชกเซ‡เชŸเชพเชฌเซ‡เช + เชชเซ‹เชฒเชฟเชธเซ€เชฎเชพเช‚ เชšเชพเชฒเซ‡ เช›เซ‡ เชคเซ‡ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เช•เซ€เชตเชฐเซเชก (dbrp โ€œเชธเชชเซเชฒเชพเชฏเชฐ.โ€ โ€œเช“เชŸเซ‹เชœเชจโ€)

เชœเซ‹ เช•เซ‡เชŸเชฒเชพเช• เชฌเซ‡เชš เช•เชพเชฐเซเชฏเชฎเชพเช‚ dbrp เชธเชพเชฅเซ‡เชจเซ€ เชฒเชพเช‡เชจ เชถเชพเชฎเซ‡เชฒ เชจเชฅเซ€, เชคเซ‹ เชธเชฎเช—เซเชฐ เชธเซ‡เชตเชพ เชถเชฐเซ‚ เชฅเชตเชพเชจเซ‹ เช‡เชจเช•เชพเชฐ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชฒเซ‹เช—เชฎเชพเช‚ เชชเซเชฐเชฎเชพเชฃเชฟเช•เชชเชฃเซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชฒเช–เชถเซ‡.

เช•เซเชฐเซ‹เชจเซ‹เช—เซเชฐเชพเชซเชฎเชพเช‚, เชคเซ‡เชจเชพเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เช† เชฐเซ‡เช–เชพ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช เชจเชนเซ€เช‚; เชคเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชฆเซเชตเชพเชฐเชพ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€ เช…เชจเซ‡ เชญเซ‚เชฒ เชชเซ‡เชฆเชพ เช•เชฐเซ‡ เช›เซ‡.

เช•เชจเซเชŸเซ‡เชจเชฐ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชนเซ‡เช• เช•เชฐเซ‹: เชกเซ‹เช•เชฐเชซเชพเชˆเชฒ -1 เชธเชพเชฅเซ‡ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ‡ เช›เซ‡ เชœเซ‹ เชคเซเชฏเชพเช‚ //.+dbrp เชธเชพเชฅเซ‡ เชฐเซ‡เช–เชพเช“ เชนเซ‹เชฏ, เชœเซ‡ เชคเชฎเชจเซ‡ เชฌเชฟเชฒเซเชก เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชจเชฟเชทเซเชซเชณเชคเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชคเชฐเชค เชœ เชธเชฎเชœเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเชถเซ‡.

เชเช•เชฅเซ€ เช˜เชฃเชพเชฎเชพเช‚ เชœเซ‹เชกเชพเช“

เช‰เชฆเชพเชนเชฐเชฃ เช•เชพเชฐเซเชฏ: เชคเชฎเชพเชฐเซ‡ เชเช• เช…เช เชตเชพเชกเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชตเชพเชจเชพ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชธเชฎเชฏเชจเซ€ 95เชฎเซ€ เชŸเช•เชพเชตเชพเชฐเซ€ เชฒเซ‡เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช† เชฎเซ‚เชฒเซเชฏ เชธเชพเชฅเซ‡ เช›เซ‡เชฒเซเชฒเชพ 10 เชจเซ€ เชฆเชฐเซ‡เช• เชฎเชฟเชจเชฟเชŸเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‹.

เชคเชฎเซ‡ เชเช•-เชฅเซ€-เช˜เชฃเชพ เชœเซ‹เชกเชพเชˆ เชถเช•เชคเชพ เชจเชฅเซ€, เชชเซ‹เชˆเชจเซเชŸเซเชธเชจเชพ เชœเซ‚เชฅ เชชเชฐ เช›เซ‡เชฒเซเชฒเซเช‚/เชฎเชงเซเชฏเชฎ/เชฎเชงเซเชฏเชฎ เชจเซ‹เชกเชจเซ‡ เชธเซเชŸเซเชฐเซ€เชฎเชฎเชพเช‚ เชซเซ‡เชฐเชตเซ‡ เช›เซ‡, เชญเซ‚เชฒ "เชšเชพเชˆเชฒเซเชก เชฎเซ‡เชณ เชจ เช–เชพเชคเซ€ เช•เชฟเชจเชพเชฐเซ€เช“ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€: เชฌเซ‡เชš -> เชธเซเชŸเซเชฐเซ€เชฎ" เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชฌเซ‡เชšเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ, เชฒเซ‡เชฎเซเชฌเชกเชพ เช…เชญเชฟเชตเซเชฏเช•เซเชคเชฟเชฎเชพเช‚ เชšเชฒ เชคเชฐเซ€เช•เซ‡, เชชเชฃ เช…เชตเซ‡เชœเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซเช‚ เชจเชฅเซ€.

เชชเซเชฐเชฅเชฎ เชฌเซ‡เชšเชฎเชพเช‚เชฅเซ€ เชœเชฐเซ‚เชฐเซ€ เชจเช‚เชฌเชฐเซ‹เชจเซ‡ udf เชฆเซเชตเชพเชฐเชพ เชซเชพเช‡เชฒเชฎเชพเช‚ เชธเซ‡เชต เช•เชฐเชตเชพเชจเซ‹ เช…เชจเซ‡ เช† เชซเชพเช‡เชฒเชจเซ‡ เชธเชพเช‡เชกเชฒเซ‹เชก เชฆเซเชตเชพเชฐเชพ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ‹ เชตเชฟเช•เชฒเซเชช เช›เซ‡.

เช…เชฎเซ‡ เช† เชธเชพเชฅเซ‡ เชถเซเช‚ เช‰เช•เซ‡เชฒเซเชฏเซเช‚?

เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฒเช—เชญเช— 100 เชนเซ‹เชŸเซ‡เชฒ เชธเชชเซเชฒเชพเชฏเชฐเซเชธ เช›เซ‡, เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เชชเชพเชธเซ‡ เช…เชจเซ‡เช• เชœเซ‹เชกเชพเชฃเซ‹ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชšเซ‡เชจเชฒ เช•เชนเซ€เช. เช†เชฎเชพเช‚เชจเซ€ เชฒเช—เชญเช— 300 เชšเซ‡เชจเชฒเซ‹ เช›เซ‡, เชฆเชฐเซ‡เช• เชšเซ‡เชจเชฒเซ‹ เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡. เชคเชฎเชพเชฎ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‡เชฒ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชฎเชพเช‚เชฅเซ€, เช…เชฎเซ‡ เชญเซ‚เชฒ เชฆเชฐ (เชตเชฟเชจเช‚เชคเชฟเช“ เช…เชจเซ‡ เชญเซ‚เชฒเซ‹) เชชเชฐ เชจเชœเชฐ เชฐเชพเช–เซ€เชถเซเช‚.

เชถเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซเชจเชพ เชจเชฅเซ€?

เช—เซเชฐเชพเชซเชจเชพเชฎเชพเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เชญเซ‚เชฒ เชšเซ‡เชคเชตเชฃเซ€เช“เชฎเชพเช‚ เช˜เชฃเชพ เช—เซ‡เชฐเชซเชพเชฏเชฆเชพ เช›เซ‡. เช•เซ‡เชŸเชฒเซ€เช• เชœเชŸเชฟเชฒ เช›เซ‡, เช•เซ‡เชŸเชฒเซ€เช• เชคเชฎเซ‡ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเชพ เช†เชงเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ€ เช†เช‚เช–เซ‹ เชฌเช‚เชง เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เช—เซเชฐเชพเชซเชจเชพเชจเซ‡ เชฎเชพเชช + เชšเซ‡เชคเชตเชฃเซ€ เชตเชšเซเชšเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเซ€ เชคเซ‡ เช–เชฌเชฐ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช…เชฎเชจเซ‡ เชฆเชฐ (เชตเชฟเชจเช‚เชคเซ€-เชญเซ‚เชฒเซ‹)/เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชญเซ‚เชฒเซ‹ เช–เชฐเชพเชฌ เชฒเชพเช—เซ‡ เช›เซ‡:

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชธเชซเชณ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเชพเชฅเซ‡ เชœเซ‹เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เช“เช›เซเช‚ เชฆเซเชทเซเชŸ:

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เช เซ€เช• เช›เซ‡, เช…เชฎเซ‡ เช—เซเชฐเชพเชซเชจเชพ เชชเชนเซ‡เชฒเชพเช‚ เชธเซ‡เชตเชพเชฎเชพเช‚ เชฆเชฐเชจเซ€ เชชเซ‚เชฐเซเชต-เช—เชฃเชคเชฐเซ€ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เช…เชจเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เช† เช•เชพเชฎ เช•เชฐเชถเซ‡. เชชเชฃ เช†เชชเชฃเชพเชฎเชพเช‚ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡... เชฆเชฐเซ‡เช• เชšเซ‡เชจเชฒ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เช—เซเชฃเซ‹เชคเซเชคเชฐ "เชธเชพเชฎเชพเชจเซเชฏ" เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชšเซ‡เชคเชตเชฃเซ€เช“ เชธเซเชฅเชฟเชฐ เชฎเซ‚เชฒเซเชฏเซ‹ เช…เชจเซเชธเชพเชฐ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ (เช…เชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เช…เชฎเชพเชฐเซ€ เช†เช‚เช–เซ‹เชฅเซ€ เชถเซ‹เชงเซ€เช เช›เซ€เช, เชœเซ‹ เชตเชพเชฐเช‚เชตเชพเชฐ เชšเซ‡เชคเชตเชฃเซ€เช“ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡เชฎเชจเซ‡ เชฌเชฆเชฒเซ€เช เช›เซ€เช).

เช† เชตเชฟเชตเชฟเชง เชšเซ‡เชจเชฒเซ‹ เชฎเชพเชŸเซ‡ "เชธเชพเชฎเชพเชจเซเชฏ" เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹ เช›เซ‡:

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เช…เชฎเซ‡ เชชเชพเช›เชฒเชพ เชฎเซเชฆเซเชฆเชพเชจเซ‡ เช…เชตเช—เชฃเซ€เช เช›เซ€เช เช…เชจเซ‡ เชงเชพเชฐเซ€เช เช›เซ€เช เช•เซ‡ "เชธเชพเชฎเชพเชจเซเชฏ" เชšเชฟเชคเซเชฐ เชฌเชงเชพ เชธเชชเซเชฒเชพเชฏเชฐเซเชธ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เช›เซ‡. เชนเชตเซ‡ เชฌเชงเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡, เช…เชจเซ‡ เช†เชชเชฃเซ‡ เช—เซเชฐเชพเชซเชจเชพเชฎเชพเช‚ เชšเซ‡เชคเชตเชฃเซ€เช“ เชธเชพเชฅเซ‡ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ€เช?
เช…เชฎเซ‡ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช, เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เช–เชฐเซ‡เช–เชฐ เช‡เชšเซเช›เชคเชพ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เช†เชชเชฃเซ‡ เชตเชฟเช•เชฒเซเชชเซ‹เชฎเชพเช‚เชฅเซ€ เชเช• เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡:
a) เชฆเชฐเซ‡เช• เชšเซ‡เชจเชฒ เชฎเชพเชŸเซ‡ เช…เชฒเช—เชฅเซ€ เช˜เชฃเชพ เชฌเชงเชพ เช—เซเชฐเชพเชซ เชฌเชจเชพเชตเซ‹ (เช…เชจเซ‡ เชชเซ€เชกเชพเชฆเชพเชฏเช• เชฐเซ€เชคเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเชพเชฅเซ‡)
b) เชฌเชงเซ€ เชšเซ‡เชจเชฒเซ‹ เชธเชพเชฅเซ‡ เชเช• เชšเชพเชฐเซเชŸ เช›เซ‹เชกเซ‹ (เช…เชจเซ‡ เชฐเช‚เช—เซ€เชจ เชฐเซ‡เช–เชพเช“ เช…เชจเซ‡ เช•เชธเซเชŸเชฎเชพเช‡เชเซเชก เชšเซ‡เชคเชตเชฃเซ€เช“เชฎเชพเช‚ เช–เซ‹เชตเชพเชˆ เชœเชพเช“)

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐเชฎเชพเช‚ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฏเซเช•เซเชคเชฟเช“

เชคเชฎเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซเชฏเซเช‚?

เชซเชฐเซ€เชฅเซ€, เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชฎเชพเช‚ เชเช• เชธเชพเชฐเซเช‚ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡ (เชœเซ‹เชกเชพเชฏเซ‡เชฒเซ€ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เชฆเชฐเซ‹เชจเซ€ เช—เชฃเชคเชฐเซ€), เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ เช…เชฅเชตเชพ เชธเชฎเชพเชจ เชธเชฎเชธเซเชฏเชพเช“เชจเชพ เช†เชงเชพเชฐ เชคเชฐเซ€เช•เซ‡ เชฒเชˆ เชถเช•เชพเชฏ เช›เซ‡.

เช…เชฎเซ‡ เช…เช‚เชคเซ‡ เชถเซเช‚ เช•เชฐเซเชฏเซเช‚:

  • เชšเซ‡เชจเชฒเซ‹ เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅเชฌเชฆเซเชง เช•เชฐเซ€เชจเซ‡ เชฅเซ‹เชกเชพ เช•เชฒเชพเช•เซ‹เชฎเชพเช‚ เชฌเซ‡ เชถเซเชฐเซ‡เชฃเซ€เชฎเชพเช‚ เชœเซ‹เชกเชพเช“;
  • เชœเซ‹ เช•เซ‹เชˆ เชกเซ‡เชŸเชพ เชจ เชนเซ‹เชฏ เชคเซ‹ เชœเซ‚เชฅ เชฆเซเชตเชพเชฐเชพ เชถเซเชฐเซ‡เชฃเซ€ เชญเชฐเซ‹;
  • เชชเชพเช›เชฒเชพ เชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช›เซ‡เชฒเซเชฒเซ€ 10 เชฎเชฟเชจเชฟเชŸเชจเชพ เชธเชฐเซ‡เชฐเชพเชถเชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‹;
  • เชœเซ‹ เช…เชฎเชจเซ‡ เช•เช‚เชˆเช• เชฎเชณเซ‡ เชคเซ‹ เช…เชฎเซ‡ เชชเซ‹เช•เชพเชฐ เช•เชฐเซ€เช เช›เซ€เช;
  • เช…เชฎเซ‡ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‡เชฒ เชฆเชฐเซ‹ เช…เชจเซ‡ เชšเซ‡เชคเชตเชฃเซ€เช“ เชฒเช–เซ€เช เช›เซ€เช เชœเซ‡ influxdb เชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€;
  • เชธเซเชฒเซ…เช•เชจเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเซ‹.

เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช…เชฎเซ‡ เช…เช‚เชคเชฎเชพเช‚ (เช…เชจเซ‡ เช•เชธเซเชŸเชฎ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชธเชพเชฅเซ‡ เชฅเซ‹เชกเซเช‚ เชตเชงเซ) เชฎเซ‡เชณเชตเชตเชพ เช‡เชšเซเช›เชคเชพ เชนเชคเชพ เชคเซ‡ เชฌเชงเซเช‚ เชถเช•เซเชฏ เชคเซ‡เชŸเชฒเซ€ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซเชฏเซเช‚.

เชคเชฎเซ‡ github.com เชชเชฐ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‹เชก เช‰เชฆเชพเชนเชฐเชฃ ะธ เชจเซเชฏเซ‚เชจเชคเชฎ เชธเชฐเซเช•เชฟเชŸ (เช—เซเชฐเชพเชซเชตเชฟเช) เชชเชฐเชฟเชฃเชพเชฎเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ.

เชชเชฐเชฟเชฃเชพเชฎเซ€ เช•เซ‹เชกเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ:

dbrp "supplier"."autogen"
var name = 'requests.rate'
var grafana_dash = 'pczpmYZWU/mydashboard'
var grafana_panel = '26'
var period = 8h
var todayPeriod = 10m
var every = 1m
var warnAlert = 15
var warnReset = 5
var reqQuery = 'SELECT sum("count") AS value FROM "supplier"."autogen"."requests"'
var errQuery = 'SELECT sum("count") AS value FROM "supplier"."autogen"."errors"'

var prevErr = batch
    |query(errQuery)
        .period(period)
        .every(every)
        .groupBy(1m, 'channel', 'supplier')

var prevReq = batch
    |query(reqQuery)
        .period(period)
        .every(every)
        .groupBy(1m, 'channel', 'supplier')

var rates = prevReq
    |join(prevErr)
        .as('req', 'err')
        .tolerance(1m)
        .fill('null')
    // ะทะฐะฟะพะปะฝัะตะผ ะทะฝะฐั‡ะตะฝะธั ะฝัƒะปัะผะธ, ะตัะปะธ ะธั… ะฝะต ะฑั‹ะปะพ
    |default()
        .field('err.value', 0.0)
        .field('req.value', 0.0)
    // if ะฒ lambda: ัั‡ะธั‚ะฐะตะผ ั€ะตะนั‚, ั‚ะพะปัŒะบะพ ะตัะปะธ ะพัˆะธะฑะบะธ ะฑั‹ะปะธ
    |eval(lambda: if("err.value" > 0, 100.0 * (float("req.value") - float("err.value")) / float("req.value"), 100.0))
        .as('rate')

// ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฟะพัั‡ะธั‚ะฐะฝะฝั‹ะต ะทะฝะฐั‡ะตะฝะธั ะฒ ะธะฝั„ะปัŽะบั
rates
    |influxDBOut()
        .quiet()
        .create()
        .database('kapacitor')
        .retentionPolicy('autogen')
        .measurement('rates')

// ะฒั‹ะฑะธั€ะฐะตะผ ะดะฐะฝะฝั‹ะต ะทะฐ ะฟะพัะปะตะดะฝะธะต 10 ะผะธะฝัƒั‚, ัั‡ะธั‚ะฐะตะผ ะผะตะดะธะฐะฝัƒ
var todayRate = rates
    |where(lambda: duration((unixNano(now()) - unixNano("time")) / 1000, 1u) < todayPeriod)
    |median('rate')
        .as('median')

var prevRate = rates
    |median('rate')
        .as('median')

var joined = todayRate
    |join(prevRate)
        .as('today', 'prev')
    |httpOut('join')

var trigger = joined
    |alert()
        .warn(lambda: ("prev.median" - "today.median") > warnAlert)
        .warnReset(lambda: ("prev.median" - "today.median") < warnReset)
        .flapping(0.25, 0.5)
        .stateChangesOnly()
        // ัะพะฑะธั€ะฐะตะผ ะฒ message ััั‹ะปะบัƒ ะฝะฐ ะณั€ะฐั„ะธะบ ะดะฐัˆะฑะพั€ะดะฐ ะณั€ะฐั„ะฐะฝั‹
        .message(
            '{{ .Level }}: {{ index .Tags "channel" }} err/req ratio ({{ index .Tags "supplier" }})
{{ if eq .Level "OK" }}It is ok now{{ else }}
'+string(todayPeriod)+' median is {{ index .Fields "today.median" | printf "%0.2f" }}%, by previous '+string(period)+' is {{ index .Fields "prev.median" | printf "%0.2f" }}%{{ end }}
http://grafana.ostrovok.in/d/'+string(grafana_dash)+
'?var-supplier={{ index .Tags "supplier" }}&var-channel={{ index .Tags "channel" }}&panelId='+string(grafana_panel)+'&fullscreen&tz=UTC%2B03%3A00'
        )
        .id('{{ index .Tags "name" }}/{{ index .Tags "channel" }}')
        .levelTag('level')
        .messageField('message')
        .durationField('duration')
        .topic('slack_graph')

// "today.median" ะดัƒะฑะปะธั€ัƒะตะผ ะบะฐะบ "value", ั‚ะฐะบะถะต ะฟะธัˆะตะผ ะฒ ะธะฝั„ะปัŽะบั ะพัั‚ะฐะปัŒะฝั‹ะต ั„ะธะปะดั‹ ะฐะปะตั€ั‚ะฐ (keep)
trigger
    |eval(lambda: "today.median")
        .as('value')
        .keep()
    |influxDBOut()
        .quiet()
        .create()
        .database('kapacitor')
        .retentionPolicy('autogen')
        .measurement('alerts')
        .tag('alertName', name)

เชถเซเช‚ เช›เซ‡ เชคเชพเชฐเชฃ?

เช•เซ‡เชชเซ‡เชธเชฟเชŸเชฐ เชœเซ‚เชฅเซ‹เชจเชพ เชธเชฎเซ‚เชน เชธเชพเชฅเซ‡ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—-เช…เชฒเชฐเซเชŸ เช•เชฐเชตเชพ, เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‡เชฒ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธเชจเชพ เช†เชงเชพเชฐเซ‡ เชตเชงเชพเชฐเชพเชจเซ€ เช—เชฃเชคเชฐเซ€เช“ เช•เชฐเชตเชพ, เช•เชธเซเชŸเชฎ เช•เซเชฐเชฟเชฏเชพเช“ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ (เชฏเซเชกเซ€เชเชซ) เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช‰เชคเซเชคเชฎ เช›เซ‡.

เชชเซเชฐเชตเซ‡เชถ เชฎเชพเชŸเซ‡เชจเซ‹ เช…เชตเชฐเซ‹เชง เช–เซ‚เชฌ เชตเชงเชพเชฐเซ‡ เชจเชฅเซ€ - เชœเซ‹ เช—เซเชฐเชพเชซเชจเชพ เช…เชฅเชตเชพ เช…เชจเซเชฏ เชธเชพเชงเชจเซ‹ เชคเชฎเชพเชฐเซ€ เช‡เชšเซเช›เชพเช“เชจเซ‡ เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชธเช‚เชคเซ‹เชทเชคเชพ เชจเชฅเซ€, เชคเซ‹ เชคเซ‡เชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹