āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āϏāĻŽā§āĻ­āĻŦāϤ, āφāϜ āϕ⧇āω āϜāĻŋāĻœā§āĻžāĻžāϏāĻž āĻ•āϰ⧇ āύāĻž āϕ⧇āύ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϝ⧌āĻ•ā§āϤāĻŋāĻ• āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āĻšāϞ āϏāĻ‚āĻ—ā§ƒāĻšā§€āϤ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻž āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻž, āϝāĻž āφāĻĒāύāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ• āĻšā§āϝāĻžāύ⧇āϞ⧇ (āĻŽā§‡āϞ, āĻ¸ā§āĻ˛ā§āϝāĻžāĻ•, āĻŸā§‡āϞāĻŋāĻ—ā§āϰāĻžāĻŽ) āĻĄā§‡āϟāĻžāϤ⧇ āϕ⧋āύ⧋ āĻŦāĻŋāĻšā§āϝ⧁āϤāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ…āĻŦāĻšāĻŋāϤ āĻ•āϰāĻŦ⧇āĨ¤ āĻ…āύāϞāĻžāχāύ āĻšā§‹āĻŸā§‡āϞ āĻŦ⧁āĻ•āĻŋāĻ‚ āϏ⧇āĻŦāĻž Ostrovok.ru āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϏāĻŽāĻ¸ā§āϤ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ InfluxDB-āϤ⧇ āĻĸ⧇āϞ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ Grafana-āĻ āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ⧇ āĻŽā§ŒāϞāĻŋāĻ• āϏāϤāĻ°ā§āĻ•āϤāĻžāĻ“ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ "āφāĻĒāύāĻžāϕ⧇ āĻ•āĻŋāϛ⧁ āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋāϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰāϤ⧇ āĻšāĻŦ⧇" āĻāϰ āĻŽāϤ⧋ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋāĨ¤

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ
Kapacitor āĻšāϞ TICK āĻ¸ā§āĻŸā§āϝāĻžāϕ⧇āϰ āĻ…āĻ‚āĻļ āϝāĻž InfluxDB āĻĨ⧇āϕ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻāĻ•āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ (āϝ⧋āĻ—āĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇), āĻĒā§āϰāĻžāĻĒā§āϤ āĻĄā§‡āϟāĻž āĻĨ⧇āϕ⧇ āĻĻāϰāĻ•āĻžāϰ⧀ āĻ•āĻŋāϛ⧁ āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻĢāϞāĻžāĻĢāϞāϟāĻŋ InfluxDB-āϤ⧇ āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰ⧇, Slack/Telegram/mail āĻ āĻāĻ•āϟāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻž āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻŸā§āϝāĻžāĻ• āĻļāĻžāĻ¨ā§āϤ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻŦāϏāĻŽāϝāĻŧ āĻĻāϰāĻ•āĻžāϰ⧀ āϜāĻŋāύāĻŋāϏ āĻĨāĻžāĻ•āĻŦ⧇ āϝāĻž āĻŽā§āϝāĻžāύ⧁āϝāĻŧāĻžāϞāϗ⧁āϞāĻŋāϤ⧇ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāϤ āύāϝāĻŧāĨ¤ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāĻŋ āĻāχ āϧāϰāύ⧇āϰ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āĻĻāϰāĻ•āĻžāϰ⧀, āĻ…-āĻ¸ā§āĻĒāĻˇā§āϟ āϟāĻŋāĻĒāϏ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ (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)

āϝ⧋āĻ—āĻĻāĻžāύ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύ (āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻŦāύāĻžāĻŽ āĻŦāĻžāχāϰ⧇āϰ)

āĻĄāĻŋāĻĢāĻ˛ā§āϟāϰ⧂āĻĒ⧇, āϝ⧋āĻ—āĻĻāĻžāύ āĻāĻŽāύ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰāĻŦ⧇ āϝ⧇āĻ–āĻžāύ⧇ āϕ⧋āύāĻ“ āĻĄā§‡āϟāĻž āύ⧇āχ (āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ)āĨ¤
fill('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) āĻ–āĻžāϞāĻŋ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āϏāĻŋāϰāĻŋāϜ (āĻĄā§‡āϟāĻž)āĻ“ āĻ–āĻžāϞāĻŋ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤ āĻ—āĻŋāĻĨ⧁āĻŦ⧇ āĻāχ āĻŦāĻŋāώāϝāĻŧ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϟāĻŋāĻ•āĻŋāϟ āϰāϝāĻŧ⧇āϛ⧇ (1633, 1871, 6967) – āφāĻŽāϰāĻž āϏāĻ‚āĻļā§‹āϧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻ›āĻŋ āĻāĻŦāĻ‚ āĻāĻ•āϟ⧁ āĻ•āĻˇā§āϟ āĻ•āϰāĻ›āĻŋāĨ¤

āĻ—āĻŖāύāĻžāϝāĻŧ āĻļāĻ°ā§āϤ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž (āϝāĻĻāĻŋ āĻ˛ā§āϝāĻžāĻŽā§āĻŦāĻĄāĻžāϝāĻŧ āĻĨāĻžāϕ⧇)

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

āĻĒāĻŋāϰāĻŋāϝāĻŧāĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻĒāĻžāχāĻĒāϞāĻžāχāύ āĻĨ⧇āϕ⧇ āĻļ⧇āώ āĻĒāĻžāρāϚ āĻŽāĻŋāύāĻŋāϟ

āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻĒāύāĻžāϕ⧇ āφāϗ⧇āϰ āϏāĻĒā§āϤāĻžāĻšā§‡āϰ āϏāĻžāĻĨ⧇ āĻļ⧇āώ āĻĒāĻžāρāϚ āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŽāĻžāύ āϤ⧁āϞāύāĻž āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāĻĒāύāĻŋ āĻĻ⧁āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻŦā§āϝāĻžāĻšā§‡ āĻĄā§‡āϟāĻžāϰ āĻĻ⧁āϟāĻŋ āĻŦā§āϝāĻžāϚ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻŦāĻž āĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŧ āϏāĻŽāϝāĻŧ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻžāϰ āĻ…āĻ‚āĻļ āĻŦ⧇āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

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

āĻļ⧇āώ āĻĒāĻžāρāϚ āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦā§āϝāĻžāϰāĻŋāϝāĻŧāĻžāϰāύ⧋āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇, āϝāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽāϝāĻŧ⧇āϰ āφāϗ⧇ āĻĄā§‡āϟāĻž āϕ⧇āĻŸā§‡ āĻĻ⧇āϝāĻŧ:

|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, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻĒāĻžāϏ āĻ•āϰāĻž āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ (stdin) āĻĻāĻŋāϝāĻŧ⧇ āφāĻĒāύāĻžāϰ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϚāĻžāϞāĻžāύ⧋āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧ - āϏ⧃āϜāύāĻļā§€āϞāϤāĻž āĻāĻŦāĻ‚ āĻāϰ āĻŦ⧇āĻļāĻŋ āĻ•āĻŋāϛ⧁ āύāϝāĻŧ!

āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāĻ¸ā§āϟāĻŽāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻšāϞ āĻ¸ā§āĻ˛ā§āϝāĻžāϕ⧇ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻĒāĻžāχāĻĨāύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāĨ¤
āĻĒā§āϰāĻĨāĻŽā§‡, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āĻŽā§‹āĻĻāύ-āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻ—ā§āϰāĻžāĻĢāύāĻž āĻ›āĻŦāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āĻšā§‡āϝāĻŧ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āϤāĻžāϰāĻĒāϰ⧇, āĻāĻ•āχ āĻ—ā§āϰ⧁āĻĒ⧇āϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϏāϤāĻ°ā§āĻ•āϤāĻžāϝāĻŧ āĻĨā§āϰ⧇āĻĄā§‡ āĻ āĻŋāĻ• āφāϛ⧇ āϞāĻŋāϖ⧁āύ, āφāϞāĻžāĻĻāĻž āĻŦāĻžāĻ°ā§āϤāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āύāϝāĻŧāĨ¤ āĻāĻ•āϟ⧁ āĻĒāϰ⧇ - āĻļ⧇āώ 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=āĻ¤ā§āϰ⧁āϟāĻŋ

httpOut āϏāĻš āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ

āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĒāĻžāχāĻĒāϞāĻžāχāύ⧇ āĻĄā§‡āϟāĻž āĻĻ⧇āĻ–āĻžāϝāĻŧ:

|httpOut('something')

āĻĻ⧇āϖ⧁āύ (āĻĒāĻžāύ): āĻšā§‹āĻ¸ā§āϟ-āĻŦāĻž-āφāχāĻĒāĻŋ:9092/kapacitor/v1/tasks/task_name/something

āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻļāύ āĻ¸ā§āĻ•āĻŋāĻŽ

  • āĻĒā§āϰāϤāĻŋāϟāĻŋ āϟāĻžāĻ¸ā§āĻ• āĻĢāϰāĻŽā§āϝāĻžāĻŸā§‡ āĻĻāϰāĻ•āĻžāϰ⧀ āϏāĻ‚āĻ–ā§āϝāĻž āϏāĻš āĻāĻ•āϟāĻŋ āĻāĻ•ā§āϏāĻŋāĻ•āĻŋāωāĻļāύ āĻŸā§āϰāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āĻ—ā§āϰāĻžāĻĢāĻ­āĻŋāϜ.
  • āĻāĻ•āϟāĻŋ āĻŦā§āϞāĻ• āύāĻŋāύ āĻĄāϟ.
  • āĻ­āĻŋāωāϝāĻŧāĻžāϰ⧇ āĻĒ⧇āĻ¸ā§āϟ āĻ•āϰ⧁āύ, āωāĻĒāĻ­ā§‹āĻ—.

āφāϰ āϕ⧋āĻĨāĻžāϝāĻŧ āϰ⧇āĻ• āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ?

āϰāĻžāχāϟāĻŦā§āϝāĻžāϕ⧇ āχāύāĻĢā§āϞāĻžāĻ•ā§āϏāĻĄāĻŋāĻŦāĻŋāϤ⧇ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ

āωāĻĻāĻžāĻšāϰāĻŖ āĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻŽāϰāĻž āĻĒā§āϰāϤāĻŋ āϘāĻ¨ā§āϟāĻžāϝāĻŧ (groupBy(1h)) āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϝ⧋āĻ—āĻĢāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻž āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ influxdb-āĻ āϏāĻ‚āϘāϟāĻŋāϤ āϏāϤāĻ°ā§āĻ•āϤāĻžāϟāĻŋ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāϤ⧇ āϚāĻžāχ (āĻ—ā§āϰāĻžāĻĢāύāĻžāϰ āĻ—ā§āϰāĻžāĻĢ⧇ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋāϰ āϏāĻ¤ā§āϝāϤāĻž āϏ⧁āĻ¨ā§āĻĻāϰāĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ)āĨ¤

influxDBOut() āϏāϤāĻ°ā§āĻ•āϤāĻž āĻĨ⧇āϕ⧇ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ⧇ āϏāĻŽāϝāĻŧ⧇āϰ āĻŽāĻžāύ āϞāĻŋāĻ–āĻŦ⧇; āϏ⧇āχ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€, āϚāĻžāĻ°ā§āĻŸā§‡āϰ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāϟāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻž āφāϏāĻžāϰ āφāϗ⧇/āĻĒāϰ⧇ āϞ⧇āĻ–āĻž āĻšāĻŦ⧇āĨ¤

āϝāĻ–āύ āύāĻŋāĻ°ā§āϭ⧁āϞāϤāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāϝāĻŧ: āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰāϕ⧇ āĻ•āϞ āĻ•āϰ⧇ āĻāχ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻŋ, āϝāĻž āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ⧇āϰ āϏāĻžāĻĨ⧇ influxdb-āĻ āĻĄā§‡āϟāĻž āϞāĻŋāĻ–āĻŦ⧇āĨ¤

āĻĄāĻ•āĻžāϰ, āύāĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž

āĻ¸ā§āϟāĻžāĻ°ā§āϟāφāĻĒ⧇, āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ [āϞ⧋āĻĄ] āĻŦā§āϞāϕ⧇āϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻž āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋ āĻĨ⧇āϕ⧇ āĻ•āĻžāϜ, āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻāĻŦāĻ‚ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āϟāĻžāĻ¸ā§āĻ• āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϰ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϜāĻŋāύāĻŋāϏāϗ⧁āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ:

  1. āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽ - āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āφāχāĻĄāĻŋ/āύāĻžāĻŽā§‡ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ
  2. āĻĒā§āϰāĻ•āĻžāϰ - āĻ¸ā§āĻŸā§āϰāĻŋāĻŽ/āĻŦā§āϝāĻžāϚ
  3. dbrp – āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϕ⧋āύ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ + āĻĒāϞāĻŋāϏāĻŋāϤ⧇ āϚāϞ⧇ āϤāĻž āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ (dbrp "āϏāϰāĻŦāϰāĻžāĻšāĻ•āĻžāϰ⧀āĨ¤""āĻ…āĻŸā§‹āĻœā§‡āύ")

āϝāĻĻāĻŋ āĻ•āĻŋāϛ⧁ āĻŦā§āϝāĻžāϚ āϟāĻžāĻ¸ā§āϕ⧇ dbrp-āĻāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āϞāĻžāχāύ āύāĻž āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻĒ⧁āϰ⧋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻ…āĻ¸ā§āĻŦā§€āĻ•āĻžāϰ āĻ•āϰāĻŦ⧇ āĻāĻŦāĻ‚ āϏāϤāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϞāϗ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϞāĻŋāĻ–āĻŦ⧇āĨ¤

āĻ•ā§āϰ⧋āύ⧋āĻ—ā§āϰāĻžāĻĢ⧇, āĻŦāĻŋāĻĒāϰ⧀āϤ⧇, āĻāχ āϞāĻžāχāύāϟāĻŋ āĻĨāĻžāĻ•āĻž āωāϚāĻŋāϤ āύāϝāĻŧ; āĻāϟāĻŋ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ—ā§ƒāĻšā§€āϤ āĻšāϝāĻŧ āύāĻž āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻ• āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻšā§āϝāĻžāĻ• āĻ•āϰ⧁āύ: āĻĄāĻ•āĻžāϰāĻĢāĻžāχāϞ -1 āĻĻāĻŋāϝāĻŧ⧇ āĻĒā§āϰāĻ¸ā§āĻĨāĻžāύ āĻ•āϰ⧇ āϝāĻĻāĻŋ //.+dbrp āĻāϰ āϏāĻžāĻĨ⧇ āϞāĻžāχāύ āĻĨāĻžāϕ⧇, āϝāĻž āφāĻĒāύāĻžāϕ⧇ āĻŦāĻŋāĻ˛ā§āĻĄāϟāĻŋ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āĻ•āĻžāϰāĻŖāϟāĻŋ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻŦ⧁āĻāϤ⧇ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻŦ⧇āĨ¤

āĻāĻ• āĻĨ⧇āϕ⧇ āĻ…āύ⧇āϕ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ— āĻĻāĻŋāύ

āωāĻĻāĻžāĻšāϰāĻŖ āϟāĻžāĻ¸ā§āĻ•: āφāĻĒāύāĻžāϕ⧇ āĻāĻ• āϏāĻĒā§āϤāĻžāĻšā§‡āϰ āϜāĻ¨ā§āϝ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŽāϝāĻŧ⧇āϰ 95 āϤāĻŽ āĻļāϤāĻžāĻ‚āĻļ āύāĻŋāϤ⧇ āĻšāĻŦ⧇, āĻāχ āĻŽāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻļ⧇āώ 10 āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āϤ⧁āϞāύāĻž āĻ•āϰ⧁āύāĨ¤

āφāĻĒāύāĻŋ āĻāĻ•-āĻĨ⧇āϕ⧇-āĻ…āύ⧇āĻ• āϝ⧋āĻ—āĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻž, āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻāĻ•āϟāĻŋ āĻ—ā§‹āĻˇā§āĻ ā§€āϰ āωāĻĒāϰ āĻļ⧇āώ/āĻŽāĻ§ā§āϝ/āĻŽāĻ§ā§āϝ āύ⧋āĻĄāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϰ⧀āĻŽā§‡ āĻĒāϰāĻŋāĻŖāϤ āĻ•āϰ⧇, āĻ¤ā§āϰ⧁āϟāĻŋ "āϚāĻžāχāĻ˛ā§āĻĄ āĻŽā§‡āϞ⧇ āύāĻž āĻšāĻ“āϝāĻŧāĻž āĻĒā§āϰāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž: āĻŦā§āϝāĻžāϚ -> āĻ¸ā§āĻŸā§āϰ⧀āĻŽ" āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāĻŦ⧇āĨ¤

āĻ˛ā§āϝāĻžāĻŽā§āĻŦāĻĄāĻž āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ⧇ āĻāĻ•āϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāĻļā§€āϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻšā§‡āϰ āĻĢāϞāĻžāĻĢāϞāĻ“ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϝāĻŧ āύāĻžāĨ¤

āĻĒā§āϰāĻĨāĻŽ āĻŦā§āϝāĻžāϚ āĻĨ⧇āϕ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āύāĻŽā§āĻŦāϰāϗ⧁āϞāĻŋ udf-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĢāĻžāχāϞ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āĻāĻŦāĻ‚ āϏāĻžāχāĻĄāϞ⧋āĻĄā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻāχ āĻĢāĻžāχāϞāϟāĻŋ āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āϰāϝāĻŧ⧇āϛ⧇āĨ¤

āφāĻŽāϰāĻž āĻāϟāĻž āĻĻāĻŋāϝāĻŧ⧇ āĻ•āĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āĻ›āĻŋ?

āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻžāϝāĻŧ 100 āĻšā§‹āĻŸā§‡āϞ āϏāϰāĻŦāϰāĻžāĻšāĻ•āĻžāϰ⧀ āϰāϝāĻŧ⧇āϛ⧇, āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇āϰ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϏāĻ‚āϝ⧋āĻ— āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇, āφāϏ⧁āύ āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāύ⧇āϞ āĻŦāϞāĻŋāĨ¤ āĻāχ āĻšā§āϝāĻžāύ⧇āϞāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāĻžāϝāĻŧ 300 āϟāĻŋ āĻšā§āϝāĻžāύ⧇āϞ āϰāϝāĻŧ⧇āϛ⧇, āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻšā§āϝāĻžāύ⧇āϞ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϏāĻŽāĻ¸ā§āϤ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž āĻŽā§‡āĻŸā§āϰāĻŋāĻ•āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇, āφāĻŽāϰāĻž āĻ¤ā§āϰ⧁āϟāĻŋāϰ āĻšāĻžāϰ (āĻ…āύ⧁āϰ⧋āϧ āĻāĻŦāĻ‚ āĻ¤ā§āϰ⧁āϟāĻŋ) āύāĻŋāϰ⧀āĻ•ā§āώāĻŖ āĻ•āϰāĻŦāĨ¤

āĻ—ā§āϰāĻžāĻĢāύāĻž āύāϝāĻŧ āϕ⧇āύ?

Grafana-āĻ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻ¤ā§āϰ⧁āϟāĻŋ āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āĻ…āϏ⧁āĻŦāĻŋāϧāĻž āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻ•āĻŋāϛ⧁ āϏāĻŽāĻžāϞ⧋āϚāύāĻžāĻŽā§‚āϞāĻ•, āĻ•āĻŋāϛ⧁ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻšā§‹āĻ– āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇.

Grafana āĻĒāϰāĻŋāĻŽāĻžāĻĒ + āϏāϤāĻ°ā§āĻ•āϤāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āϜāĻžāύ⧇ āύāĻž, āϤāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āĻšāĻžāϰ (āĻ…āύ⧁āϰ⧋āϧ-āĻ¤ā§āϰ⧁āϟāĻŋ)/āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤

āĻ¤ā§āϰ⧁āϟāĻŋāϗ⧁āϞāĻŋ āĻ–āĻžāϰāĻžāĻĒ āĻĻ⧇āĻ–āĻžāĻšā§āϛ⧇:

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āĻāĻŦāĻ‚ āϏāĻĢāϞ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻžāĻĨ⧇ āĻĻ⧇āĻ–āĻž āĻšāϞ⧇ āĻ•āĻŽ āĻŽāĻ¨ā§āĻĻ:

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āĻ āĻŋāĻ• āφāϛ⧇, āφāĻŽāϰāĻž āĻ—ā§āϰāĻžāĻĢāύāĻžāϰ āφāϗ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āϰ⧇āϟ āĻĒā§āϰāĻžāĻ•-āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āĻāĻŦāĻ‚ āĻ•āĻŋāϛ⧁ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāϟāĻŋ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇āĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻžāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āύāϝāĻŧ, āĻ•āĻžāϰāĻŖ... āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻšā§āϝāĻžāύ⧇āϞ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻžāϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻ…āύ⧁āĻĒāĻžāϤāϕ⧇ "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ, āĻāĻŦāĻ‚ āϏāϤāĻ°ā§āĻ•āϤāĻžāϗ⧁āϞāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻŋāĻ• āĻŽāĻžāύ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āĻ•āĻžāϜ āĻ•āϰ⧇ (āφāĻŽāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻšā§‹āĻ– āĻĻāĻŋāϝāĻŧ⧇ āϤāĻžāĻĻ⧇āϰ āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻŋ, āϘāύ āϘāύ āϏāϤāĻ°ā§āĻ•āϤāĻž āĻĨāĻžāĻ•āϞ⧇ āϏ⧇āϗ⧁āϞāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ)āĨ¤

āĻāϗ⧁āϞāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻšā§āϝāĻžāύ⧇āϞ⧇āϰ āϜāĻ¨ā§āϝ "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" āĻāϰ āωāĻĻāĻžāĻšāϰāĻŖ:

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āφāĻŽāϰāĻž āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āωāĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāĻŋ āϝ⧇ "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" āϚāĻŋāĻ¤ā§āϰāϟāĻŋ āϏāĻŽāĻ¸ā§āϤ āϏāϰāĻŦāϰāĻžāĻšāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āχ āϰāĻ•āĻŽāĨ¤ āĻāĻ–āύ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ āĻŋāĻ• āφāϛ⧇, āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āĻ—ā§āϰāĻžāĻĢāύāĻž āĻŽāĻ§ā§āϝ⧇ āϏāϤāĻ°ā§āĻ•āϤāĻž āϏāĻ™ā§āϗ⧇ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ?
āφāĻŽāϰāĻž āĻĒāĻžāϰāĻŋ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāϰāĻž āϏāĻ¤ā§āϝāĻŋāχ āϚāĻžāχ āύāĻž, āĻ•āĻžāϰāĻŖ āφāĻŽāĻžāĻĻ⧇āϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇:
āĻ•) āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻšā§āϝāĻžāύ⧇āϞ⧇āϰ āϜāĻ¨ā§āϝ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāϚ⧁āϰ āĻ—ā§āϰāĻžāĻĢ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ (āĻāĻŦāĻ‚ āĻŦ⧇āĻĻāύāĻžāĻĻāĻžāϝāĻŧāĻ•āĻ­āĻžāĻŦ⧇ āϤāĻžāĻĻ⧇āϰ āϏāĻžāĻĨ⧇)
āĻ–) āϏāĻŽāĻ¸ā§āϤ āĻšā§āϝāĻžāύ⧇āϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āϚāĻžāĻ°ā§āϟ āϛ⧇āĻĄāĻŧ⧇ āĻĻāĻŋāύ (āĻāĻŦāĻ‚ āϰāĻ™āĻŋāύ āϞāĻžāχāύ āĻāĻŦāĻ‚ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜāĻĄ āϏāϤāĻ°ā§āĻ•āϤāĻžāϝāĻŧ āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāύ)

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ⧇ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻ•ā§ŒāĻļāϞ

āϤ⧁āĻŽāĻŋ āĻāϟāĻž āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āϰāϞ⧇?

āφāĻŦāĻžāϰ, āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ⧇ āĻāĻ•āϟāĻŋ āĻ­āĻžāϞ āĻļ⧁āϰ⧁āϰ āωāĻĻāĻžāĻšāϰāĻŖ āϰāϝāĻŧ⧇āϛ⧇ (āϝ⧋āĻ— āĻšāĻ“āϝāĻŧāĻž āϏāĻŋāϰāĻŋāϜ āϜ⧁āĻĄāĻŧ⧇ āĻšāĻžāϰ āĻ—āĻŖāύāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇), āĻ…āύ⧁āϰ⧂āĻĒ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋāϤ⧇ āωāρāĻ•āĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻŦāĻž āύ⧇āĻ“āϝāĻŧāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āφāĻŽāϰāĻž āĻļ⧇āώ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϝāĻž āĻ•āϰ⧇āĻ›āĻŋ:

  • āĻ•āϝāĻŧ⧇āĻ• āϘāĻ¨ā§āϟāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻĻ⧁āϟāĻŋ āϏāĻŋāϰāĻŋāĻœā§‡ āϝ⧋āĻ—āĻĻāĻžāύ āĻ•āϰ⧁āύ, āĻšā§āϝāĻžāύ⧇āϞ āĻĻā§āĻŦāĻžāϰāĻž āĻ—ā§āϰ⧁āĻĒāĻŋāĻ‚ āĻ•āϰ⧁āύ;
  • āϝāĻĻāĻŋ āϕ⧋āύāĻ“ āĻĄā§‡āϟāĻž āύāĻž āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āĻ—ā§āϰ⧁āĻĒ āĻ…āύ⧁āϏāĻžāϰ⧇ āϏāĻŋāϰāĻŋāϜāϟāĻŋ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύ;
  • āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĄā§‡āϟāĻžāϰ āϏāĻžāĻĨ⧇ āĻļ⧇āώ 10 āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŽāĻ§ā§āϝāĻŽāĻž āϤ⧁āϞāύāĻž āĻ•āϰ⧁āύ;
  • āφāĻŽāϰāĻž āĻ•āĻŋāϛ⧁ āĻĒ⧇āϞ⧇ āϚāĻŋā§ŽāĻ•āĻžāϰ āĻ•āϰāĻŋ;
  • āφāĻŽāϰāĻž āχāύāĻĢā§āϞāĻžāĻ•ā§āϏāĻĄāĻŋāĻŦāĻŋāϤ⧇ āϏāĻ‚āϘāϟāĻŋāϤ āĻ—āĻŖāύāĻžāĻ•ā§ƒāϤ āĻšāĻžāϰ āĻāĻŦāĻ‚ āϏāϤāĻ°ā§āĻ•āϤāĻžāϗ⧁āϞāĻŋ āϞāĻŋāĻ–āĻŋ;
  • āĻļāĻŋāĻĨāĻŋāϞ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĻāϰāĻ•āĻžāϰ⧀ āĻŦāĻžāĻ°ā§āϤāĻž āĻĒāĻžāĻ āĻžāύāĨ¤

āφāĻŽāĻžāϰ āĻŽāϤ⧇, āφāĻŽāϰāĻž āϝāϤāϟāĻž āϏāĻŽā§āĻ­āĻŦ āϏ⧁āĻ¨ā§āĻĻāϰāĻ­āĻžāĻŦ⧇ āĻļ⧇āώ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ (āĻāĻŦāĻ‚ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āφāϰāĻ“ āĻāĻ•āϟ⧁ āĻŦ⧇āĻļāĻŋ) āĻĒ⧇āϤ⧇ āĻšā§‡āϝāĻŧ⧇āĻ›āĻŋāϞāĻžāĻŽ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ…āĻ°ā§āϜāύ āĻ•āϰāϤ⧇ āĻĒ⧇āϰ⧇āĻ›āĻŋāĨ¤

āφāĻĒāύāĻŋ 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)

āĻāĻŦāĻ‚ āωāĻĒāϏāĻ‚āĻšāĻžāϰ āĻ•āĻŋ?

āĻ•ā§āϝāĻžāĻĒāĻžāϏāĻŋāϟāϰ āĻāĻ•āϗ⧁āĻšā§āĻ› āĻ—ā§āϰ⧁āĻĒāĻŋāĻ‚ āϏāĻš āĻŽāύāĻŋāϟāϰāĻŋāĻ‚-āϏāϤāĻ°ā§āĻ•āϤāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇, āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰāĻž āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ—āĻŖāύāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇, āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϗ⧁āϞāĻŋ (udf) āϚāĻžāϞāĻžāϤ⧇ āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤāĨ¤

āĻĒā§āϰāĻŦ⧇āĻļ⧇āϰ āĻŦāĻžāϧāĻž āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āύāϝāĻŧ - āϝāĻĻāĻŋ āĻ—ā§āϰāĻžāĻĢāĻžāύāĻž āĻŦāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏāϰāĻžā§āϜāĻžāĻŽāϗ⧁āϞāĻŋ āφāĻĒāύāĻžāϰ āχāĻšā§āĻ›āĻžāϕ⧇ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ⧇ āϏāĻ¨ā§āϤ⧁āĻˇā§āϟ āύāĻž āĻ•āϰ⧇ āϤāĻŦ⧇ āĻāϟāĻŋ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster