Elasticsearch অ্যালার্ট ব্যবহার করে জানুন কেগ "প্রায় খালি" কখন
ObjectRocket-এ আমরা অফিসে কোল্ড ব্রু কফি ট্যাপ থেকে পান। অগাস্টে অস্টিন, টেক্সাসে খুব গরম। আমাদের ক্যাফিন ঠান্ডা থাকতে হবে।
আমরা একবারে একটি কেগ রাখি, তাই ঠিক সময়ে অর্ডার দেওয়া কঠিন। কোনো একজন বলল "আমরা কোল্ড ব্রু ব্যবহারের ভালো ডেটা পেলে ভালো হত" - আমি তখনই এটি বাস্তবায়নে লাগলাম। Elastic Stack কী করতে পারে তা দেখানোর নতুন উপায় খুঁজছিলাম, তাই একটি সেমি-অটোনোমাস মনিটরিং ও অ্যালার্টিং সিস্টেম তৈরি করলাম যাতে কখনো কোল্ড ব্রু শেষ না হয়।
ফলাফল হল Raspberry Pi, Elasticsearch, Kibana, এবং Sentinl/ElastAlert-এর সংমিশ্রণ, যা কেগের সাথে কিছু গুরুত্বপূর্ণ ঘটলে Slack-এ অ্যালার্ট পাঠায়। Sentinl এবং ElastAlert এই শো-রানার। পরে সেগুলো বিস্তারিত আলোচনা করব।
কেগ থেকে ডেটা (শুধু কোল্ড ব্রু নয়)
নেক্সট ব্লগে কেগেরেটর বিল্ড-আউট এবং ফ্লো রেট মনিটরিং সিস্টেম বানানোর বদলে স্কেল-কেগ-ওয়েট সমাধান কেন বেছে নিলাম তা আলোচনা করব।
এই ব্লগের জন্য জানা দরকার: আমি একটি Raspberry Pi-চালিত স্কেল সেট আপ করেছি যা নিয়মিত Elasticsearch-এ ডকুমেন্ট পাঠায়, ফরম্যাট নিচের মতো:
{
"_index": "filebeat-6.2.4-2018.05.15",
"_type": "doc",
"_source": {
"@timestamp": "2018-05-15T16:50:49.000Z",
"beat": {
"hostname": "raspberrypi",
"name": "raspberrypi",
"version": "6.2.4"
},
"weight": 58.4,
"message": "2018-05-15T16:50:49+0000 - -0.4"
}
}
Filebeat ডেটা নেয় এবং দুটি মূল ফিল্ড আনার সاهیم আগ্রহ:
- প্রতিটি ওজন পড়ার "@timestamp"
- সেই টাইমস্ট্যাম্পে আসল "weight" পড়া
অ্যালার্টিং অপশন
প্রথমে: কেগের সাথে কিছু হলে অ্যাকশন নিতে হবে, তাই নোটিফিকেশন পাঠানোর উপায় দরকার। সেখানে অ্যালার্টিং প্যাকেজ কাজে আসে।
May be, Elasticsearch ক্লাস্টারে অ্যালার্টিং যোগ করার জন্য Apache 2.0 লাইসেন্সযুক্ত অনেক অপশন আছে: ElastAlert এবং Sentinl।
ElastAlert
ElastAlert হল Elasticsearch-এর জন্য একটি নমনীয় অ্যালার্টিং ফ্রেমওয়ার্ক, যা Yelp দ্বারা তৈরি এবং Elasticsearch থেকে আলাদা চলে। এটি मुखykle বেসিক কনফিগ ফাইলের মাধ্যমে কনফিগার করা হয়। ইউজাররা একটি মেইন কনফিগ ফাইল তৈরি করতে পারেন গ্লোবাল প্যারামিটারসহ সব অ্যালার্টের জন্য, তারপর প্রতিটি নিয়মের জন্য রুল ফাইল তৈরি করতে পারেন যাতে ElastAlert-নির্দিষ্ট YAML থাকে নিয়ম এবং ফলস্বরূপ অ্যালার্ট কনফিগার করতে। প্রতিটি "নিয়ম" bevat:
- স্ট্যান্ডার্ড নিয়মের তালিকার ভিত্তিতে নিয়ম কনফিগারেশন (যেমন "flatline", "spike", "metric aggregation")
- Elasticsearch ফিল্টার প্রতিটি নিয়ম যে কোয়েরি হিটস ব্যবহার করে সেটি সীমিত করতে
- নিয়মের অংশটি পজিটিভ হলে ফায়ার করার অ্যালার্ট (যেমন ইমেইল, Jira, Slack, ইত্যাদি)
Sentinl
Sentinl ElastAlert-এর চেয়ে নতুন। ObjectRocketObjectRocket সার্ভিসে কাস্টমারদের জন্য নতুন অ্যালার্টিং অপশন খুঁজে পেল Sentinl-কে, যা Siren Solutions দ্বারা তৈরি। Sentinl হল একটি Kibana প্লাগইন যা অ্যালার্টিং পাশাপাশি Elasticsearch-এর জন্য রিপোর্টিং অফার করে। এটি প্রতিটি কাজকে "watcher" বলে (পুরানো প্লাগইন সাথে গুলিয়ে না দিন) যার রয়েছে:
- একটি শিডিউল (কতবার এবং কখন চেক করবে)
- একটি ইনপুট কোয়েরি (যে ডেটা চেক করতে চান তার Elasticsearch কোয়েরি)
- একটি কন্ডিশন (লজিক যা নির্ধারণ করে ডেটা 보며 অ্যালার্ট দেবে কিনা)
- এক ট্রান্সফর্ম (অ্যালার্টের আগে ডেটা মডিফাই করার কোড)
- অ্যাকশনস (অ্যালার্ট দিলে কী করবে: Slack, ইমেইল, বা ওয়েবহুক)
আপনার জন্য কোন অ্যালার্টিং অপশন সঠিক?
দুটির খুব ভালো, তাই শুধু নির্ভর করে আপনি কী ধরনের অ্যালার্ট চাচ্ছেন। আমার ফাইন্ডিংস:
| ElastAlert | Sentinl | |
|---|---|---|
| Pros |
|
|
| Cons |
|
|
অ্যালার্ট তৈরি করা
এখন নির্ধারণ করতে হবে কী ধরনের অ্যালার্ট তৈরি করতে হবে। আমি জানতে চেয়েছিলাম কখন আরও কোল্ড ব্রু অর্ডার দিতে হবে। নিচের অ্যালার্টগুলো তৈরি করতে হলো:
কেগ খালি / প্রায় খালি
সহজ: ওজন নির্দিষ্ট থ্রেশহোল্ড-এর নিচে পড়লে রিপোর্ট করুন।
কেগ রিপ্লেস করা হয়েছে
আহা, নতুন কফি: ওজন হঠাৎ বৃদ্ধি পাওয়া Detect করুন।
মনিটরিং ভাঙল
ডেটা নেই, অ্যালার্ট নেই: স্কেল ডেটা পাঠানো বন্ধ করলে জানতে হবে।
কেগ খালি / প্রায় খালি
এই সিনেরিওতে, ওজন "খালি" বলে নির্দিষ্ট থ্রেশহোল্ড-এর নিচে পেলে অ্যালার্ট সেট করলাম, এবং ওজন যদি ~২০% কেগ বাকি থাকার ইঙ্গিত দেয় তবে সতর্ক করুন।
ElastAlert
ElastAlert-এ metric aggregation রুল টাইপ দিয়ে এটি সহজ: একটি মেট্রিক থেকে অ্যাগ্রিগেশন তৈরি করুন এবং তারপর তা নির্দিষ্ট থ্রেশহোল্ড-এর উপরে বা নিচে কিনা তা নির্ধারণ করুন।
# (Required)
# Rule name, must be unique
name: Empty Alarm
# (Required)
# Type of alert.
type: metric_aggregation
# (Required)
# Index to search, wildcard supported
index: filebeat-*
# How much data should we use
buffer_time:
hours: 1
# How often can we send this alert?
realert:
hours: 24
# Type of elasticsearch document to use
doc_type: doc
metric_agg_key: weight
metric_agg_type: max
min_threshold: 41
# (Required)
# The alert is use when a match is found
alert:
- "slack"
alert_subject: The cold brew keg is empty
alert_text_type: alert_text_only
alert_text: "The cold brew keg is empty. Panic."
slack:
slack_webhook_url: "https://hooks.slack.com/services/foo/bar"
slack_msg_color: danger
slack_emoji_override: ":torch-and-pitchfork:"
গত ১ ঘণ্টা (buffer_time) দেখতে সেট করা হলো, যেখানে ম্যাক্স ওজন ৪১-এর নিচে (খালি কেগ) এবং প্রতি ২৪ ঘণ্টায় একবার অ্যালার্ট পাঠাবে। তারপর Slack অ্যালার্ট, ডেটা টাইপ, কালার এবং ইমোজি কনফিগার করা যায়।
সতর্কতা অ্যালার্টে কিছু ট্রিকি। আমি শুধু জানতে চাই যখন সেটি ওয়ার্নিং থ্রেশহোল্ডের মধ্যে: ৪১ (খালি) এর উপরে কিন্তু ৬৫ (২৫% মার্ক) এর নিচে। ElastAlert যেহেতু একক থ্রেশহোল্ড দেয়, তাই ফিল্টার ব্যবহার করে ফিক্স করলাম।
metric_agg_key: weight
metric_agg_type: avg
min_threshold: 65
filter:
- range:
weight:
gte: 41
ওজন ৪১-এর চেয়ে বড় বা সমান হলে ফিল্টার করলাম কারণ যদি সব ওজন ৪১-এর নিচে থাকে, তবে এই অ্যালার্ট ট্রিগার করবে না (যেহেতু "খালি" অ্যালার্ট ট্রিগার করবে)। কিন্তু যদি কিছু ওজন ৪১ বা তার উপরে থাকে তবে "খালি" অ্যালার্ট ট্রিগার করবে না, এবং আমি নির্ধারণ করতে পারব গড় ৬৫-এর নিচে কিনা।
Sentinl
Sentinl একটি সহজ GUI দিয়ে watcher কনফিগার করতে দেয়।
প্রথম স্ক্রিনে watcher-কে নাম দিন এবং শিডিউল সেট করুন।
Input হলো Elasticsearch কোয়েরি যেটি আপনার চাওয়া ডেটা আনে: যেসব ডকুমেন্টে weight থাকে এবং weight ফিল্ডে একটি গড় অ্যাগ্রিগেশন তৈরি করা।
Condition স্ক্রিনে নির্ধারণ করুন কী অ্যালার্ট ট্রিগার করবে: কমপক্ষে কিছু হিট ফেরত আসতে হবে এবং গড় ওজন ৪১-এর নিচে হতে হবে।
এখানে একটি কনসোল অ্যালার্ট (যেটি একটি স্পেশাল ইনডেক্সে ডকুমেন্টও স্টোর করে) যা কন্ডিশন সত্য হলে মেসেজ ফায়ার করে।
Sentinl-এ UI আছে, কিন্তু কিছুটা বেশি কোয়েরি লিখতে হয়। যাইহোক, সেগুলো অধিকাংশই Elasticsearch কোয়ারী, তাই সম্ভবত আপনি সেগুলোতে কমফরটেবল।
কেগ রিফিল করা হয়েছে
এখন অফিসে ঘোষণা পাঠাতে হবে যে কেগ রিফিল করা হয়েছে। যেহেতু আমরা বিভিন্ন সাইজের কেগ পাই, শুধু একটি থ্রেশহোল্ডের উপরে দেখার বদলে, আমি ওজন হঠাৎ বৃদ্ধি খুঁজতে চেয়েছিলাম।
ElastAlert
ElastAlert-এ বিল্ট-ইন "spike" আছে কেগের ওজন উপরের ক্রম নির্ধারণের জন্য:
name: Refill Detector
type: spike
index: filebeat-*
field_value: weight
spike_height: 2
spike_type: 'up'
timeframe:
minutes: 10
threshold_ref: 100
threshold_cur: 100
realert:
hours: 6
এই রুল weight ফিল্ডের মান দেখে ১০-মিনিট উইন্ডোতে বাকেট করে। কোনো উইন্ডোর ওজনের গড় যদি আগের ১০-মিনিট উইন্ডোর চেয়ে ২x (spike_height) বেশি হয়, তবে অ্যালার্ট ফায়ার করব। এছাড়া, একটি ১০-মিনিট উইন্ডো "valid" হতে হলে সেটিতে কমপক্ষে ১০০ স্যাম্পল থাকতে হবে (threshold_ref এবং threshold_cur সেটিংস) এবং অ্যালার্ট প্রতি ৬ ঘণ্টায় একবার से বেশি ফায়ার করবে না।
Sentinl
Sentinl-এ কিছুটা জটিল, কিন্তু আমরা serial difference aggregation ব্যবহার করলাম যাতে কোনো বাকেটে আগের বাকেটের চেয়ে বড় বৃদ্ধি আছে কিনা দেখতে পাই:
{
"input": {
"search": {
"request": {
"index": [ "filebeat-*" ],
"body": {
"query": {
"bool": {
"filter": [
{ "range": { "@timestamp": { "gt": "now-5m/m" } } }
]
}
},
"aggs": {
"30s_buckets": {
"date_histogram": { "field": "@timestamp", "interval": "30s" },
"aggs": {
"weight_avg": { "avg": { "field": "weight" } },
"weight_diff": { "serial_diff": { "buckets_path": "weight_avg", "lag": 3 } }
}
},
"max_weight_diff": { "max_bucket": { "buckets_path": "30s_buckets>weight_diff" } }
}
}
}
}
},
"condition": {
"script": { "script": "payload.hits.total > 20" },
"compare": { "payload.aggregations.max_weight_diff.value": { "gte": 40 } }
}
}
এই "watcher" গত ৫ মিনিট স্ক্যান করে, ৩০-সেকেন্ড বাকেটে ভাগ করে, তারপর দেখে ৩ বাকেট জুড়ে কমপক্ষে ৪০ বৃদ্ধি আছে কিনা। একবার আবার, ElastAlert-এর চেয়ে জটিল, কিন্তু খুব ভালো কাজ করে।
তৃতীয় অ্যালার্ট (ব্রোকেন ডেটা ফিড) এখানে দেখানো হয়নি, কিন্তু দুটি কেসেই এটি খুব সহজ। ElastAlert-এর flatline এটাকে সুন্দরভাবে হ্যান্ডেল করে এবং Sentinl-এ একটি উইন্ডোতে সব ওজন পড়া लेकर হিট কাউন্ট করা সহজ। কেউ কোড দেখতে চাইলে জানাতে পারেন।
অ্যালার্ট ডেটা ব্যবহার করা
দুটি অ্যালার্টিং সিস্টেমের বোনাস হলো সেগুলোকে কোয়েরি করা যায়, কারণ অ্যালার্টের লগ Elasticsearch-এ স্টোর থাকে, যা অ্যালার্টের ভিত্তিতে ভিজুয়ালাইজেশন তৈরি করতে দেয়।
রিফিলস
আমি রিফিল অ্যালার্ট ব্যবহার করি Kibana ড্যাশবোর্ডে শেষ রিফিলের সময় দেখতে। ওজন ডেটা দেখে ভিজুয়ালাইজেশন বানানোর বদলে, আমি শুধু শেষ রিফিল অ্যালার্ট দেখি ভিজুয়ালাইজেশনের জন্য। Sentinl উদাহরণস্বরূপ সব অ্যালার্ট "watcher_alerts-*" ইনডেক্সে (তারিখভিত্তিক) স্টোর করে।
শেষ রিফিলে ভিজুয়ালাইজেশন তৈরি করতে, "watcher" ফিল্ড দিয়ে ইভেন্ট ফিল্টার করুন যাতে শুধু রিফিল ইভেন্ট मिलে, তারপর ম্যাক্স ডেটা সিলেক্ট করুন।
দৈনিক রিপোর্টিং
একটি রেগুলার অ্যালার্ট ব্যবহার করে রোল-আপের মত আচরণ তৈরি করা যায় যা পরে রিপোর্ট করা যায়।
উদাহরণ: যদি আমি দৈনিক খাওয়ার পরিমাণ দেখতে চাই, তবে দিনে দিনে ওজন কমতে দেখি, বড় স্পাইক ফিল্টার আউট করি (রিফিল বা অন্যান্য ইভেন্টের জন্য), এবং তারপর ওজন আউন্সে কনভার্ট করি।
এটি একক Kibana ভিজুয়ালাইজেশনে কিছুটা ট্রিকি। (যদিও Vega auss আশাজনক।)
তাই পরিবর্তে, আমি একটি দৈনিক অ্যালার্ট তৈরি করলাম যা প্রতিরাত মিডনাইটের আগে চলে এবং সেই দিনের খাওয়ার যোগফল তৈরি করে। তারপর "watcher_alerts" ইনডেক্স থেকে সেই দৈনিক যোগফল পড়ে একটি সহজ ভিজুয়ালাইজেশন বানালাম।
ফলাফল
ইনস্টলেশন শেষে, Slack এখন বলে দেয় কখন আরও কোল্ড ব্রু কেগ অর্ডার দিতে হবে। এবং এটি শুধু IT বা অ্যাডমিনদের কাছে নয়, পুরো অফিস জানে নতুন কেগ এলো।
এখন কোল্ড ব্রুর জন্য কোল্ড সুয়েট নেই: স্টাফের খুশি এবং প্রোডাক্টিভিটি সর্বোচ্চ।
Elasticsearch + Sentinl/ElastAlert অ্যালার্টিং জয়!