Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐ, เบกเบทเป‰เบ™เบตเป‰เบšเปเปˆเบกเบตเปƒเบœเบ–เบฒเบกเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบเปเบฒ metrics เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™. เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบชเปเบฒเบฅเบฑเบš metrics เบ—เบตเปˆเป€เบเบฑเบšเบเปเบฒ, เป€เบŠเบดเปˆเบ‡เบˆเบฐเปเบˆเป‰เบ‡เปƒเบซเป‰เบŠเบฒเบšเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™ deviations เปƒเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ—เบตเปˆเบชเบฐเบ”เบงเบเบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™ (mail, Slack, Telegram). เปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบญเบ‡เป‚เบฎเบ‡เปเบฎเบกเบญเบญเบ™เป„เบฅเบ™เปŒ Ostrovok.ru metrics เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™ poured เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ InfluxDB เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบ™ Grafana, เปเบฅเบฐเบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบžเบทเป‰เบ™เบ–เบฒเบ™เปเบกเปˆเบ™เบเบฑเบ‡ configured เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เป€เบŠเบฑเปˆเบ™ "เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ„เบดเบ”เป„เบฅเปˆเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเบฐเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเบกเบฑเบ™," เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ Kapacitor.

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor
Kapacitor เปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ stack TICK เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เบˆเบฒเบ InfluxDB. เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบฎเปˆเบงเบกเบเบฑเบ™ (เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก), เบ„เบดเบ”เป„เบฅเปˆเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš, เบ‚เบฝเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™ InfluxDB, เบชเบปเปˆเบ‡เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เป„เบ›เบซเบฒ Slack / Telegram / mail.

stack เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เป€เบขเบฑเบ™เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ” เป€เบญเบเบฐเบชเบฒเบ™, เปเบ•เปˆเบกเบฑเบ™เบˆเบฐเบกเบตเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบขเบนเปˆเปƒเบ™เบ„เบนเปˆเบกเบท. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบฅเบงเบšเบฅเบงเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™ ( syntax เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ TICKscipt เป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบ. เบ—เบตเปˆเบ™เบตเป‰) เปเบฅเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ.

เปƒเบซเป‰เป„เบ›!

float & int, เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ

เป€เบ›เบฑเบ™โ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹เบขเปˆเบฒเบ‡โ€‹เปเบ—เป‰โ€‹เบˆเบดเบ‡โ€‹, เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบŠเบฑเป‰เบ™โ€‹เบงเบฑเบ™เบ™เบฐโ€‹:

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)

เบ•เบทเปˆเบกโ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบชเปˆโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบก (เบžเบฒเบโ€‹เปƒเบ™ vs เบ™เบญเบโ€‹)

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบˆเบฐเบเบปเบเป€เบฅเบตเบเบˆเบธเบ”เบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™ (เบžเบฒเบเปƒเบ™).
เป€เบกเบทเปˆเบญเบ•เบทเปˆเบก ('null') เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบžเบฒเบเบ™เบญเบเบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ () เปเบฅเบฐเบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเปƒเบ™เบ„เปˆเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ:

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

เบเบฑเบ‡เบกเบต nuance เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบ–เป‰เบฒเบŠเบธเบ”เบซเบ™เบถเปˆเบ‡ (res1 เบซเบผเบท res2) เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เบŠเบธเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš (เบ‚เปเป‰เบกเบนเบ™) เบเปเปˆเบˆเบฐเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบกเบตเบซเบผเบฒเบเบ›เบตเป‰เบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เปƒเบ™ Github (1633, 1871, 6967) โ€“ เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบฅเปเบ–เป‰เบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เปเบฅเบฐเบ„เบงเบฒเบกเบ—เบธเบเบ—เปเบฅเบฐเบกเบฒเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ.

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปƒเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ (เบ–เป‰เบฒเบขเบนเปˆเปƒเบ™ lambda)

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

เบซเป‰เบฒเบ™เบฒเบ—เบตเบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฒเบเบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเป„เบฅเบเบฐเป€เบงเบฅเบฒ

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฝเบšเบ—เบฝเบšเบ„เปˆเบฒเบ‚เบญเบ‡เบซเป‰เบฒเบ™เบฒเบ—เบตเบชเบธเบ”เบ—เป‰เบฒเบเบเบฑเบšเบญเบฒเบ—เบดเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบญเบปเบฒโ€‹เบชเบญเบ‡โ€‹เบŠเบธเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบชเบญเบ‡โ€‹เบŠเบธเบ”โ€‹เปเบเบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบซเบฒเบโ€‹เบซเบผเบทโ€‹เป€เบญเบปเบฒโ€‹เบชเปˆเบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เป„เบฅโ€‹เบเบฐโ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เปƒเบซเบเปˆโ€‹เบเบงเปˆเบฒโ€‹:

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

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบšเบซเป‰เบฒเบ™เบฒเบ—เบตเบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ BarrierNode, เป€เบŠเบดเปˆเบ‡เบ•เบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบเปˆเบญเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰:

