Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

рд╕рдореНрднрд╡рддрдГ, рдЖрдЬ рдХрд╕реИрд▓реЗ рд╕реЛрдзреНрджреИрди рдХрд┐рди рд╕реЗрд╡рд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЕрд░реНрдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдЪрд░рдг рднрдиреЗрдХреЛ рд╕рдЩреНрдХрд▓рди рдореЗрдЯреНрд░рд┐рдХреНрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдЕрд▓рд░реНрдЯ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреБ рд╣реЛ, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдХрд╛ рд▓рд╛рдЧрд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреНрдпрд╛рдирд▓рд╣рд░реВ (рдореЗрд▓, рд╕реНрд▓реНрдпрд╛рдХ, рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо) рдорд╛ рдбреЗрдЯрд╛рдорд╛ рдХреБрдиреИ рдкрдирд┐ рд╡рд┐рдЪрд▓рди рдмрд╛рд░реЗ рд╕реВрдЪрд┐рдд рдЧрд░реНрдиреЗрдЫред рдЕрдирд▓рд╛рдЗрди рд╣реЛрдЯрд▓ рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдорд╛ Ostrovok.ru рд╣рд╛рдореНрд░рд╛ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд╕рдмреИ рдореЗрдЯреНрд░рд┐рдХреНрд╕ InfluxDB рдорд╛ рд░рд╛рдЦрд┐рдиреНрдЫ рд░ Grafana рдорд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреНрдЫ, рд░ рдЖрдзрд╛рд░рднреВрдд рдЪреЗрддрд╛рд╡рдиреА рдкрдирд┐ рддреНрдпрд╣рд╛рдБ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫред "рддрдкрд╛рдИрдВрд▓реЗ рдХреЗрд╣рд┐ рдЧрдгрдирд╛ рдЧрд░реНрди рд░ рддреНрдпрд╕рд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ," рдЬрд╕реНрддрд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА Kapacitor рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ
Kapacitor TICK рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рдЕрдВрд╢ рд╣реЛ рдЬрд╕рд▓реЗ InfluxDB рдмрд╛рдЯ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЧрд░реНрди рд╕рдХреНрдЫред рдпрд╕рд▓реЗ рдзреЗрд░реИ рдорд╛рдкрдирд╣рд░реВ рд╕рдБрдЧреИ рдЬреЛрдбреНрди рд╕рдХреНрдЫ (рдЬреЛрдбреНрдиреБрд╣реЛрд╕реН), рдкреНрд░рд╛рдкреНрдд рдбрд╛рдЯрд╛рдмрд╛рдЯ рдХреЗрд╣реА рдЙрдкрдпреЛрдЧреА рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдирддрд┐рдЬрд╛рд▓рд╛рдИ InfluxDB рдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН, Slack/Telegram/mail рдорд╛ рдЕрд▓рд░реНрдЯ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реНред

рд╕рдореНрдкреВрд░реНрдг рд╕реНрдЯреНрдпрд╛рдХ рд░рд╛рдореНрд░реЛ рд░ рд╡рд┐рд╕реНрддреГрдд рдЫ рдХрд╛рдЧрдЬрд╛рдд, рддрд░ рддреНрдпрд╣рд╛рдБ рд╕рдзреИрдВ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬрд╣рд░реВ рд╣реБрдиреЗрдЫрдиреН рдЬреБрди рдореНрдпрд╛рдиреБрдЕрд▓рд╣рд░реВрдорд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред рдпрд╕ рд▓реЗрдЦрдорд╛, рдореИрд▓реЗ рддреНрдпрд╕реНрддрд╛ рдзреЗрд░реИ рдЙрдкрдпреЛрдЧреА, рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ (TICKscipt рдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрд╣рд╛рдБ) рд░ рд╣рд╛рдореНрд░реЛ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреБрд╣реЛрд╕реНред

рдЪрд▓реЛ рдЬрд╛рдиреБрд╣реЛрд╕реН!

рдлреНрд▓реЛрдЯ рд░ 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') рдХреЛ рд╕рд╛рде, рдмрд╛рд╣рд┐рд░реА рдЬреЛрдбрд┐рдиреЗрдЫ, рдЬрд╕ рдкрдЫрд┐ рддрдкрд╛рдИрдВрд▓реЗ default() рдЧрд░реНрдиреБ рдкрд░реНрдЫ рд░ рдЦрд╛рд▓реА рдорд╛рдирд╣рд░реВ рднрд░реНрдиреБ рдкрд░реНрдЫ:

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)

рд╕рдиреНрджреЗрд╢рдорд╛ рдЧреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ

рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рдкреНрдпрд╛рдХреЗрдЬрдХреЛ рдврд╛рдБрдЪрд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫ 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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛

  • рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд▓реЗ рдврд╛рдБрдЪрд╛рдорд╛ рдЙрдкрдпреЛрдЧреА рд╕рдВрдЦреНрдпрд╛рд╣рд░реВрдХреЛ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░реВрдЦ рдлрд░реНрдХрд╛рдЙрдБрдЫ рдЧреНрд░рд╛рдлрднрд┐рдЬ.
  • рдПрдХ рдмреНрд▓рдХ рд▓рд┐рдиреБрд╣реЛрд╕реН рдбрдЯ.
  • рдпрд╕рд▓рд╛рдИ рджрд░реНрд╢рдХрдорд╛ рдЯрд╛рдБрд╕реНрдиреБрд╣реЛрд╕реН, рдордЬрд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН.

рдЕрд░реВ рдХрд╣рд╛рдБ рд░реИрдХ рдкрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ?

рд░рд╛рдЗрдЯрдмреНрдпрд╛рдХрдорд╛ influxdb рдорд╛ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдк

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ рдкреНрд░рддрд┐ рдШрдгреНрдЯрд╛ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рдпреЛрдЧрдлрд▓ (groupBy(1h)) рдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓рд░реНрдЯ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдЫреМрдВ рд░ influxdb рдорд╛ рднрдПрдХреЛ рдЕрд▓рд░реНрдЯ рд░реЗрдХрд░реНрдб рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ (рдЧреНрд░рд╛рдлрдирд╛рдорд╛ рдЧреНрд░рд╛рдлрдорд╛ рд╕рдорд╕реНрдпрд╛рдХреЛ рддрдереНрдпрд▓рд╛рдИ рд╕реБрдиреНрджрд░ рд░реВрдкрдорд╛ рджреЗрдЦрд╛рдЙрди)ред

influxDBOut() рд▓реЗ рд╕рддрд░реНрдХрддрд╛рдмрд╛рдЯ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдкрдорд╛ рд╕рдордп рдорд╛рди рд▓реЗрдЦреНрдиреЗрдЫ; рддрджрдиреБрд╕рд╛рд░, рдЪрд╛рд░реНрдЯрдорд╛ рдмрд┐рдиреНрджреБ рдЕрд▓рд░реНрдЯ рдЖрдЗрдкреБрдЧреНрдиреБ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ/рдкрдЫрд┐ рд▓реЗрдЦрд┐рдиреЗрдЫред

рдЬрдм рд╕рдЯреАрдХрддрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреНрдЫ: рд╣рд╛рдореА рдЕрдиреБрдХреВрд▓рди рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд▓рд╛рдИ рдХрд▓ рдЧрд░реЗрд░ рдпрд╕ рд╕рдорд╕реНрдпрд╛рдХреЛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдЫреМрдВ, рдЬрд╕рд▓реЗ рд╣рд╛рд▓рдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреНрдпрд╛рдореНрдкрдХреЛ рд╕рд╛рде influxdb рдорд╛ рдбрд╛рдЯрд╛ рд▓реЗрдЦреНрдиреЗрдЫред

рдбрдХрд░, рдирд┐рд░реНрдорд╛рдг рд░ рддреИрдирд╛рддреА

рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрдорд╛, рдХреНрдпрд╛рдкреЗрд╕рд┐рдЯрд░рд▓реЗ [рд▓реЛрдб] рдмреНрд▓рдХрдорд╛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдмрд╛рдЯ рдХрд╛рд░реНрдпрд╣рд░реВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рд░ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдЫред

рд╕рд╣реА рд░реВрдкрдорд╛ рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди, рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдирд┐рдореНрди рдЪреАрдЬрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫ:

  1. рдлрд╛рдЗрд▓рдХреЛ рдирд╛рдо - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдИрдбреА/рдирд╛рдордорд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░рд┐рдпреЛ
  2. рдкреНрд░рдХрд╛рд░ - рд╕реНрдЯреНрд░рд┐рдо / рдмреНрдпрд╛рдЪ
  3. dbrp - рдХреБрди рдбрд╛рдЯрд╛рдмреЗрд╕ + рдиреАрддрд┐рдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓реНрдЫ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрди рдЦреЛрдЬрд╢рдмреНрдж (dbrp "рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ред" "autogen")

рдпрджрд┐ рдХреЗрд╣реА рдмреНрдпрд╛рдЪ рдХрд╛рд░реНрдпрд▓реЗ dbrp рд╕рдБрдЧ рд▓рд╛рдЗрди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджреИрди рднрдиреЗ, рд╕рдореНрдкреВрд░реНрдг рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрди рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдиреЗрдЫ рд░ рд▓рдЧрдорд╛ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЗрдорд╛рдирджрд╛рд░реАрдкреВрд░реНрд╡рдХ рд▓реЗрдЦреНрдиреЗрдЫред

рдХреНрд░реЛрдиреЛрдЧреНрд░рд╛рдлрдорд╛, рдпрд╕рдХреЛ рд╡рд┐рдкрд░рд┐рдд, рдпреЛ рд░реЗрдЦрд╛ рдЕрд╡рд╕реНрдерд┐рдд рд╣реБрдиреБ рд╣реБрдБрджреИрди; рдпреЛ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдорд╛рд░реНрдлрдд рд╕реНрд╡реАрдХрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди рд░ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫред

рдХрдиреНрдЯреЗрдирд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджрд╛ рд╣реНрдпрд╛рдХ: рдбрдХрд░рдлрд╛рдЗрд▓ -1 рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреНрдЫ рдпрджрд┐ рддреНрдпрд╣рд╛рдБ //.+dbrp рд╕рдБрдЧ рд▓рд╛рдЗрдирд╣рд░реВ рдЫрдиреН, рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдмрд┐рд▓реНрдб рдПрд╕реЗрдореНрдмрд▓ рдЧрд░реНрджрд╛ рд╡рд┐рдлрд▓рддрд╛рдХреЛ рдХрд╛рд░рдг рддреБрд░реБрдиреНрддреИ рдмреБрдЭреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫред

рдПрдХ рджреЗрдЦрд┐ рдзреЗрд░реИ рд╕рдореНрдорд┐рд▓рд┐рдд

рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдп: рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ рд╣рдкреНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕реЗрд╡рд╛рдХреЛ рд╕рдЮреНрдЪрд╛рд▓рди рд╕рдордпрдХреЛ 95 рдФрдВ рдкреНрд░рддрд┐рд╢рдд рд▓рд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЕрдиреНрддрд┐рдо 10 рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рдиреЗрдЯрд▓рд╛рдИ рдпреЛ рдорд╛рдирд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддрдкрд╛рдИрдВрд▓реЗ рдПрдХ-рджреЗрдЦрд┐-рдзреЗрд░реИ рд╕рд╛рдореЗрд▓ рд╣реБрди рд╕рдХреНрдиреБрд╣реБрдиреНрди, рдмрд┐рдиреНрджреБрд╣рд░реВрдХреЛ рд╕рдореВрд╣рдорд╛ рдЕрдиреНрддрд┐рдо/рдореАрди/рдорд╛рдзреНрдпрдХрд▓реЗ рдиреЛрдбрд▓рд╛рдИ рд╕реНрдЯреНрд░рд┐рдордорд╛ рдкрд░рд┐рдгрдд рдЧрд░реНрдЫ, рддреНрд░реБрдЯрд┐ "рдмрдЪреНрдЪрд╛ рдмреЗрдореЗрд▓ рдХрд┐рдирд╛рд░рд╣рд░реВ рдердкреНрди рд╕рдХреНрджреИрди: рдмреНрдпрд╛рдЪ -> рд╕реНрдЯреНрд░рд┐рдо" рдлрд░реНрдХрд╛рдЗрдиреЗрдЫред

рдмреНрдпрд╛рдЪрдХреЛ рдирддрд┐рдЬрд╛, рдПрдХ lambda рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдорд╛ рдЪрд░рдХреЛ рд░реВрдкрдорд╛, рдкрдирд┐ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред

рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЛ рдмреНрдпрд╛рдЪрдмрд╛рдЯ рдЖрд╡рд╢реНрдпрдХ рдирдореНрдмрд░рд╣рд░реВ udf рдорд╛рд░реНрдлрдд рдлрд╛рдЗрд▓рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреЗ рд░ рд╕рд╛рдЗрдбрд▓реЛрдб рдорд╛рд░реНрдлрдд рдлрд╛рдЗрд▓ рд▓реЛрдб рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдк рдЫред

рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХреЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВ?

рд╣рд╛рдореАрд╕рдБрдЧ рд▓рдЧрднрдЧ 100 рд╣реЛрдЯреЗрд▓ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рд╣рд░реВ рдЫрдиреН, рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрд╕рдБрдЧ рдзреЗрд░реИ рдЬрдбрд╛рдирд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫрдиреН, рдпрд╕рд▓рд╛рдИ рдЪреНрдпрд╛рдирд▓ рднрдирд┐рдиреНрдЫред рддреНрдпрд╣рд╛рдБ рдпреА рдЪреНрдпрд╛рдирд▓рд╣рд░реВ рдордзреНрдпреЗ рд▓рдЧрднрдЧ 300 рдЫрдиреН, рдкреНрд░рддреНрдпреЗрдХ рдЪреНрдпрд╛рдирд▓ рдЦрд╕реНрди рд╕рдХреНрдЫред рд╕рдмреИ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХрд╛ рдореЗрдЯреНрд░рд┐рдХрд╣рд░реВ рдордзреНрдпреЗ, рд╣рд╛рдореА рддреНрд░реБрдЯрд┐ рджрд░ (рдЕрдиреБрд░реЛрдз рд░ рддреНрд░реБрдЯрд┐рд╣рд░реВ) рдХреЛ рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрдиреЗрдЫреМрдВред

рдЧреНрд░рд╛рдлрд╛рдирд╛ рдХрд┐рди рдЫреИрди?

Grafana рдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХрд╛ рддреНрд░реБрдЯрд┐ рдЕрд▓рд░реНрдЯрд╣рд░реВ рдзреЗрд░реИ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреНред рдХреЗрд╣рд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЫрдиреН, рдХреЗрд╣рд┐ рддрдкрд╛рдИрд▓реЗ рдЖрдлреНрдиреЛ рдЖрдБрдЦрд╛ рдмрдиреНрдж рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдорд╛ рдирд┐рд░реНрднрд░ рдЧрд░реНрджрдЫред

Grafana рдорд╛рдкрди + рдЕрд▓рд░реНрдЯрд┐рдВрдЧ рдмреАрдЪ рдХрд╕рд░реА рдЧрдгрдирд╛ рдЧрд░реНрдиреЗ рдерд╛рд╣рд╛ рдЫреИрди, рддрд░ рд╣рд╛рдореАрд▓рд╛рдИ рджрд░ (рдЕрдиреБрд░реЛрдз-рддреНрд░реБрдЯрд┐рд╣рд░реВ)/рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред

рддреНрд░реБрдЯрд┐рд╣рд░реВ рдЦрд░рд╛рдм рджреЗрдЦрд┐рдиреНрдЫрдиреН:

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

рд░ рд╕рдлрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд╕рд╛рде рд╣реЗрд░реНрджрд╛ рдХрдо рдЦрд░рд╛рдм:

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

рдареАрдХ рдЫ, рд╣рд╛рдореА grafana рдЕрдШрд┐ рд╕реЗрд╡рд╛рдорд╛ рджрд░ рдкреВрд░реНрд╡-рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ, рд░ рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред рддрд░ рд╣рд╛рдореНрд░реЛрдорд╛ рд╣реЛрдЗрди, рдХрд┐рдирдХрд┐... рдкреНрд░рддреНрдпреЗрдХ рдЪреНрдпрд╛рдирд▓рдХреЛ рд▓рд╛рдЧрд┐ рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рдЕрдиреБрдкрд╛рдд "рд╕рд╛рдорд╛рдиреНрдп" рдорд╛рдирд┐рдиреНрдЫ, рд░ рдЕрд▓рд░реНрдЯрд╣рд░реВ рд╕реНрдерд┐рд░ рдорд╛рдирд╣рд░реВ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдЧрд░реНрджрдЫ (рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рдЖрдБрдЦрд╛рд▓реЗ рд╣реЗрд░реНрдЫреМрдВ, рдмрд╛рд░рдореНрдмрд╛рд░ рдЕрд▓рд░реНрдЯрд╣рд░реВ рднрдПрдорд╛ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН)ред

рдпреА рд╡рд┐рднрд┐рдиреНрди рдЪреНрдпрд╛рдирд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ "рд╕рд╛рдорд╛рдиреНрдп" рдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рд╣реБрдиреН:

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

рд╣рд╛рдореА рдЕрдШрд┐рд▓реНрд▓реЛ рдмрд┐рдиреНрджреБрд▓рд╛рдИ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдЫреМрдВ рд░ рдорд╛рдиреНрджрдЫреМрдВ рдХрд┐ "рд╕рд╛рдорд╛рдиреНрдп" рдЪрд┐рддреНрд░ рд╕рдмреИ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд╛рди рдЫред рдЕрдм рд╕рдмреИ рдареАрдХ рдЫ, рд░ рд╣рд╛рдореА grafana рдорд╛ рдЕрд▓рд░реНрдЯ рд╕рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ?
рд╣рд╛рдореА рд╕рдХреНрдЫреМрдВ, рддрд░ рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдореИ рдЪрд╛рд╣рдБрджреИрдиреМрдВ, рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд▓реЗ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЫрд╛рдиреНрдиреБрдкрд░реНрдЫ:
рдХ) рдкреНрд░рддреНрдпреЗрдХ рдЪреНрдпрд╛рдирд▓рдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдзреЗрд░реИ рдЧреНрд░рд╛рдлрд╣рд░реВ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН (рд░ рдкреАрдбрд╛рд╕рд╛рде рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рд╛рде)
рдЦ) рд╕рдмреИ рдЪреНрдпрд╛рдирд▓рд╣рд░реВрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдЪрд╛рд░реНрдЯ рдЫреЛрдбреНрдиреБрд╣реЛрд╕реН (рд░ рд░рдВрдЧреАрди рд░реЗрдЦрд╛рд╣рд░реВ рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдЕрд▓рд░реНрдЯрд╣рд░реВрдорд╛ рд╣рд░рд╛рдЙрдиреБрд╣реЛрд╕реН)

Kapacitor рдорд╛ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╢реЛрдзрди рдХреЛ рд▓рд╛рдЧреА рдпреБрдХреНрддрд┐рд╣рд░реБ

рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдиреБрднрдпреЛ?

рдлреЗрд░рд┐, рддреНрдпрд╣рд╛рдБ рдХрд╛рдЧрдЬрд╛рддрдорд╛ рд░рд╛рдореНрд░реЛ рд╕реБрд░реВрд╡рд╛рдд рдЙрджрд╛рд╣рд░рдг рдЫ (рдЬреЛрдбрд┐рдПрдХрд╛ рд╢реГрдЩреНрдЦрд▓рд╛рд╣рд░реВрдорд╛ рджрд░рд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрджреИ), рдЙрд╕реНрддреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдорд╛ рд╣реЗрд░реНрди рд╡рд╛ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рди рд╕рдХрд┐рдиреНрдЫред

рд╣рд╛рдореАрд▓реЗ рдЕрдиреНрддрдорд╛ рдХреЗ рдЧрд░реНрдпреМрдВ:

  • рдХреЗрд╣реА рдШрдгреНрдЯрд╛рдорд╛ рджреБрдИ рд╢реГрдЩреНрдЦрд▓рд╛рд╣рд░реВрдорд╛ рд╕рд╛рдореЗрд▓ рд╣реБрдиреБрд╣реЛрд╕реН, рдЪреНрдпрд╛рдирд▓рд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣рдмрджреНрдз рдЧрд░реНрдиреБрд╣реЛрд╕реН;
  • рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдбрд╛рдЯрд╛ рдерд┐рдПрди рднрдиреЗ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рднрд░реНрдиреБрд╣реЛрд╕реН;
  • рдЕрдШрд┐рд▓реНрд▓реЛ рдбреЗрдЯрд╛ рд╕рдВрдЧ рдкрдЫрд┐рд▓реНрд▓реЛ 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)

рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╣реЛ?

Kapacitor рд╕рдореВрд╣рд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛рдХреЛ рд╕рд╛рде рдирд┐рдЧрд░рд╛рдиреА-рдЕрд▓рд░реНрдЯрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди, рдкрд╣рд┐рд▓реЗ рдиреИ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдореЗрдЯреНрд░рд┐рдХреНрд╕рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛рд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди, рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд░ рд▓рд┐рдкрд┐рд╣рд░реВ (udf) рдЪрд▓рд╛рдЙрдирдорд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдЫред

рдкреНрд░рд╡реЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдмрд╛рдзрд╛ рдзреЗрд░реИ рдЙрдЪреНрдЪ рдЫреИрди - рдпрджрд┐ рдЧреНрд░рд╛рдлрдирд╛ рд╡рд╛ рдЕрдиреНрдп рдЙрдкрдХрд░рдгрд╣рд░реВрд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рдЗрдЪреНрдЫрд╛рд▓рд╛рдИ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕рдиреНрддреБрд╖реНрдЯ рдЧрд░реНрджреИрди рднрдиреЗ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди