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

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

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

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

သွားစို့!

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

အဆင့်အတန်းခွဲခြား၍ ဖြေရှင်းနိုင်သော လုံးဝစံပြပြဿနာ၊

var alert_float = 5.0
var alert_int = 10
data|eval(lambda: float("value") > alert_float OR float("value") < float("alert_int"))

default() ကိုအသုံးပြုခြင်း

တဂ်/အကွက်ကို မဖြည့်ပါက၊ တွက်ချက်မှု အမှားများ ဖြစ်ပေါ်လာလိမ့်မည်-

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

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

မူရင်းအားဖြင့်၊ Join သည် ဒေတာမရှိသော အမှတ်များ (အတွင်းပိုင်း) ကို ဖျက်သိမ်းမည်ဖြစ်သည်။
ဖြည့်စွက်('null') ဖြင့်၊ ပြင်ပချိတ်ဆက်မှုတစ်ခု လုပ်ဆောင်မည်ဖြစ်ပြီး၊ ထို့နောက် သင်သည် ပုံသေ()တစ်ခုပြုလုပ်ရန် လိုအပ်ပြီး ဗလာတန်ဖိုးများကို ဖြည့်ပါ-

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 ကို အသုံးပြုခြင်းဖြစ်သည်-

|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 တစ်ခုဖြစ်သည်။
ပထမတော့၊ ခွင့်ပြုချက်ကာကွယ်ထားတဲ့ ဂရပ်ဖနားရုပ်ပုံတစ်ပုံကို မက်ဆေ့ချ်ကနေ ပို့ချင်တယ်။ ထို့နောက် တူညီသောအုပ်စုမှ ယခင်သတိပေးချက်ကို စာတွဲတွင် 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 ကိုကြည့်ပါ။ host-or-ip:9092 မှတ်တမ်း lvl=အမှား

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

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

|httpOut('something')

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

အကောင်အထည်ဖော်မှုပုံစံ

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

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

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

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

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

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

docker၊ တည်ဆောက်ခြင်းနှင့် ဖြန့်ကျက်ခြင်း။

စတင်ချိန်တွင်၊ kapacitor သည် [load] block ရှိ config တွင် သတ်မှတ်ထားသည့် directory မှ လုပ်ဆောင်စရာများ၊ ပုံစံများနှင့် ကိုင်တွယ်သူများကို တင်နိုင်သည်။

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

  1. ဖိုင်အမည် – script id/name သို့ တိုးချဲ့ထားသည်။
  2. အမျိုးအစား - ထုတ်လွှင့်/အသုတ်
  3. dbrp – မည်သည့်ဒေတာဘေ့စ် + မူဝါဒတွင် script လည်ပတ်သည်ကို ညွှန်ပြရန် သော့ချက်စာလုံး (dbrp “ပေးသွင်းသူ။” “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) ရလာတဲ့ script ပါ။

ရရှိလာသောကုဒ်၏ ဥပမာတစ်ခု။

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

မှတ်ချက် Add