Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

အများစုမှာ ယနေ့ခေတ်တွင် ဝန်ဆောင်မှုမက်ထရစ်များ စုဆောင်းရန် အဘယ်ကြောင့် လိုအပ်သနည်းဟု မေးခွန်းထုတ်စရာမရှိပါ။ နောက်ထပ် ယုတ္တိတန်သော အဆင့်မှာ သင့်အတွက် အဆင်ပြေသည့် ချန်နယ်များရှိ ဒေတာများတွင် သွေဖည်သွားခြင်း (မေးလ်၊ Slack၊ Telegram) အတွက် သတိပေးချက်တစ်ခု သတ်မှတ်ရန် ဖြစ်သည်။ အွန်လိုင်းဟိုတယ်ဘွတ်ကင်ဝန်ဆောင်မှုအတွက် Ostrovok.ru ကျွန်ုပ်တို့၏ဝန်ဆောင်မှုများ၏ တိုင်းတာမှုအားလုံးကို InfluxDB ထဲသို့ လောင်းထည့်ပြီး အခြေခံသတိပေးချက်ကိုလည်း စီစဉ်သတ်မှတ်ထားသည့် Grafana တွင် ပြသထားသည်။ "တစ်စုံတစ်ခုကို တွက်ချက်ပြီး ဤအရာနှင့် နှိုင်းယှဉ်ရန် လိုအပ်သည်" ကဲ့သို့သော အလုပ်များအတွက် Kapacitor ကို အသုံးပြုပါသည်။

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ
Kapacitor သည် InfluxDB မှ မက်ထရစ်များကို လုပ်ဆောင်နိုင်သည့် TICK stack ၏ အစိတ်အပိုင်းတစ်ခုဖြစ်သည်။ ၎င်းသည် တိုင်းတာမှုများစွာကို အတူတကွပူးပေါင်းနိုင်ပြီး လက်ခံရရှိသည့်ဒေတာမှ အသုံးဝင်သောအရာတစ်ခုကို တွက်ချက်နိုင်သည်၊ ရလဒ်ကို InfluxDB သို့ပြန်ရေးပြီး Slack/Telegram/mail သို့ သတိပေးချက်တစ်ခုပေးပို့နိုင်သည်။

stack တစ်ခုလုံးတွင် အေးမြပြီး အသေးစိတ်ကျသည်။ စာရွက်စာတမ်းသို့သော် လက်စွဲစာအုပ်များတွင် အတိအလင်းဖော်ပြထားခြင်းမရှိသော အသုံးဝင်သောအရာများ အမြဲရှိပါသည်။ ဤဆောင်းပါးတွင်၊ ဤကဲ့သို့သော အသုံးဝင်သော ထင်ရှားသော အကြံပြုချက်များစွာကို စုဆောင်းရန် ဆုံးဖြတ်ခဲ့သည် (TICKscipt ၏ အခြေခံ syntax ကို ဖော်ပြထားပါသည်။ ဒီမှာ) နှင့် ကျွန်ုပ်တို့၏ ပြဿနာများကို ဖြေရှင်းခြင်း၏ ဥပမာကို အသုံးပြု၍ ၎င်းတို့ကို မည်သို့ အသုံးချနိုင်ကြောင်း ပြသပါ။

သွားစို့!

float & int, တွက်ချက်မှုအမှားများ

Casting ဖြင့် ဖြေရှင်းထားသော လုံးဝ စံပြဿနာတစ်ခု

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)

Join ဖြည့်ပါ (အတွင်းနှင့်အပြင်)

