Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

ВСроятно, сСгодня ΡƒΠΆΠ΅ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос, Π·Π°Ρ‡Π΅ΠΌ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ сСрвисов. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ шаг – Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π»Π΅Ρ€Ρ‚ΠΈΠ½Π³ Π½Π° собранныС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡ‚ΡŒ ΠΎ Π»ΡŽΠ±Ρ‹Ρ… отклонСниях Π² Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Π²Π°ΠΌ ΠΊΠ°Π½Π°Π»Ρ‹ (ΠΏΠΎΡ‡Ρ‚Ρƒ, Slack, Telegram). Π’ сСрвисС ΠΎΠ½Π»Π°ΠΉΠ½-бронирования ΠΎΡ‚Π΅Π»Π΅ΠΉ Ostrovok.ru всС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π°ΡˆΠΈΡ… сСрвисов ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π² InfluxDB ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² Grafana, Ρ‚Π°ΠΌ ΠΆΠ΅ настроСн Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π°Π»Π΅Ρ€Ρ‚ΠΈΠ½Π³. Для Π·Π°Π΄Π°Ρ‡ Β«Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с этим» ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Kapacitor.

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor
Kapacitor – это Ρ‡Π°ΡΡ‚ΡŒ TICK-стСка, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈΠ· InfluxDB. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ (join), ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² InfluxDB ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π°Π»Π΅Ρ€Ρ‚ Π² Slack/Telegram/ΠΏΠΎΡ‡Ρ‚Ρƒ.

Π’Π΅ΡΡŒ стСк ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΈ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ докумСнтацията, Π½ΠΎ всСгда найдутся ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² ΠΌΠ°Π½ΡƒΠ°Π»Π°Ρ…. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ€Π΅ΡˆΠΈΠ» ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ряд Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… совСтов (основной синтаксис 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()

Если Ρ‚Π΅Π³/ΠΏΠΎΠ»Π΅ Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ошибки Π² вычислСниях:

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

fill Π² join (inner vs outer)

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ join отбросит Ρ‚ΠΎΡ‡ΠΊΠΈ, Π³Π΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅Ρ‚ (inner).
ΠŸΡ€ΠΈ fill(β€˜null’) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ outer join, послС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ default() ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ пустыС значСния:

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

Однако Π΅ΡΡ‚ΡŒ нюанс. Если Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΎΠ΄Π½Π° ΠΈΠ· сСрий (res1 ΠΈΠ»ΠΈ res2) Π±ΡƒΠ΄Π΅Ρ‚ пустой, итоговая сСрия (data) Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ пустой. На эту Ρ‚Π΅ΠΌΡƒ Π΅ΡΡ‚ΡŒ нСсколько Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΎΠ² Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅ (1633, 1871, 6967) – ΠΆΠ΄Π΅ΠΌ фиксов ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ страдаСм.

ИспользованиС условий Π² вычислСниях (if Π² lambda)

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

ПослСдниС ΠΏΡΡ‚ΡŒ ΠΌΠΈΠ½ΡƒΡ‚ ΠΈΠ· ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄

НапримСр, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ значСния послСдних пяти ΠΌΠΈΠ½ΡƒΡ‚ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π½Π΅Π΄Π΅Π»Π΅ΠΉ. МоТно Π²Π·ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΏΠ°Ρ‡ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… двумя ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ batch’ами ΠΈΠ»ΠΈ Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· большСго ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π°:

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

АлтСрнативата Π·Π° послСднитС ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΎΠ΄Π°Ρ‚Π° BarrierNode, която отсява Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΏΠΎ-Ρ€Π°Π½ΠΎ ΠΎΡ‚ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅:

|barrier()
        .period(5m)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Go-шаблони Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

Π¨Π°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ отговарят Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π° text.template, ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ са няколко чСсто срСщани Π·Π°Π΄Π°Ρ‡ΠΊΠΈ.

if-else

ΠŸΠΎΠ΄Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π½Π΅Ρ‰Π°Ρ‚Π°, Π±Π΅Π· Π΄Π° наранявамС Ρ…ΠΎΡ€Π°Ρ‚Π° с тСкст Π±Π΅Π· Π½ΡƒΠΆΠ΄Π°:

|alert()
    ...
    .message(
        '{{ if eq .Level "OK" }}Π‘Π΅Π³Π° Π΅ ΠΎΠΊΠ΅ΠΉ{{ else }}Π¨Π΅Ρ„Π΅, всичко Π΅ Ρ€Π°Π·Π±ΠΈΡ‚ΠΎ{{end}}'
    )

Π”Π²Π΅ Ρ†ΠΈΡ„Ρ€ΠΈ слСд дСсСтичната запСтая Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

ΠŸΠΎΠ΄ΠΎΠ±Ρ€ΡΠ²Π°ΠΌΠ΅ чСтимостта Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ:

|alert()
    ...
    .message(
        'сСга стойността Π΅ {{ index .Fields "value" | printf "%0.2f" }}'
    )

Π Π°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

ИзвСТдамС ΠΏΠΎΠ²Π΅Ρ‡Π΅ информация Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ, Π·Π° Π΄Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π½Π° Π²ΡŠΠΏΡ€ΠΎΡΠ° Β«Π—Π°Ρ‰ΠΎ ΠΊΡ€Π΅Ρ‰ΠΈ?Β»

var warnAlert = 10
  |alert()
    ...
    .message(
       'Π”Π½Π΅ΡˆΠ½Π°Ρ‚Π° стойност Π΅ ΠΏΠΎΠ΄ '+string(warnAlert)+'%'
    )

Π£Π½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π°Π»Π°Ρ€ΠΌΠ°Ρ‚Π°

НСобходима Π²Π΅Ρ‰, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΅Π΄Π½Π° Π³Ρ€ΡƒΠΏΠ°, ΠΈΠ½Π°Ρ‡Π΅ Ρ‰Π΅ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° само Π΅Π΄Π½Π° Π°Π»Π°Ρ€ΠΌΠ°:

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

ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ голям списък ΠΎΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ° exec, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ свой скрипт с ΠΏΠΎΠ΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ (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("Π½Π΅Ρ‰ΠΎ")

Π”Π° наблюдавамС (cli): kapacitor -url host-or-ip:9092 logs lvl=error

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ с httpOut

Показва Π΄Π°Π½Π½ΠΈ Π² тСкущия ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½:

|httpOut('Π½Π΅Ρ‰ΠΎ')

Π”Π° наблюдавамС (get): host-or-ip:9092\/kapacitor\/v1\/tasks\/task_name\/something

Π‘Ρ…Π΅ΠΌΠ° Π½Π° изпълнСниС

  • Всяка Π·Π°Π΄Π°Ρ‡Π° Π²Ρ€ΡŠΡ‰Π° Π΄ΡŠΡ€Π²ΠΎ Π½Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ с ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Ρ†ΠΈΡ„Ρ€ΠΈ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ graphviz.
  • Π’Π·ΠΈΠΌΠ°ΠΌΠ΅ Π±Π»ΠΎΠΊ dot.
  • Π’ΠΌΡŠΠΊΠ²Π°ΠΌΠ΅ Π² viewer, наслаТдавамС сС.

КъдС ΠΎΡ‰Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ timestamp Π² influxdb ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ записванС?

timestamp Π² influxdb ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ записванС

НапримСр, настройвамС Π°Π»Π°Ρ€ΠΌΠ° Π·Π° сумата Π½Π° заявкитС Π½Π° час (groupBy(1h)) ΠΈ искамС Π΄Π° запишСм Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Π»Π°Ρ‚Π° Π°Π»Π°Ρ€ΠΌΠ° Π² influxdb (Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ‚Π° Π² grafana).

influxDBOut() Ρ‰Π΅ запишС Π² timestamp стойността time ΠΎΡ‚ Π°Π»Π°Ρ€ΠΌΠ°Ρ‚Π°, Π² ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ°Ρ‚Π° Ρ‰Π΅ бъдС записана ΠΏΠΎ-Ρ€Π°Π½ΠΎ/ΠΏΠΎ-късно, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΅ дошла Π°Π»Π°Ρ€ΠΌΠ°Ρ‚Π°.

ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° точност: заобикалямС Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ‡Ρ€Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° пСрсонализиран Ρ…Π΅Π½Π΄Π»Π΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ запишС Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² influxdb с тСкущия timestamp.

docker, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ Π΄Π΅ΠΏΠ»ΠΎΠΉ

ΠŸΡ€ΠΈ стартиранС kapacitor ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π° Π·Π°Π΄Π°Ρ‡ΠΈ, шаблони ΠΈ Ρ…Π΅Π½Π΄Π»Π΅Ρ€ΠΈ ΠΎΡ‚ дирСкторията, ΡƒΠΊΠ°Π·Π°Π½Π° Π² конфигурацията, Π² Π±Π»ΠΎΠΊΠ° [load].

Π—Π° ΠΊΠΎΡ€Π΅ΠΊΡ‚Π½ΠΎ създаванС Π½Π° Π·Π°Π΄Π°Ρ‡Π° са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ слСднитС Π½Π΅Ρ‰Π°:

  1. ИмС Π½Π° Ρ„Π°ΠΉΠ»Π° – Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π° сС Π² id/ΠΈΠΌΠ΅ Π½Π° скрипта.
  2. Π’ΠΈΠΏ – stream/batch
  3. dbrp – ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° Π΄ΡƒΠΌΠ° Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π² коя Π±Π°Π·Π° + ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ (dbrp Β«supplierΒ».Β«autogenΒ»).

Ако Π² някаква batch-Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ ΠΈΠΌΠ° Ρ€Π΅Π΄ с dbrp, цСлият сСрвис Ρ‰Π΅ ΠΎΡ‚ΠΊΠ°ΠΆΠ΅ Π΄Π° стартира ΠΈ чСстно Ρ‰Π΅ напишС Π·Π° Ρ‚ΠΎΠ²Π° Π² Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅.

Π’ chronograf, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅Π΄ Π½Π΅ трябва Π΄Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½Π΅ сС ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΏΡ€Π΅Π· интСрфСйса ΠΈ Π΄Π°Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ°.

Π₯Π°ΠΊ ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: Dockerfile ΠΈΠ·Π»ΠΈΠ·Π° с -1, Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ€Π΅Π΄ΠΎΠ²Π΅ с //.+dbrp, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²Π΅Π΄Π½Π°Π³Π° Ρ‰Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° сбоя ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π±ΠΈΠ»Π΄.

join Сдин към много

Π—Π°Π΄Π°Ρ‡Π°-ΠΏΡ€ΠΈΠΌΠ΅Ρ€: трябва Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ 95-Ρ‚ΠΈ ΠΏΠ΅Ρ€Ρ†Π΅Π½Ρ‚ΠΈΠ» Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° услугата Π·Π° сСдмица, Π΄Π° сравним всяка ΠΌΠΈΠ½ΡƒΡ‚Π° ΠΎΡ‚ послСднитС 10 с Ρ‚ΠΎΠ²Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

НС ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ join Π΅Π΄ΠΈΠ½ към ΠΌΠ½ΠΎΠ³ΠΎ, last/mean/median ΠΏΠΎ Π³Ρ€ΡƒΠΏΠ° Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π°Ρ‚ Π½ΠΎΠ΄Π°Ρ‚Π° Π² stream, Ρ‰Π΅ сС Π²ΡŠΡ€Π½Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° Β«cannot add child mismatched edges: batch -> streamΒ».

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ batch-Π°, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π² lambda-ΠΈΠ·Ρ€Π°Π·Π°, ΡΡŠΡ‰ΠΎ Π½Π΅ сС подставя.

Има Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄Π° сС запазят Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ Ρ†ΠΈΡ„Ρ€ΠΈ ΠΎΡ‚ ΠΏΡŠΡ€Π²ΠΈΡ batch Π² Ρ„Π°ΠΉΠ» Ρ‡Ρ€Π΅Π· udf ΠΈ Π΄Π° сС Π·Π°Ρ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» Ρ‡Ρ€Π΅Π· sideload.

Какво Ρ€Π΅ΡˆΠ°Π²Π°ΠΌΠ΅ с Ρ‚ΠΎΠ²Π°?

ИмамС ΠΎΠΊΠΎΠ»ΠΎ 100 доставчици Π½Π° Ρ…ΠΎΡ‚Π΅Π»ΠΈ, към всСки ΠΎΡ‚ тях ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° няколко ΡΠ²ΡŠΡ€Π·Π²Π°Π½ΠΈΡ, Π΄Π° Π³ΠΈ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ ΠΊΠ°Π½Π°Π»ΠΈ. Π’Π΅Π·ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ са ΠΎΠΊΠΎΠ»ΠΎ 300, всСки ΠΎΡ‚ ΠΊΠ°Π½Π°Π»ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ. ΠžΡ‚ всички записвани ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Ρ‰Π΅ слСдим ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ (requests ΠΈ errors).

Π—Π°Ρ‰ΠΎ Π½Π΅ Π³Ρ€Π°Ρ„Π°Π½Π°?

АлармитС Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ Π² Π³Ρ€Π°Ρ„Π°Π½Π°, ΠΈΠΌΠ°Ρ‚ няколко минуса. Някои ΠΎΡ‚ тях са ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΈ, Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Ρ‚Π²ΠΎΡ€ΠΈΠΌ ΠΎΡ‡ΠΈ, Π² зависимост ΠΎΡ‚ ситуацията.

Π“Ρ€Π°Ρ„Π°Π½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° изчислява ΠΌΠ΅ΠΆΠ΄Ρƒ измСрванията + Π°Π»Π°Ρ€ΠΌΠΈΡ€Π°Π½Π΅, Π° Π½Π° нас Π½ΠΈ Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΡŠΡ‚ (requests-errors)/requests.

Π“Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΎ:

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

И ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΎ, Π°ΠΊΠΎ Π³Π»Π΅Π΄Π°ΠΌΠ΅ с ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈΡ‚Π΅ заявки:

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

Π”ΠΎΠ±Ρ€Π΅, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° изчислим ставката Π² услугата ΠΏΡ€Π΅Π΄ΠΈ Π³Ρ€Π°Ρ„Π°Π½Π°, ΠΈ Π² някои случаи Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ. Но Π½Π΅ Π² нашия случай, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π·Π° всСки ΠΊΠ°Π½Π°Π» сС изчислява Β«Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎΒ» ΡΡŠΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅, Π° Π°Π»Π°Ρ€ΠΌΠΈΡ‚Π΅ работят Π½Π° статични стойности (Ρ‚ΡŠΡ€ΡΠΈΠΌ Π½Π° ΠΎΠΊΠΎ, смСнямС, Π°ΠΊΠΎ Π°Π»Π°Ρ€ΠΌΠΈΡ€Π° чСсто).

Π•Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Β«Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎΒ» Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ:

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

ΠŸΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π²Π°ΠΌΠ΅ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΠΌΠ΅, Ρ‡Π΅ ΠΏΡ€ΠΈ всички доставчици Β«Π½ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π°Β» ситуация Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π°. Π‘Π΅Π³Π° всичко Π΅ Π΄ΠΎΠ±Ρ€Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ Π΄Π° сС справим с Π°Π»Π°Ρ€ΠΌΠΈΡ‚Π΅ Π² Π³Ρ€Π°Ρ„Π°Π½Π°?
МоТСм, Π½ΠΎ Π½Π΅ искамС, Π·Π°Ρ‰ΠΎΡ‚ΠΎ трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈΡ‚Π΅:
Π°) Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ мноТСство Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π·Π° всСки ΠΊΠ°Π½Π°Π» ΠΏΠΎΠΎΡ‚Π΄Π΅Π»Π½ΠΎ (ΠΈ ΠΌΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΌΠ΅)
Π±) Π΄Π° оставим Π΅Π΄Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ° с всички ΠΊΠ°Π½Π°Π»ΠΈ (ΠΈ Π΄Π° сС Π·Π°Π³ΡƒΠ±ΠΈΠΌ Π² Ρ†Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ Π»ΠΈΠ½ΠΈΠΈ ΠΈ настроСнитС Π°Π»Π°Ρ€ΠΌΠΈ)

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor

Какво Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅?

ΠžΡ‚Π½ΠΎΠ²ΠΎ, Π² докумСнтацията ΠΈΠΌΠ° Π΄ΠΎΠ±ΡŠΡ€ Π½Π°Ρ‡Π°Π»Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (Π˜Π·Ρ‡ΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ставки Π·Π° ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈ сСрии), ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Ρ…Π²ΡŠΡ€Π»ΠΈΠΌ ΠΏΠΎΠ³Π»Π΅Π΄ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ Π·Π° основа ΠΏΡ€ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

Какво Π½Π°ΠΏΡ€Π°Π²ΠΈΡ…ΠΌΠ΅ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка:

  • ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π²Π΅ сСрии Π·Π° няколко часа, Π³Ρ€ΡƒΠΏΠΈΡ€Π°Π½Π΅ ΠΏΠΎ ΠΊΠ°Π½Π°Π»ΠΈ;
  • попълвамС сСриитС ΠΏΠΎ Π³Ρ€ΡƒΠΏΠΈ, Π°ΠΊΠΎ няма Π΄Π°Π½Π½ΠΈ;
  • сравнявамС ΠΌΠ΅Π΄ΠΈΠ°Π½Π°Ρ‚Π° ΠΎΡ‚ послСднитС 10 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ с ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ;
  • ΠΊΡ€Π΅Ρ‰ΠΈΠΌ, Π°ΠΊΠΎ Π½Π΅Ρ‰ΠΎ Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ΠΎ;
  • пишСм изчислСнитС ставки ΠΈ станалитС Π°Π»Π°Ρ€ΠΌΠΈ Π² influxdb;
  • ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°ΠΌΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π² slack.

На ΠΌΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, успяхмС Π΄Π° постигнСм максимално красиво всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ искахмС Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° (ΠΈ Π΄ΠΎΡ€ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅ с пСрсонализирани ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‡ΠΈ).

На github.com ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° схСма (graphviz) Π½Π° получСния скрипт.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° получСния ΠΊΠΎΠ΄:

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) |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') var todayRate = rates |where(lambda: duration((unixNano(now()) - unixNano("time")) / 1000, 1u)  warnAlert) .warnReset(lambda: ("prev.median" - "today.median") < warnReset) .flapping(0.25, 0.5) .stateChangesOnly() .message('{{ .Level }}: {{ index .Tags "channel" }} err/req ratio ({{ index .Tags "supplier" }}) {{ if eq .Level "OK" }}It is ok now{{ else }} median Π·Π° ' + string(todayPeriod) + ' Π΅ {{ index .Fields "today.median" | printf "%0.2f" }}%, спрямо ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ ' + string(period) + ' Π΅ {{ 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=UTC0300') .id('{{ index .Tags "name" }} /{{ index .Tags "channel" }}') .levelTag('level') .messageField('message') .durationField('duration') .topic('slack_graph') trigger |eval(lambda: "today.median") .as('value') .keep() |influxDBOut() .quiet() .create() .database('kapacitor') .retentionPolicy('autogen') .measurement('alerts') .tag('alertName', name)

Какъв Π΅ ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚?

Kapacitor ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π°Π»Π°Ρ€ΠΌΠΈΡ€Π°Π½Π΅ с мноТСство Π³Ρ€ΡƒΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ изчислСния Π²ΡŠΡ€Ρ…Ρƒ Π²Π΅Ρ‡Π΅ записанитС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° пСрсонализирани дСйствия ΠΈ Π΄Π° стартира скриптовС (udf).

ΠŸΡ€Π°Π³ΡŠΡ‚ Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ висок – ΠΎΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅ Π³ΠΎ, Π°ΠΊΠΎ Grafana ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ инструмСнти Π½Π΅ удовлСтворяват напълно Π²Π°ΡˆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ΄ΠΈ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster