рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЬ рдХрд┐рд╕реА рдХреЗ рдорди рдореЗрдВ рдпрд╣ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдореАрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдЧрд▓рд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рдПрдХрддреНрд░рд┐рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рд░реНрдЯ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреИрдирд▓реЛрдВ (рдореЗрд▓, рд╕реНрд▓реИрдХ, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред рдСрдирд▓рд╛рдЗрди рд╣реЛрдЯрд▓ рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рдУрд╕реНрдЯреНрд░реЛрд╡реЛрдХ.рд░реБ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рднреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмреБрдирд┐рдпрд╛рджреА рдЕрд▓рд░реНрдЯрд┐рдВрдЧ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЬрд╛рддреА рд╣реИред "рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо Kapacitor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ
рдХреИрдкреЗрд╕рд┐рдЯрд░ рдЯрд┐рдХ рд╕реНрдЯреИрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рд╕реЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрдИ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ), рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рд╕реЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрд▓реИрдХ/рдЯреЗрд▓реАрдЧреНрд░рд╛рдо/рдореЗрд▓ рдкрд░ рдЕрд▓рд░реНрдЯ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рд╢рд╛рдВрдд рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рд▓реЗрдЦрди, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдореИрдиреБрдЕрд▓ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдХрдИ рдРрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ (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)

рдпрд╣рд╛рдВ рдЕрднреА рднреА рдПрдХ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ (res1 рдпрд╛ res2) рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рд░рд┐рдХреНрдд рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдбреЗрдЯрд╛) рднреА рд░рд┐рдХреНрдд рд╣реЛрдЧреАред GitHub рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рдЯрд┐рдХрдЯ рд╣реИрдВ (1633, 1871, 6967) - рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯ рднреА рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред

рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдпрджрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рд╣реЛ)

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

рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрддрд┐рдо рдкрд╛рдВрдЪ рдорд┐рдирдЯ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдкрд┐рдЫрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрдк рдбреЗрдЯрд╛ рдХреЗ рджреЛ рдмреИрдЪреЛрдВ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреИрдЪреЛрдВ рдореЗрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рдмрдбрд╝реА рдЕрд╡рдзрд┐ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЕрдВрддрд┐рдо рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмреИрд░рд┐рдпрд░ рдиреЛрдб рдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИ:

|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) рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдФрд░ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ!

рд╣рдорд╛рд░реЗ рдХрд╕реНрдЯрдо рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрд▓реИрдХ рдХреЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЧреНрд░рд╛рдлрд╛рдирд╛ рд╕реЗ рдПрдХ рддрд╕реНрд╡реАрд░ рд╕рдВрджреЗрд╢ рдореЗрдВ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЬреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдереАред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реА рд╕рдореВрд╣ рд╕реЗ рдкрд┐рдЫрд▓реЗ рдЕрд▓рд░реНрдЯ рдХреЗ рдереНрд░реЗрдб рдореЗрдВ 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 рд╣реЛрд╕реНрдЯ-рдпрд╛-рдЖрдИрдкреА:9092 рд▓реЙрдЧ lvl=рддреНрд░реБрдЯрд┐

httpOut рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк

рд╡рд░реНрддрдорд╛рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

|httpOut('something')

рджреЗрдЦреЗрдВ (рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ): рд╣реЛрд╕реНрдЯ-рдпрд╛-рдЖрдИрдкреА:9092/kapacitor/v1/tasks/task_name/рдХреБрдЫ

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

  • рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╡реГрдХреНрд╖ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЧреНрд░рд╛рдлрд╝рд╡рд┐рдЬрд╝.
  • рд╣рдо рдПрдХ рдмреНрд▓реЙрдХ рд▓реЗрддреЗ рд╣реИрдВ рдбреЙрдЯ.
  • рд╡реНрдпреВрдЕрд░ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ, рд▓реЗрдЯреНрд╕ рдЗрдирдЬреЙрдп.

рдЖрдк рдФрд░ рдХрд╣рд╛рдВ рд░реЗрдХ рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдореЗрдВ рд░рд╛рдЗрдЯрдмреИрдХ рдкрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк

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

influxDBOut() рдЕрд▓рд░реНрдЯ рд╕реЗ рд╕рдордп рдорд╛рди рдХреЛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рд▓рд┐рдЦ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рдкрд░ рдмрд┐рдВрджреБ рдЕрд▓рд░реНрдЯ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ/рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬрдм рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдЗрдирдлреНрд▓рдХреНрд╕рдбреАрдмреА рдореЗрдВ рд▓рд┐рдЦреЗрдЧрд╛ред

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

рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╕рдордп, kapacitor рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ [рд▓реЛрдб] рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

  1. рдлрд╝рд╛рдЗрд▓ рдирд╛рдо - рдЖрдИрдбреА/рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо рддрдХ рд╡рд┐рд╕реНрддреГрдд рд╣реЛрддрд╛ рд╣реИ
  2. рдкреНрд░рдХрд╛рд░ тАУ рд╕реНрдЯреНрд░реАрдо/рдмреИрдЪ
  3. dbrp - рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ + рдиреАрддрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ (dbrp "supplier"."autogen")

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

рдХреНрд░реЛрдиреЛрдЧреНрд░рд╛рдл рдореЗрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рд░реЗрдЦрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП; рдЗрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред

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

рдПрдХ рд╕реЗ рдЕрдиреЗрдХ рдХреЛ рдЬреЛрдбрд╝рдирд╛

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

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

рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмреИрдЪ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдмреИрдЪ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ udf рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд╕рд╛рдЗрдбрд▓реЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдореМрдЬреВрдж рд╣реИред

рд╣рдо рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣рд▓ рдирд┐рдХрд╛рд▓ рд░рд╣реЗ рдереЗ?

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

рдЧреНрд░рд╛рдлрд╝рд╛рдирд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдЧреНрд░рд╛рдлрд╝рд╛рдирд╛ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдЕрд▓рд░реНрдЯ рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВред рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдХреБрдЫ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЧреНрд░рд╛рдлрд╛рдирд╛ рдЕрдВрддрд░-рдЖрдпрд╛рдореА рдЧрдгрдирд╛ + рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рджрд░ (рдЕрдиреБрд░реЛрдз-рддреНрд░реБрдЯрд┐рдпрд╛рдВ) / рдЕрдиреБрд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдмрд╣реБрдд рдмреБрд░реА рд▓рдЧрддреА рд╣реИрдВ:

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

рдФрд░ рдпрджрд┐ рдЖрдк рд╕рдлрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рддреЛ рдпрд╣ рдХрдо рдмреБрд░рд╛ рд╣реИ:

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

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

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

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

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

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдореЗрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдпреБрдХреНрддрд┐рдпрд╛рдБ

рдЖрдкрдиреЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд┐рдпрд╛?

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

рдЕрдВрдд рдореЗрдВ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:

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

рддреЛ рдлрд┐рд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреНрдпрд╛ рд╣реИ?

рдХреИрдкреЗрд╕рд┐рдЯрд░ рдХрдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреЗ, рдкрд╣рд▓реЗ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдП рдЧрдП рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛ рдХрд░рдиреЗ, рдХрд╕реНрдЯрдо рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдпреВрдбреАрдПрдл) рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

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

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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрд╡рд░ рд╡рд╛рд▓реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ ЁЯФе рдбреАрдбреАрдУрдПрд╕ рд╕реБрд░рдХреНрд╖рд╛, рд╡реАрдкреАрдПрд╕ рдФрд░ рд╡реАрдбреАрдПрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдЦрд░реАрджреЗрдВ | ProHoster