မူရင်းအားဖြင့်၊ Join သည် ဒေတာမရှိသော အမှတ်များ (အတွင်းပိုင်း) ကို ဖျက်သိမ်းမည်ဖြစ်သည်။
ဖြည့်စွက်သည့်အခါ ('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) - ကျွန်ုပ်တို့သည် ပြုပြင်မှုများနှင့် ဒုက္ခအနည်းငယ်ကို စောင့်မျှော်နေပါသည်။

တွက်ချက်မှုများတွင် အခြေအနေများကို အသုံးပြုခြင်း ( lambda တွင်ရှိလျှင်)

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

ပိုက်လိုင်းမှ နောက်ဆုံးငါးမိနစ် သည် ကာလဖြစ်သည်။

ဥပမာအားဖြင့်၊ သင်သည် ယခင်အပတ်နှင့် နောက်ဆုံးငါးမိနစ်၏ တန်ဖိုးများကို နှိုင်းယှဉ်ရန် လိုအပ်သည်။ သီးခြားအသုတ်နှစ်ခုတွင် ဒေတာနှစ်ခုကို သင်ယူနိုင်သည် သို့မဟုတ် ပိုကြီးသောကာလတစ်ခုမှ ဒေတာအချို့ကို ဆွဲထုတ်နိုင်သည်-

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

နောက်ဆုံးငါးမိနစ်အတွက် အခြားရွေးချယ်စရာတစ်ခုမှာ သတ်မှတ်ထားသည့်အချိန်မတိုင်မီ ဒေတာဖြတ်တောက်မည့် BarrierNode node ကို အသုံးပြုခြင်းဖြစ်သည်-

|barrier()
        .period(5m)

မက်ဆေ့ချ်တွင် Go ပုံစံများကို အသုံးပြုခြင်း၏ နမူနာများ

တင်းပလိတ်များသည် ပက်ကေ့ခ်ျမှဖော်မတ်များနှင့် ကိုက်ညီပါသည်။ 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 ပါ၀င်သည်၊ ၎င်းသည် သင်၏ script ကိုလွန်သောဘောင်များ (stdin) ဖြင့်လုပ်ဆောင်နိုင်သည် - တီထွင်ဖန်တီးမှုနှင့်အခြားအရာမရှိပါ။

ကျွန်ုပ်တို့၏ စိတ်ကြိုက်တစ်ခုသည် slack သို့ အကြောင်းကြားချက်များကို ပေးပို့ရန်အတွက် အသေးစား python script တစ်ခုဖြစ်သည်။
ပထမတော့ ကျွန်ုပ်တို့သည် မက်ဆေ့ချ်တွင် ခွင့်ပြုချက်ဖြင့် ကာကွယ်ထားသော Grafana မှ ဓာတ်ပုံတစ်ပုံကို ပေးပို့လိုပါသည်။ ထို့နောက် - တူညီသောအုပ်စုမှ ယခင်သတိပေးချက်ကို စာတွဲတွင် OK ရေးပြီး သီးခြားမက်ဆေ့ချ်တွင် မဟုတ်ဘဲ၊ ခဏအကြာ – ပြီးခဲ့သော X မိနစ်အတွင်း မကြာခဏဆိုသလို အမှားအယွင်းကို မက်ဆေ့ချ်တွင် ထည့်ပါ။

သီးခြားအကြောင်းအရာသည် အခြားဝန်ဆောင်မှုများနှင့် ချိတ်ဆက်မှုနှင့် သတိပေးချက်မှ အစပြုသည့် လုပ်ဆောင်မှုများ (သင့်စောင့်ကြည့်မှု ကောင်းမွန်လုံလောက်မှသာ)။
slack_handler.py သည် ကျွန်ုပ်တို့၏စိတ်ကြိုက် script ဖြစ်သည့် ကိုင်တွယ်သူဖော်ပြချက်၏ ဥပမာတစ်ခု။

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 ကိုကြည့်ပါ။ host-or-ip:9092 မှတ်တမ်း lvl=အမှား

httpOut ဖြင့် ရွေးချယ်မှု

လက်ရှိပိုက်လိုင်းရှိ ဒေတာကို ပြသည်-

|httpOut('something')

စောင့်ကြည့် (ရယူပါ) host-or-ip:9092/kapacitor/v1/tasks/task_name/တစ်ခုခု

ကွပ်မျက်ရေးအစီအစဉ်

  • အလုပ်တစ်ခုစီသည် ဖော်မတ်တွင် အသုံးဝင်သော နံပါတ်များပါသည့် execution tree တစ်ခုကို ပြန်ပေးသည်။ ဂရပ်ဖစ်.
  • ဘလောက်တစ်ခုယူတယ်။ အစက်.
  • ကြည့်ရှုသူသို့ ကူးထည့်ပါ ပျော်ရအောင်.

တခြားဘယ်မှာ အရိုက်ခံရနိုင်မလဲ။

ရေးခြင်းတွင် influxdb တွင် အချိန်တံဆိပ်တုံး

ဥပမာအားဖြင့်၊ ကျွန်ုပ်တို့သည် တစ်နာရီလျှင် တောင်းဆိုမှုများ (groupBy(1h)) အတွက် သတိပေးချက်တစ်ခုကို သတ်မှတ်ပြီး influxdb တွင် ဖြစ်ပွားခဲ့သော သတိပေးချက် (ဂရပ်ဖနားရှိ ဂရပ်ပေါ်ရှိ ပြဿနာ၏အချက်ကို ကောင်းစွာပြသရန်)။

influxDBOut() သည် သတိပေးချက်မှ အချိန်အမှတ်အသားအထိ အချိန်တန်ဖိုးကို ရေးပေးလိမ့်မည်၊ ထို့ကြောင့် ဇယားပေါ်ရှိ အမှတ်သည် သတိပေးချက်ရောက်သည်ထက် စော/နောက်ကျမှ ရေးမည်ဖြစ်သည်။

တိကျမှုရှိရန် လိုအပ်သည့်အခါ၊ လက်ရှိအချိန်တံဆိပ်ဖြင့် influxdb သို့ ဒေတာများရေးပေးမည့် စိတ်ကြိုက်ကိုင်တွယ်သူအား ခေါ်ဆိုခြင်းဖြင့် ဤပြဿနာကို ကျွန်ုပ်တို့ဖြေရှင်းနိုင်သည်။

docker၊ တည်ဆောက်ပြီး အသုံးချပါ။

စတင်သည့်အခါ၊ kapacitor သည် [load] block တွင် သတ်မှတ်ထားသော config တွင် သတ်မှတ်ထားသည့် directory မှ အလုပ်များ၊ template များနှင့် handlers များကို တင်နိုင်သည်။

အလုပ်တစ်ခုကို မှန်ကန်စွာဖန်တီးရန်၊ သင်သည် အောက်ပါအရာများ လိုအပ်သည်-

  1. ဖိုင်အမည် - id/script name သို့ ချဲ့သည်။
  2. အမျိုးအစား - ထုတ်လွှင့်/အသုတ်
  3. dbrp - မည်သည့်ဒေတာဘေ့စ် + မူဝါဒတွင် script အလုပ်လုပ်သည်ကို သတ်မှတ်ခြင်းအတွက် အဓိကစကားလုံး (dbrp "supplier"."autogen")

အကယ်၍ အချို့သော batch task တွင် dbrp နှင့် လိုင်းမရှိပါက ဝန်ဆောင်မှုတစ်ခုလုံးသည် စတင်ရန် ငြင်းဆိုမည်ဖြစ်ပြီး ၎င်းအကြောင်းကို မှတ်တမ်းတွင် ရိုးရိုးသားသား ရေးပါ။

Chronograf တွင်၊ ဆန့်ကျင်ဘက်တွင်၊ ဤလိုင်းသည် ထိုနေရာတွင် မရှိသင့်ပါ။ ၎င်းကို အင်တာဖေ့စ်မှတစ်ဆင့် လက်ခံ၍ အမှားတစ်ခုကို ပြန်ပို့ပေးသည်။

ကွန်တိန်နာတည်ဆောက်မှုဟက်ခ်- //.+dbrp လိုင်းများပါရှိလျှင် Dockerfile သည် -1 ဖြင့် ထွက်သည်၊ ၎င်းသည် တည်ဆောက်မှုပျက်ကွက်ရခြင်းအကြောင်းရင်းကို ချက်ချင်းနားလည်နိုင်စေမည်ဖြစ်သည်။

တစ်ခုမှ အများအပြား ချိတ်ဆက်ပါ။

ဥပမာ အလုပ်- သင်သည် တစ်ပတ်အတွက် ဝန်ဆောင်မှု၏ အလုပ်ချိန်၏ 95th ရာခိုင်နှုန်းကို ယူပြီး၊ နောက်ဆုံး 10 မိနစ်တိုင်းကို ဤတန်ဖိုးနှင့် နှိုင်းယှဉ်ရန် လိုအပ်သည်။

သင်တစ်ဦးမှတစ်ခုသို့ အများအပြားပါဝင်ရန်၊ အမှတ်အုပ်စုတစ်ခုရှိ နောက်ဆုံး/ပျမ်းမျှ/အလယ်အလတ်သည် node အား stream တစ်ခုအဖြစ်သို့ပြောင်းသည်၊ အမှားသည် "ကလေးနှင့်မကိုက်ညီသောအနားများကိုထည့်နိုင်သည်- batch -> stream" သည် ပြန်သွားလိမ့်မည်။

lambda စကားရပ်တွင် ပြောင်းလဲမှုတစ်ခုအနေဖြင့် အသုတ်၏ရလဒ်ကိုလည်း အစားထိုးမည်မဟုတ်ပါ။

ပထမအသုတ်မှ udf မှတစ်ဆင့် ဖိုင်တစ်ခုသို့ လိုအပ်သော နံပါတ်များကို သိမ်းဆည်းရန်နှင့် ဤဖိုင်ကို sideload မှတစ်ဆင့် တင်ရန် ရွေးချယ်ခွင့်ရှိပါသည်။

ဒါကို ကျွန်တော်တို့ ဘာဖြေရှင်းခဲ့လဲ။

ကျွန်ုပ်တို့တွင် ဟိုတယ်ပေးသွင်းသူ 100 ခန့်ရှိပြီး ၎င်းတို့တစ်ဦးစီတွင် ချိတ်ဆက်မှုများစွာရှိနိုင်သည်၊ ၎င်းကို ချန်နယ်တစ်ခုဟုခေါ်ဆိုကြပါစို့။ အဲဒီချန်နယ် 300 လောက်ရှိပြီး ချန်နယ်တစ်ခုစီ ပြုတ်ကျနိုင်ပါတယ်။ မှတ်တမ်းတင်ထားသော မက်ထရစ်များအားလုံး၏ အမှားအယွင်းနှုန်း (တောင်းဆိုမှုများနှင့် အမှားများ) ကို စောင့်ကြည့်ပါမည်။

Grafana က ဘာကြောင့် မလုပ်တာလဲ။

Grafana တွင် ပြင်ဆင်ထားသော အမှားသတိပေးချက်များတွင် အားနည်းချက်များစွာရှိသည်။ အချို့က အတိမ်းအစောင်းမခံဘဲ အခြေအနေပေါ်မူတည်၍ လစ်လျူရှုနိုင်သည်။

Grafana သည် ဘက်မလိုက်သော တွက်ချက်မှုများ + သတိပေးချက်တို့ကို မလုပ်ဆောင်နိုင်သော်လည်း ကျွန်ုပ်တို့သည် နှုန်းထား (တောင်းဆိုချက်များ-အမှားများ)/တောင်းဆိုမှုများ လိုအပ်ပါသည်။

အမှားများသည် ဆိုးရွားလှသည်-

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

အောင်မြင်သောမေးခွန်းများကိုကြည့်လျှင် မကောင်းမှုနည်းသည်။

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

ကောင်းပြီ၊ Grafana မတိုင်မီ ဝန်ဆောင်မှုရှိ နှုန်းထားကို ကျွန်ုပ်တို့ ကြိုတင်တွက်ချက်နိုင်ပြီး အချို့ကိစ္စများတွင် ၎င်းသည် အလုပ်လုပ်မည်ဖြစ်သည်။ သို့သော် ချန်နယ်တစ်ခုစီအတွက် ၎င်း၏ကိုယ်ပိုင်အချိုးကို "သာမန်" ဟုယူဆသောကြောင့် ကျွန်ုပ်တို့တွင်မဟုတ်ပါ၊ အဘယ်ကြောင့်ဆိုသော် သတိပေးချက်များသည် တည်ငြိမ်သောတန်ဖိုးများပေါ်တွင်အလုပ်လုပ်သည် (ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏မျက်လုံးဖြင့်ကြည့်သည်၊ ၎င်းသည် မကြာခဏသတိပေးလျှင် ပြောင်းလဲသည်)။

ဤအရာများသည် မတူညီသော ချန်နယ်များအတွက် "ပုံမှန်" ၏ ဥပမာများဖြစ်သည်-

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

ယခင်အချက်ကို လျစ်လျူရှုပြီး ပေးသွင်းသူအားလုံးတွင် အလားတူ "သာမန်" ပုံတစ်ပုံရှိသည်ဟု ယူဆကြပါစို့။ အခုတော့ အားလုံးအဆင်ပြေပြီ၊ Grafana မှာ သတိပေးချက်တွေနဲ့ ဖြတ်သန်းလို့ရလား။
ကျွန်ုပ်တို့ တတ်နိုင်သော်လည်း၊ ကျွန်ုပ်တို့သည် ရွေးချယ်စရာများထဲမှ တစ်ခုကို ရွေးချယ်ရသောကြောင့်၊
က) ချန်နယ်တစ်ခုစီအတွက် ဂရပ်ဖစ်အများအပြားကို သီးခြားစီပြုလုပ်ပါ (၎င်းတို့ကို နာကျင်စွာထိန်းသိမ်းထားပါ)
ခ) ချန်နယ်အားလုံးတွင် ဇယားကွက်တစ်ခု ချန်ထားခဲ့ပါ (ရောင်စုံလိုင်းများနှင့် စိတ်ကြိုက်သတိပေးချက်များ ပျောက်ဆုံးသွားပါ)

Kapacitor ရှိ မက်ထရစ်များကို လုပ်ဆောင်ရန်အတွက် လှည့်ကွက်များ

မင်းဘယ်လိုလုပ်ခဲ့တာလဲ။

တစ်ဖန်၊ စာတမ်းပြုစုခြင်းတွင် ကောင်းမွန်သောအစပြု ဥပမာတစ်ခု ရှိသည် (ချိတ်ဆက်ထားသောစီးရီးများတစ်လျှောက် နှုန်းထားများကို တွက်ချက်ခြင်း။) အလားတူပြဿနာများတွင် အခြေခံအဖြစ် သင်ကြည့်ရှုနိုင်သည် သို့မဟုတ် အသုံးပြုနိုင်သည်။

အဆုံးတွင် ကျွန်ုပ်တို့ ဘာလုပ်ခဲ့သနည်း။

  • နာရီအနည်းငယ်အတွင်း အပိုင်းနှစ်ပိုင်းကို ချန်နယ်များဖြင့် အုပ်စုဖွဲ့ခြင်း၊
  • ဒေတာမရှိပါက အုပ်စုများအလိုက် စီးရီးများကို ဖြည့်ပါ။
  • နောက်ဆုံး 10 မိနစ်၏ ပျမ်းမျှအား ယခင်ဒေတာနှင့် နှိုင်းယှဉ်ပါ။
  • တစ်ခုခုတွေ့ရင် အော်ပြော၊
  • ကျွန်ုပ်တို့သည် တွက်ချက်ထားသော နှုန်းထားများနှင့် influxdb တွင် ဖြစ်ပေါ်ခဲ့သော သတိပေးချက်များကို ရေးပေးပါသည်။
  • အားမနာစေရန် အသုံးဝင်သော မက်ဆေ့ချ်တစ်ခု ပေးပို့ပါ။

ကျွန်ုပ်၏အမြင်အရ၊ ကျွန်ုပ်တို့သည် အလှပဆုံးနည်းလမ်းဖြင့် အဆုံးတွင်ရလိုသမျှကို အောင်မြင်နိုင်သည် (နှင့် စိတ်ကြိုက်ကိုင်တွယ်သူများနှင့် အနည်းငယ်ပို၍ပင်)။

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 သည် မှတ်တမ်းတင်ထားပြီးသော မက်ထရစ်များကို အခြေခံ၍ ထပ်လောင်းတွက်ချက်မှုများ လုပ်ဆောင်ခြင်း၊ စိတ်ကြိုက်လုပ်ဆောင်မှုများ လုပ်ဆောင်ခြင်းနှင့် script များလုပ်ဆောင်ခြင်း (udf) ကို အခြေခံ၍ အဖွဲ့အများအပြားဖြင့် စောင့်ကြည့်ခြင်းနှင့် သတိပေးခြင်းတွင် ထူးချွန်သည်။

ဝင်ရောက်မှုအဆင့်သည် အလွန်မြင့်မားသည်မဟုတ်ပါ - Grafana သို့မဟုတ် အခြားကိရိယာများက သင့်ဆန္ဒများကို အပြည့်အဝမဖြည့်ဆည်းပေးနိုင်ပါက စမ်းသုံးကြည့်ပါ။

source: www.habr.com

DDoS ကာကွယ်ရေး၊ VPS VDS ဆာဗာများပါသည့် ဆိုက်များအတွက် ယုံကြည်စိတ်ချရသော hosting ကို ဝယ်ယူပါ။ 🔥 DDoS ကာကွယ်မှု၊ VPS VDS ဆာဗာများပါရှိသော ယုံကြည်စိတ်ချရသော ဝဘ်ဆိုက် hosting ကို ဝယ်ယူပါ | ProHoster