рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдЬ рдХрд┐рд╕реА рдХреЗ рдорди рдореЗрдВ рдпрд╣ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдореАрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЕрдЧрд▓рд╛ рддрд╛рд░реНрдХрд┐рдХ рдХрджрдо рдПрдХрддреНрд░рд┐рдд рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рд░реНрдЯ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЪреИрдирд▓реЛрдВ (рдореЗрд▓, рд╕реНрд▓реИрдХ, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдЧрд╛ред рдСрдирд▓рд╛рдЗрди рд╣реЛрдЯрд▓ рдмреБрдХрд┐рдВрдЧ рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рднреА рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдиреНрдлреНрд▓рдХреНрд╕рдбреАрдмреА рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдмреБрдирд┐рдпрд╛рджреА рдЕрд▓рд░реНрдЯрд┐рдВрдЧ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЬрд╛рддреА рд╣реИред "рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдо 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 рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рдЯрд┐рдХрдЯ рд╣реИрдВ (, , ) - рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯ рднреА рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред
рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдпрджрд┐ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рд╣реЛ)
|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 рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ [рд▓реЛрдб] рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- рдлрд╝рд╛рдЗрд▓ рдирд╛рдо - рдЖрдИрдбреА/рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╛рдо рддрдХ рд╡рд┐рд╕реНрддреГрдд рд╣реЛрддрд╛ рд╣реИ
- рдкреНрд░рдХрд╛рд░ тАУ рд╕реНрдЯреНрд░реАрдо/рдмреИрдЪ
- 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