|barrier()
        .period(5m)

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เปเบกเปˆเปเบšเบš Go เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบก

เปเบกเปˆเปเบšเบšเบเบปเบ‡เบเบฑเบšเบฎเบนเบšเปเบšเบšเบˆเบฒเบเบŠเบธเบ” 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, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ” script เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบœเปˆเบฒเบ™ (stdin) - เบ„เบงเบฒเบกเบ„เบดเบ”เบชเป‰เบฒเบ‡เบชเบฑเบ™เปเบฅเบฐเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบญเบตเบ!

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบžเบฒเบชเบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบชเบฐเบ„เบดเบš Python เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เปƒเบซเป‰ slack.
เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบฎเบนเบšเบžเบฒเบš grafana เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบก. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบฝเบ™ 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 host-or-ip:9092 เบšเบฑเบ™เบ—เบถเบ lvl=error

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบกเบต httpOut

เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ—เปเปˆเบ›เบฐเบˆเบธเบšเบฑเบ™:

|httpOut('something')

เป€เบšเบดเปˆเบ‡ (เป„เบ”เป‰โ€‹เบฎเบฑเบš): host-or-ip:9092/kapacitor/v1/tasks/task_name/เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡

เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹

  • เปเบ•เปˆเบฅเบฐเบงเบฝเบเบ‡เบฒเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™เบ•เบปเป‰เบ™เป„เบกเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบกเบตเบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบฎเบนเบšเปเบšเบš เป€เบชเบฑเป‰เบ™เบชเบฐเปเบ”เบ‡.
  • เป€เบญเบปเบฒเบšเบฅเบฑเบญเบ เบˆเบธเบ”.
  • เบงเบฒเบ‡เบกเบฑเบ™เปƒเบชเปˆ viewer, เบกเปˆเบงเบ™.

เบšเปˆเบญเบ™เบญเบทเปˆเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš rake?

เบเบฒเบ™เบชเบฐเปเบ•เบกเป€เบงเบฅเบฒเปƒเบ™ influxdb เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ„เบทเบ™

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบชเปเบฒเบฅเบฑเบšเบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเบŠเบปเปˆเบงเป‚เบกเบ‡ (groupBy(1h)) เปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ influxdb (เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบชเบงเบเบ‡เบฒเบกเบ‚เบญเบ‡เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เบ‚เบญเบ‡เบšเบฑเบ™เบซเบฒเปƒเบ™เบเบฒเบŸเปƒเบ™ grafana).

influxDBOut() เบˆเบฐเบ‚เบฝเบ™เบ„เปˆเบฒเป€เบงเบฅเบฒเบˆเบฒเบเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒ; เบ•เบฒเบกเบ™เบฑเป‰เบ™, เบˆเบธเบ”เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบˆเบฐเบ–เบทเบเบ‚เบฝเบ™เบเปˆเบญเบ™ / เบŠเป‰เบฒเบเบงเปˆเบฒเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบกเบฒเบฎเบญเบ”.

เป€เบกเบทเปˆเบญเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™: เบžเบงเบเป€เบฎเบปเบฒเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เป‚เบ—เบซเบฒเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ influxdb เบเบฑเบšเป€เบงเบฅเบฒเบ›เบฐเบˆเบธเบšเบฑเบ™.

docker, เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰

เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, kapacitor เบชเบฒเบกเบฒเบ”เป‚เบซเบฅเบ”เบซเบ™เป‰เบฒเบงเบฝเบ, เปเบกเปˆเปเบšเบšเปเบฅเบฐเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™ config เปƒเบ™ [เป‚เบซเบผเบ”] block.

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบŠเบทเปˆเป„เบŸเบฅเปŒ โ€“ เบ‚เบฐเบซเบเบฒเบเป€เบ›เบฑเบ™ script id/name
  2. เบ›เบฐเป€เบžเบ” โ€“ stream/batch
  3. dbrp - เบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™เป€เบžเบทเปˆเบญเบŠเบตเป‰เบšเบญเบเบงเปˆเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ + เบ™เบฐเป‚เบเบšเบฒเบเปƒเบ”เบ—เบตเปˆเบชเบฐเบ„เบดเบšเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ (dbrp "เบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡." "autogen")

เบ–เป‰เบฒเบšเบฒเบ‡เบงเบฝเบ batch เบšเปเปˆเบกเบตเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบกเบต dbrp, เบšเปเบฅเบดเบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ›เบฐเบ•เบดเป€เบชเบ”เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบˆเบฐเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™เบขเปˆเบฒเบ‡เบŠเบทเปˆเบชเบฑเบ”เปƒเบ™เบšเบฑเบ™เบ—เบถเบ.

เปƒเบ™ chronograf, เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เป€เบชเบฑเป‰เบ™เบ™เบตเป‰เบšเปเปˆเบ„เบงเบ™เบกเบตเบขเบนเปˆ; เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบšเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเปเบฅเบฐเบชเป‰เบฒเบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”.

Hack เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบนเป‰เบ„เบญเบ™เป€เบ—เบ™เป€เบ™เบต: Dockerfile เบญเบญเบเบ”เป‰เบงเบ -1 เบ–เป‰เบฒเบกเบตเป€เบชเบฑเป‰เบ™เบ—เบตเปˆเบกเบต //.+dbrp, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ—เบฑเบ™เบ—เบตเบเปˆเบฝเบงเบเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบงเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ›เบฐเบเบญเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡.

เป€เบ‚เบปเป‰เบฒโ€‹เบฎเปˆเบงเบกโ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบเบฑเบšโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹

เบ•เบปเบงเบขเปˆเบฒเบ‡เบงเบฝเบเบ‡เบฒเบ™: เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบชเปˆเบงเบ™เบฎเป‰เบญเบเบ—เบต 95 เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบญเบฒเบ—เบดเบ”, เบ›เบฝเบšเบ—เบฝเบšเปเบ•เปˆเบฅเบฐเบ™เบฒเบ—เบตเบ‚เบญเบ‡ 10 เบชเบธเบ”เบ—เป‰เบฒเบเบ”เป‰เบงเบเบ„เปˆเบฒเบ™เบตเป‰.

เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบซเบ™เบถเปˆเบ‡เบ•เปเปˆเบซเบผเบฒเบ, เบชเบธเบ”เบ—เป‰เบฒเบ / เบชเบฐเป€เบฅเปˆเบ / เบเบฒเบ‡เปƒเบ™เป„เบฅเบเบฐเบเบธเปˆเบกเบ‚เบญเบ‡เบˆเบธเบ”เบ›เปˆเบฝเบ™ node เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฐเบ•เบฃเบตเบก, เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ” "เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ‚เบญเบšเบ—เบตเปˆเบšเปเปˆเบเบปเบ‡เบเบฑเบ™เบ‚เบญเบ‡เป€เบ”เบฑเบเบ™เป‰เบญเบ: batch -> stream" เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡ batch, เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ›เปƒเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡ lambda, เบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ—เบปเบ”เปเบ—เบ™.

เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบšเบฑเบ™เบ—เบถเบเบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบเบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบœเปˆเบฒเบ™ udf เปเบฅเบฐเป‚เบซเบฅเบ”เป„เบŸเบฅเปŒเบ™เบตเป‰เบœเปˆเบฒเบ™ sideload.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปเบเป‰เป„เบ‚เบซเบเบฑเบ‡เบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰?

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡เป‚เบฎเบ‡เปเบฎเบกเบ›เบฐเบกเบฒเบ™ 100 เบ„เบปเบ™, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบซเบผเบฒเบ, เปƒเบซเป‰เป‚เบ—เบซเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบŠเปˆเบญเบ‡เบ—เบฒเบ‡. เบกเบตเบ›เบฐเบกเบฒเบ™ 300 เบŠเปˆเบญเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบชเบฒเบกเบฒเบ”เบฅเบปเป‰เบกเบฅเบปเบ‡เป„เบ”เป‰. เบ‚เบญเบ‡เบ—เบธเบ metrics เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเบญเบฑเบ”เบ•เบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” (เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”).

เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบšเปเปˆ Grafana?

เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™ Grafana เบกเบตเบ‚เปเป‰เป€เบชเบเบซเบผเบฒเบเบขเปˆเบฒเบ‡. เบšเบฒเบ‡เบ„เบปเบ™เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™, เบšเบฒเบ‡เบ„เบปเบ™เบชเบฒเบกเบฒเบ”เบ›เบดเบ”เบ•เบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™.

Grafana เบšเปเปˆเบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบงเบฑเบ”เปเบ—เบ + เบเบฒเบ™เป€เบ•เบทเบญเบ™, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบญเบฑเบ”เบ•เบฒ (requests-errors)/requests.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบ”เบต:

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

เปเบฅเบฐเบ„เบงเบฒเบกเบŠเบปเปˆเบงเบฎเป‰เบฒเบเบซเบ™เป‰เบญเบเบฅเบปเบ‡เป€เบกเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบ”เป‰เบงเบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”:

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

เบ•เบปเบเบฅเบปเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ„เบดเบ”เป„เบฅเปˆเบญเบฑเบ”เบ•เบฒเบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบเปˆเบญเบ™ grafana, เปเบฅเบฐเปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ. เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบžเบงเบเป€เบฎเบปเบฒ, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบญเบฑเบ”เบ•เบฒเบชเปˆเบงเบ™เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบ–เบทเบงเปˆเบฒ "เบ›เบปเบเบเบฐเบ•เบด", เปเบฅเบฐเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบฒเบกเบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆ (เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบžเบงเบเบกเบฑเบ™เบ”เป‰เบงเบเบ•เบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ›เปˆเบฝเบ™เบžเบงเบเบกเบฑเบ™เบ–เป‰เบฒเบกเบตเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เป€เบฅเบทเป‰เบญเบเป†).

เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ "เบ›เบปเบเบเบฐเบ•เบด" เบชเปเบฒเบฅเบฑเบšเบŠเปˆเบญเบ‡เบ—เบฒเบ‡เบ•เปˆเบฒเบ‡เป†:

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบปเบ™เปƒเบˆเบˆเบธเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเปเบฅเบฐเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบฎเบนเบšเบžเบฒเบš "เบ›เบปเบเบเบฐเบ•เบด" เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ”เบต, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบกเบตเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เปƒเบ™ grafana?
เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”, เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเปˆเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบซเบ™เบถเปˆเบ‡เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบ:
เบ) เบชเป‰เบฒเบ‡เบเบฒเบŸเบซเบผเบฒเบเบญเบฑเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบŠเปˆเบญเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ (เปเบฅเบฐเป€เบˆเบฑเบšเบ›เบงเบ”เบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ)
b) เบญเบญเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบซเบ™เบถเปˆเบ‡เบเบฑเบšเบ—เบธเบเบŠเปˆเบญเบ‡เบ—เบฒเบ‡ (เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปƒเบ™เบชเบฒเบเบ—เบตเปˆเบกเบตเบชเบตเบชเบฑเบ™เปเบฅเบฐเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡)

Tricks เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ metrics เปƒเบ™ Kapacitor

เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”เบกเบฑเบ™?

เบญเบตเบเป€เบ—เบทเปˆเบญ เปœเบถเปˆเบ‡, เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบ”เบตเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™ (เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบญเบฑเบ”เบ•เบฒเปƒเบ™เบ—เบปเปˆเบงเบŠเบธเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบก), เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ peeked เบขเบนเปˆเบซเบผเบทเบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ›เบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เปƒเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™.

เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบ™เบ—เบตเปˆเบชเบธเบ”:

  • เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบชเบญเบ‡เบŠเบธเบ”เปƒเบ™เบชเบญเบ‡เบชเบฒเบกเบŠเบปเปˆเบงเป‚เบกเบ‡, เบˆเบฑเบ”เบเบธเปˆเบกเป‚เบ”เบเบŠเปˆเบญเบ‡เบ—เบฒเบ‡;
  • เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเปƒเบ™เบŠเบธเบ”เป‚เบ”เบเบเบธเปˆเบกเบ–เป‰เบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™;
  • เบ›เบฝเบšเบ—เบฝเบšเบ„เปˆเบฒเบชเบฐเป€เบฅเปˆเบเบ‚เบญเบ‡ 10 เบ™เบฒเบ—เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ;
  • เบžเบงเบเป€เบฎเบปเบฒเบฎเป‰เบญเบ‡เบ‚เบถเป‰เบ™เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡;
  • เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบญเบฑเบ”เบ•เบฒเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเปเบฅเบฐเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ influxdb;
  • เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เป€เบžเบทเปˆเบญ slack.

เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบ (เปเบฅเบฐเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบเบซเบผเบฒเบเบเบฑเบšเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™) เบ—เบตเปˆเบชเบงเบเบ‡เบฒเบกเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบ—เบตเปˆ github.com เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ” ะธ เบงเบปเบ‡เบˆเบญเบ™เปœเป‰เบญเบเบ—เบตเปˆเบชเบธเบ” (graphviz) script เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

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)

เบชเบฐเบซเบผเบธเบšเปเบกเปˆเบ™เบซเบเบฑเบ‡?

Kapacitor เปเบกเปˆเบ™เบ”เบตเป€เบฅเบตเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบก - เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เบ—เบตเปˆเบกเบตเบเบธเปˆเบกเบ‚เบญเบ‡เบเบธเปˆเบก, เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ metrics เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปเบฅเป‰เบง, เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡เปเบฅเบฐเปเบฅเปˆเบ™เบชเบฐเบ„เบดเบš (udf).

เบญเบธเบ›เบฐเบชเบฑเบเปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเปเบกเปˆเบ™เบšเปเปˆเบชเบนเบ‡เบซเบผเบฒเบ - เบฅเบญเบ‡เบกเบฑเบ™เบ–เป‰เบฒ grafana เบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบญเบทเปˆเบ™เป†เบšเปเปˆเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster