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

Най-вСроятно днСс Π½ΠΈΠΊΠΎΠΉ Π½Π΅ сС ΠΏΠΈΡ‚Π° Π·Π°Ρ‰ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΡΡŠΠ±ΠΈΡ€Π°Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π·Π° услугата. Π‘Π»Π΅Π΄Π²Π°Ρ‰Π°Ρ‚Π° Π»ΠΎΠ³ΠΈΡ‡Π½Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π΅ Π΄Π° настроитС ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° ΡΡŠΠ±Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° извСстява Π·Π° отклонСния Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΏΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΈ Π·Π° вас ΠΊΠ°Π½Π°Π»ΠΈ (ΠΏΠΎΡ‰Π°, Slack, Telegram). Π’ ΠΎΠ½Π»Π°ΠΉΠ½ услугата Π·Π° хотСлски Ρ€Π΅Π·Π΅Ρ€Π²Π°Ρ†ΠΈΠΈ Ostrovok.ru всички ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ услуги сС изсипват Π² InfluxDB ΠΈ сС ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚ Π² Grafana, ΠΊΠ°Ρ‚ΠΎ основното ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡŠΡ‰ΠΎ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎ Ρ‚Π°ΠΌ. Π—Π° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΊΠ°Ρ‚ΠΎ β€žΡ‚Ρ€ΡΠ±Π²Π° Π΄Π° изчислитС Π½Π΅Ρ‰ΠΎ ΠΈ Π΄Π° сравнитС с Π½Π΅Π³ΠΎβ€œ, Π½ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Kapacitor.

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Kapacitor
Kapacitor Π΅ част ΠΎΡ‚ стСка TICK, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΎΡ‚ InfluxDB. МоТС Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ няколко измСрвания Π·Π°Π΅Π΄Π½ΠΎ (join), Π΄Π° изчисли Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΎΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, Π΄Π° запишС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² 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()

Ако Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚/ΠΏΠΎΠ»Π΅ Π½Π΅ Π΅ попълнСно, Ρ‰Π΅ Π²ΡŠΠ·Π½ΠΈΠΊΠ½Π°Ρ‚ Π³Ρ€Π΅ΡˆΠΊΠΈ Π² изчислСниСто:

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

попълванС Π½Π° съСдинСниС (Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎ срСщу външно)

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Ρ‰Π΅ ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ няма Π΄Π°Π½Π½ΠΈ (Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ).
Π‘ fill('null') Ρ‰Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ външно ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ default() ΠΈ Π΄Π° ΠΏΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π·Π½ΠΈΡ‚Π΅ стойности:

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

Π’ΡƒΠΊ всС ΠΎΡ‰Π΅ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ нюанс. Π’ горния ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ Π΅Π΄Π½Π° ΠΎΡ‚ сСриитС (res1 ΠΈΠ»ΠΈ res2) Π΅ ΠΏΡ€Π°Π·Π½Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° сСрия (Π΄Π°Π½Π½ΠΈ) ΡΡŠΡ‰ΠΎ Ρ‰Π΅ бъдС ΠΏΡ€Π°Π·Π½Π°. Има няколко Π±ΠΈΠ»Π΅Ρ‚Π° ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ° Π² Github (1633, 1871, 6967) – Ρ‡Π°ΠΊΠ°ΠΌΠ΅ ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ°Π»ΠΊΠΎ страдамС.

ИзползванС Π½Π° условия Π² изчислСнията (Π°ΠΊΠΎ Π΅ Π² Π»Π°ΠΌΠ±Π΄Π°)

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

ПослСдни ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΎΡ‚ Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° Π·Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π°

НапримСр, трябва Π΄Π° сравнитС стойноститС ΠΎΡ‚ послСднитС ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ с ΠΏΡ€Π΅Π΄Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° сСдмица. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π΄Π²Π΅ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄ΠΈ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ част ΠΎΡ‚ Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΏΠΎ-голям ΠΏΠ΅Ρ€ΠΈΠΎΠ΄:

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

АлтСрнатива Π·Π° послСднитС ΠΏΠ΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚ΠΈ Π±ΠΈ Π±ΠΈΠ»Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° BarrierNode, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅:

|barrier()
        .period(5m)

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

Π¨Π°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ отговарят Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π° тСкст.шаблонПо-Π΄ΠΎΠ»Ρƒ са някои чСсто срСщани пъзСли.

Π°ΠΊΠΎ-Π΄Ρ€ΡƒΠ³ΠΎ

ΠŸΠΎΠ΄Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π½Π΅Ρ‰Π°Ρ‚Π° ΠΈ Π½Π΅ задСйствамС Ρ…ΠΎΡ€Π°Ρ‚Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ с тСкст:

|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) - крСативност ΠΈ Π½ΠΈΡ‰ΠΎ ΠΏΠΎΠ²Π΅Ρ‡Π΅!

Π•Π΄Π½Π° ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΎΠ±ΠΈΡ‡Π°ΠΈ Π΅ малък скрипт Π½Π° Python Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° извСстия Π΄ΠΎ slack.
ΠŸΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ искахмС Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠΌ Π·Π°Ρ‰ΠΈΡ‚Π΅Π½Π° ΠΎΡ‚ авторизация Π³Ρ€Π°Ρ„Π°Π½Π° Π² ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ОК Π² Ρ‚Π΅ΠΌΠ°Ρ‚Π° към ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ сигнал ΠΎΡ‚ ΡΡŠΡ‰Π°Ρ‚Π° Π³Ρ€ΡƒΠΏΠ°, Π° Π½Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅. Малко ΠΏΠΎ-късно - Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ към ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π°ΠΉ-чСстата Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€Π΅Π· послСднитС 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 хост-ΠΈΠ»ΠΈ-ip:9092 рСгистрира lvl=Π³Ρ€Π΅ΡˆΠΊΠ°

ΠžΠΏΡ†ΠΈΡ с httpOut

Показва Π΄Π°Π½Π½ΠΈ Π² тСкущия ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€:

|httpOut('something')

Π“Π»Π΅Π΄Π°ΠΉΡ‚Π΅ (Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅): хост-ΠΈΠ»ΠΈ-ip:9092/kapacitor/v1/tasks/task_name/something

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

  • Всяка Π·Π°Π΄Π°Ρ‡Π° Π²Ρ€ΡŠΡ‰Π° Π΄ΡŠΡ€Π²ΠΎ Π·Π° изпълнСниС с ΠΏΠΎΠ»Π΅Π·Π½ΠΈ числа във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° graphviz.
  • Π’Π·Π΅ΠΌΠ΅Ρ‚Π΅ Π±Π»ΠΎΠΊ Ρ‚ΠΎΡ‡ΠΊΠ°.
  • ΠŸΠΎΡΡ‚Π°Π²Π΅Ρ‚Π΅ Π³ΠΎ във Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, наслади сС.

КъдС Π΄Ρ€ΡƒΠ³Π°Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ Ρ€Π΅ΠΉΠΊ?

ΠΊΠ»Π΅ΠΉΠΌΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π² influxdb ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ записванС

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

influxDBOut() Ρ‰Π΅ запишС Π²Ρ€Π΅ΠΌΠ΅Π²Π°Ρ‚Π° стойност ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π² ΠΊΠ»Π΅ΠΉΠΌΠΎΡ‚ΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅; ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ‚Π° Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‰Π΅ бъдС написана ΠΏΠΎ-Ρ€Π°Π½ΠΎ/ΠΏΠΎ-късно ΠΎΡ‚ пристиганСто Π½Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ.

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

Π΄ΠΎΠΊΠ΅Ρ€, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ ΠΈ внСдряванС

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

Π—Π° Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π·Π°Π΄Π°Ρ‡Π°, ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ слСднитС Π½Π΅Ρ‰Π°:

  1. ИмС Π½Π° Ρ„Π°ΠΉΠ» – Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΎ Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€/ΠΈΠΌΠ΅ Π½Π° скрипт
  2. Π’ΠΈΠΏ – ΠΏΠΎΡ‚ΠΎΠΊ/ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄Π°
  3. dbrp – ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π° Π΄ΡƒΠΌΠ° Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π² коя Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ + ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° сС изпълнява ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ (dbrp β€œΠ΄ΠΎΡΡ‚Π°Π²Ρ‡ΠΈΠΊ.” β€œautogen”)

Ако някоя ΠΏΠ°ΠΊΠ΅Ρ‚Π½Π° Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ€Π΅Π΄ с dbrp, цялата услуга Ρ‰Π΅ ΠΎΡ‚ΠΊΠ°ΠΆΠ΅ Π΄Π° стартира ΠΈ чСстно Ρ‰Π΅ напишС Π·Π° Ρ‚ΠΎΠ²Π° Π² Π΄Π½Π΅Π²Π½ΠΈΠΊΠ°.

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

Π₯Π°ΠΊ ΠΏΡ€ΠΈ ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€: Dockerfile ΠΈΠ·Π»ΠΈΠ·Π° с -1, Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ€Π΅Π΄ΠΎΠ²Π΅ с //.+dbrp, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° нСуспСха ΠΏΡ€ΠΈ сглобяванСто Π½Π° компилацията.

ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½Π΅Ρ‚Π΅ сС към Π΅Π΄ΠΈΠ½ към ΠΌΠ½ΠΎΠ³ΠΎ

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

НС ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ "Π΅Π΄ΠΈΠ½ към ΠΌΠ½ΠΎΠ³ΠΎ", послСдната/срСдната стойност/ΠΌΠ΅Π΄ΠΈΠ°Π½Π°Ρ‚Π° Π½Π°Π΄ Π³Ρ€ΡƒΠΏΠ° ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° възСла Π² ΠΏΠΎΡ‚ΠΎΠΊ, Ρ‰Π΅ бъдС Π²ΡŠΡ€Π½Π°Ρ‚Π° Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° β€žΠ½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ Π½Π΅ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ΠΈ Ρ€ΡŠΠ±ΠΎΠ²Π΅: ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄Π° -> ΠΏΠΎΡ‚ΠΎΠΊβ€œ.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄Π°, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π² Π»Π°ΠΌΠ±Π΄Π° ΠΈΠ·Ρ€Π°Π·, ΡΡŠΡ‰ΠΎ Π½Π΅ сС замСства.

Има опция Π·Π° Π·Π°ΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΎΡ‚ ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΠΏΠ°Ρ€Ρ‚ΠΈΠ΄Π° във Ρ„Π°ΠΉΠ» Ρ‡Ρ€Π΅Π· udf ΠΈ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» Ρ‡Ρ€Π΅Π· sideload.

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

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

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

ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡΡ‚Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ Π² Grafana, ΠΈΠΌΠ°Ρ‚ няколко Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊΠ°. Някои са ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΈ, Π·Π° някои ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° си Π·Π°Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ ΠΎΡ‡ΠΈΡ‚Π΅, Π² зависимост ΠΎΡ‚ ситуацията.

Grafana Π½Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° изчислява ΠΌΠ΅ΠΆΠ΄Ρƒ измСрвания + сигнализиранС, Π½ΠΎ Π½ΠΈ трябва ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ (заявки-Π³Ρ€Π΅ΡˆΠΊΠΈ)/заявки.

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

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

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

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

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

Π’ΠΎΠ²Π° са ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° β€žΠ½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎβ€œ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ:

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

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

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

Π’Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² 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)
    // 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 Π΅ страхотСн ΠΏΡ€ΠΈ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³-сигнали с ΠΊΡƒΠΏ Π³Ρ€ΡƒΠΏΠΈ, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ изчислСния въз основа Π½Π° Π²Π΅Ρ‡Π΅ записани ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° пСрсонализирани дСйствия ΠΈ стартиранС Π½Π° скриптовС (udf).

Π‘Π°Ρ€ΠΈΠ΅Ρ€Π°Ρ‚Π° Π·Π° Π²Π»ΠΈΠ·Π°Π½Π΅ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ висока - ΠΎΠΏΠΈΡ‚Π°ΠΉΡ‚Π΅, Π°ΠΊΠΎ Π³Ρ€Π°Ρ„Π°Π½Π° ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ инструмСнти Π½Π΅ задоволяват напълно Π²Π°ΡˆΠΈΡ‚Π΅ ТСлания.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€