इलास्टिक्स खोज अलर्ट का उपयोग करके हमें यह बताने के लिए कि हम कब "लगभग खाली" हैं
ऑब्जेक्टरॉकेट में, हम अपने कार्यालय को नल पर कोल्ड ब्रू कॉफी से भर देते हैं। यहाँ अगस्त में ऑस्टिन, TX में बहुत गर्मी है। हमें अपने कैफीन कोल्ड की जरूरत है।
चूंकि हम एक समय में केवल एक ही केग रखते हैं, बिना रन आउट किए हमारे ऑर्डर शेड्यूल करना मुश्किल हो सकता है, इसलिए जब ऑब्जेक्टरॉकेट कार्यालय में किसी ने उल्लेख किया कि वे "काश हमारे पास हमारे ठंडे शराब के उपयोग पर बेहतर डेटा होता" तो मैं इसके ऊपर था। इलास्टिक स्टैक क्या कर सकता है, यह दिखाने के लिए मैं हमेशा कुछ नए तरीके की तलाश में रहता हूं, इसलिए मैंने एक अर्ध-स्वायत्त निगरानी और चेतावनी प्रणाली बनाने के लिए तैयार किया ताकि हम फिर कभी ठंडे काढ़ा से बाहर न निकलें।
केग के साथ कुछ महत्वपूर्ण होने पर स्लैक को अलर्ट करने के लिए हमने रास्पबेरी पाई, इलास्टिक्स खोज, किबाना और सेंटिनल / इलास्ट अलर्ट का संयोजन किया है। Sentinl और ElastAlert शो के सितारे थे, इसलिए हम बाद में उनके बारे में जानेंगे।
इस दो-भाग श्रृंखला के पहले भाग में, हम यह पता लगाएंगे कि कैसे मैंने अपने कीगरेटर समाधान से प्राप्त डेटा के साथ एक अलर्ट सिस्टम बनाया। मेरी आशा है कि आप Elasticsearch के लिए ओपन सोर्स अलर्टिंग विकल्पों के बारे में कुछ विचारों और कुछ ज्ञान के साथ दूर चले जाएंगे। मैं अगले पोस्ट के लिए सिस्टम को भौतिक रूप से कैसे बनाया, इस पर विवरण सहेजूंगा।
केग से डेटा (सिर्फ कोल्ड ब्रू नहीं)
जैसा कि मैंने नोट किया, हम अगले ब्लॉग में कीगरेटर बिल्ड-आउट पर चर्चा करेंगे, और हमने फ्लो रेट मॉनिटरिंग सिस्टम बनाने के बजाय स्केल-केग-वेट सॉल्यूशन का उपयोग क्यों करना चुना।
इस ब्लॉग के लिए आपको बस इतना जानना है कि मैंने एक रास्पबेरी पाई-पावर्ड स्केल सेट किया है जो नीचे दिए गए प्रारूप में दस्तावेजों की एक नियमित स्ट्रीम को 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"
}
}
फाइलबीट डेटा को पकड़ लेता है और इसमें दो मुख्य क्षेत्र शामिल होते हैं जिनमें हम रुचि रखते हैं:
- हर वज़न पढ़ने का "@timestamp"
- उस टाइमस्टैम्प पर वास्तविक "वजन" पढ़ना
चेतावनी के विकल्प
सबसे पहले चीज़ें:जब कुछ गड़बड़ हो तो कार्रवाई करने के लिए, मुझे प्रमुख व्यक्तियों को सूचनाएं भेजने का एक तरीका चाहिए था। यहीं से अलर्ट करने वाला पैकेज काम आता है।
सौभाग्य से, ElasticSearch क्लस्टर में अलर्ट जोड़ने के लिए कई Apache 2.0 लाइसेंस प्राप्त विकल्प हैं:ElastAlert और Sentinl।
इलास्ट अलर्ट
ElastAlert येल्प द्वारा बनाई गई Elasticsearch के लिए एक लचीला चेतावनी ढांचा है जो Elasticsearch से अलग चलता है और मुख्य रूप से बुनियादी कॉन्फ़िगरेशन फ़ाइलों के माध्यम से कॉन्फ़िगर किया गया है। उपयोगकर्ता सभी अलर्ट में वैश्विक पैरामीटर के साथ एक मुख्य कॉन्फ़िगरेशन फ़ाइल बना सकते हैं, फिर नियमों और परिणामी अलर्ट को कॉन्फ़िगर करने के लिए ElastAlert- विशिष्ट YAML वाले प्रत्येक नियम के लिए नियम फ़ाइलें बना सकते हैं। प्रत्येक "नियम" में शामिल हैं:
- नियमों की एक मानक सूची (जैसे "फ्लैटलाइन", "स्पाइक", और "मीट्रिक एकत्रीकरण") के आधार पर नियम कॉन्फ़िगरेशन
- इलास्टिक्स खोज फ़िल्टर प्रत्येक नियम द्वारा उपयोग की जाने वाली क्वेरी हिट को सीमित करने के लिए
- नियम भाग सकारात्मक होने पर सक्रिय होने की चेतावनी (जैसे ईमेल, जीरा, स्लैक, आदि)
प्रहरी
Sentinl ElastAlert से थोड़ा नया है। ऑब्जेक्टरॉकेट सेवा पर ग्राहकों के लिए नए अलर्टिंग विकल्पों की तलाश करते हुए - सायरन सॉल्यूशंस द्वारा बनाए गए सेंटिनल में ऑब्जेक्टरॉकेट ठोकर खाई। सेंटिनल एक किबाना प्लगइन है जो इलास्टिक्स खोज के लिए अलर्ट करने के अलावा रिपोर्टिंग प्रदान करता है। यह प्रत्येक कार्य को एक "द्रष्टा" कहता है (इसी नाम के पुराने प्लगइन के साथ भ्रमित नहीं होना चाहिए) जिसमें शामिल हैं:
- एक शेड्यूल (कितनी बार और कब जांचना है)
- एक इनपुट क्वेरी (डेटा के लिए एक इलास्टिक्स खोज क्वेरी जिसे आप जांचना चाहते हैं)
- एक शर्त (तर्क जो निर्धारित करता है कि डेटा पर अलर्ट करना है या नहीं)
- एक रूपांतरण (चेतावनी देने से पहले डेटा को संशोधित करने के लिए कोड)
- कार्रवाइयां (जब आप स्लैक, ईमेल या वेबहुक की तरह अलर्ट करते हैं तो क्या करें)
कौन सा अलर्टिंग विकल्प आपके लिए सही है?
दोनों वास्तव में बहुत अच्छे हैं, इसलिए यह केवल इस बात पर निर्भर करता है कि आप किस प्रकार के अलर्ट खोज रहे हैं। मेरे निष्कर्ष ये हैं:
इलास्ट अलर्ट | प्रहरी | |
पेशेवरों |
|
|
विपक्ष |
|
|
अलर्ट बनाना
अब मुझे यह परिभाषित करने की आवश्यकता है कि हमें किस प्रकार के अलर्ट बनाने की आवश्यकता है। मैं अंततः यह जानना चाहता हूं कि हमें कब और अधिक कोल्ड-शराब का ऑर्डर देना चाहिए। मुझे अलर्ट बनाने की ज़रूरत थी जो हमें बताए:
केग खाली / लगभग खाली
बहुत आसान:रिपोर्ट करें कि वजन एक निश्चित सीमा से नीचे गिर गया है या नहीं।
केग को बदल दिया गया है
आह, ताजी कॉफी है:वजन में तेज वृद्धि होने पर पता लगाता है।
निगरानी टूट गई है
कोई डेटा नहीं, कोई अलर्ट नहीं:हमें यह जानना होगा कि स्केल ने डेटा भेजना कब बंद कर दिया है
केग खाली / लगभग खाली
इस परिदृश्य में, यदि वजन "खाली" के रूप में मानी जाने वाली निर्दिष्ट सीमा से कम है, तो मैं एक अलर्ट सेट करता हूं, और हमें चेतावनी देता हूं कि क्या वजन इंगित करता है कि केग का लगभग 20% शेष है।
इलास्ट अलर्ट
ElastAlert मीट्रिक एकत्रीकरण नियम प्रकार के साथ इसे बहुत आसान बनाता है:एक मीट्रिक से एकत्रीकरण बनाएं और फिर निर्धारित करें कि यह एक विशिष्ट सीमा से ऊपर है या नीचे।
# (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) को 41 से कम (एक खाली केग) के अधिकतम वजन के लिए देखने के लिए सेट किया है और केवल हर 24 घंटे में एक बार अलर्ट भेजना चाहता हूं। फिर, मैं स्लैक के अलर्ट, अलर्ट में भेजे जाने वाले डेटा के प्रकार और यहां तक कि उपयोग किए गए रंग और इमोजी के बारे में विशिष्ट जानकारी को कॉन्फ़िगर कर सकता हूं।
चेतावनी अलर्ट पर यह थोड़ा पेचीदा हो जाता है। मैं केवल यह जानना चाहता हूं कि यह चेतावनी सीमा के भीतर कब है:41 से ऊपर (खाली) लेकिन 65 से नीचे (चेतावनी शुरू करने के लिए 25% अंक कि हम लगभग ठंडे शराब से बाहर हैं)। चूंकि ElastAlert केवल एक ही थ्रेशोल्ड देता है, मैं इसे ठीक करने के लिए उनके फ़िल्टर का उपयोग करता हूं।
metric_agg_key: weight
metric_agg_type: avg
min_threshold: 65
filter:
- range:
weight:
gte: 41
मैं 41 से अधिक या उसके बराबर वज़न का मूल्यांकन करने के लिए फ़िल्टर करता हूँ क्योंकि अगर सभी वज़न 41 से कम थे, तो मैं नहीं चाहता कि यह अलर्ट ट्रिगर हो (क्योंकि "खाली" अलर्ट होगा)। हालांकि, अगर 41 या उससे अधिक के बराबर कुछ वज़न हैं तो "खाली" अलर्ट ट्रिगर नहीं होगा, और मैं यह निर्धारित कर सकता हूं कि औसत हमारी 65 से कम आवश्यकता को पूरा करता है या नहीं।
प्रहरी
सेंटिनल वॉचर को कॉन्फ़िगर करने के लिए उपयोग में आसान GUI प्रदान करता है।
पहली स्क्रीन पर, बस अपने देखने वाले को नाम दें और शेड्यूल सेट करें।
इनपुट आपके इच्छित डेटा को हथियाने के लिए एक इलास्टिक्स खोज क्वेरी है:कोई भी दस्तावेज़ जिसमें वज़न शामिल है और वज़न फ़ील्ड पर औसत एकत्रीकरण बनाना है।
कंडीशन स्क्रीन में, यह निर्धारित करें कि अलर्ट किस कारण से ट्रिगर होता है:कम से कम कुछ हिट लौटानी चाहिए और औसत वजन 41 से कम होना चाहिए।
यहां एक कंसोल अलर्ट है (जो एक विशेष इंडेक्स में एक दस्तावेज़ को भी स्टोर करता है) जो एक संदेश को स्थिति के सही होने पर सक्रिय करता है।
सेंटिनल एक यूआई के साथ आता है, लेकिन आपको (थोड़ा) और प्रश्न लिखने की जरूरत है। हालांकि, वे ज्यादातर केवल इलास्टिक्स खोज क्वेरी हैं, इसलिए संभावना है कि आप शायद उनके साथ सहज हों।
केग को फिर से भर दिया गया है
अब मुझे कार्यालय को एक सामान्य घोषणा भेजने का एक तरीका चाहिए कि केग को फिर से भर दिया गया है। चूँकि हमें कभी-कभी एक निश्चित सीमा से ऊपर के स्तर की तलाश करने के बजाय अलग-अलग आकार के केग मिलते हैं, इसलिए मैं वजन में तेज वृद्धि देखना चाहता था।
इलास्ट अलर्ट
ElastAlert में केग के वजन में वृद्धि को निर्धारित करने के लिए "स्पाइक" नामक एक अंतर्निर्मित शामिल है:
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
यह नियम भार क्षेत्र में मानों को देखता है और उन्हें 10-मिनट की विंडो में बकेट करता है। यदि किसी विंडो के लिए भार का माध्य पिछली 10-मिनट की विंडो की तुलना में 2x (स्पाइक_हाइट) से अधिक है, तो मैं एक अलर्ट सक्रिय करना चाहता/चाहती हूं। साथ ही, ध्यान दें कि 10 मिनट की विंडो के "वैध" होने के लिए इसमें कम से कम 100 नमूने होने चाहिए (थ्रेशोल्ड_रेफ और थ्रेशोल्ड_कुर सेटिंग्स) और यह कि अलर्ट हर 6 घंटे से अधिक बार सक्रिय नहीं हो सकता।
प्रहरी
प्रहरी पक्ष में, यह थोड़ा अधिक जटिल है, लेकिन हमने यह निर्धारित करने के लिए सीरियल अंतर एकत्रीकरण का उपयोग किया है कि क्या हमें कोई ऐसी बकेट दिखाई देती है जिसमें पिछली बकेट की तुलना में भारी वृद्धि शामिल है:
{
"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
}
}
}
}
यह "वॉचर" पिछले 5 मिनट में स्कैन करता है, 30 के बकेट में अलग होता है, फिर यह देखने के लिए देखता है कि क्या 3 बकेट में अंतर कम से कम 40 की वृद्धि है। एक बार फिर, यह ElastAlert समकक्ष की तुलना में थोड़ा अधिक जटिल है, लेकिन यह काम करता है बहुत अच्छा।
मैंने यहां तीसरा अलर्ट नहीं दिखाया है, जो टूटे हुए डेटा फ़ीड की तलाश करता है, लेकिन दोनों ही मामलों में यह एक बहुत ही सरल अलर्ट है। ElastAlert की फ्लैटलाइन इसे अच्छी तरह से संभालती है और Sentinl एक विंडो में सभी वेट रीडिंग को हथियाने और हिट्स की गिनती करने जितना आसान है। अगर कोई कोड देखना चाहता है, तो हमें बताएं।
अलर्ट डेटा का उपयोग करना
दोनों चेतावनी प्रणालियों का एक बोनस यह है कि उनमें वास्तविक अलर्ट को क्वेरी करने की क्षमता होती है, क्योंकि अलर्ट का लॉग इलास्टिक्स खोज में संग्रहीत होता है, जिससे आप अलर्ट के आधार पर विज़ुअलाइज़ेशन बना सकते हैं।
फिर से भरना
जब हम अपने किबाना डैशबोर्ड पर रिफिल देखते हैं, तो प्लॉट करने के लिए मैं रिफिल अलर्ट का उपयोग करता हूं। पिछले रीफिल समय का विज़ुअलाइज़ेशन बनाने के लिए वज़न डेटा को देखने के बजाय, मैं अपने विज़ुअलाइज़ेशन के लिए केवल अंतिम रीफिल अलर्ट देख सकता हूं। उदाहरण के लिए, सेंटिनल दिनांक के आधार पर "वॉचर_अलर्ट्स-*" नामक स्थानीय इंडेक्स में सभी अलर्ट संग्रहीत करता है।
अंतिम रिफिल पर एक विज़ुअलाइज़ेशन बनाने के लिए, "वॉचर" फ़ील्ड द्वारा ईवेंट को फ़िल्टर करें, ताकि आपको केवल रीफ़िल ईवेंट प्राप्त हों, फिर अधिकतम तिथि चुनें।
दैनिक रिपोर्टिंग
एक और बढ़िया विकल्प यह है कि आप रोल-अप के समान व्यवहार बनाने के लिए नियमित अलर्ट का उपयोग कर सकते हैं जिसे आप बाद में रिपोर्ट कर सकते हैं।
उदाहरण के लिए:यदि मैं दैनिक खपत की मात्रा देखना चाहता हूं, तो मैं दिन-प्रतिदिन वजन में कमी देखता हूं, बड़े स्पाइक्स को फ़िल्टर करता हूं (रिफिल या अन्य घटनाओं के कारण), और फिर वजन को औंस में परिवर्तित करता हूं।
एकल किबाना विज़ुअलाइज़ेशन के साथ यह थोड़ा मुश्किल हो सकता है। (हालांकि, वेगा आशाजनक लग रहा है।)
इसलिए इसके बजाय, मैंने एक दैनिक अलर्ट बनाया जो हर रात आधी रात से पहले चलता है और उस दिन के लिए खपत का योग बनाता है। फिर मैं एक साधारण विज़ुअलाइज़ेशन बनाता हूं जो "वॉचर_अलर्ट्स" इंडेक्स से उन दैनिक योगों को पढ़ता है।
अंतिम परिणाम
एक बार जब मैंने इंस्टॉलेशन पूरा कर लिया, तो स्लैक अब हमें बताता है कि कब अधिक कोल्ड ब्रू केग्स ऑर्डर करना है। और यह सिर्फ आईटी या व्यवस्थापकों, या कुछ अन्य चुनिंदा व्यक्तियों को नहीं भेजा जाता है। पूरा कार्यालय अब जानता है कि एक नया केग कब आता है।
यहां कोल्ड ब्रू के लिए कोई और ठंडा पसीना नहीं आता:कर्मचारियों की खुशी और उत्पादकता सर्वकालिक उच्च स्तर पर है।
Elasticsearch + Sentinl/ElastAlert FTW को अलर्ट कर रहा है!