Elasticsearch अलर्ट का उपयोग करके यह बताने के लिए कि हम "लगभग खाली" कब हैं
ObjectRocket में, हम अपने ऑफिस को टैप पर कोल्ड ब्रू कॉफी से ईंधन देते हैं। अगस्त में ऑस्टिन, TX में गर्मी होती है। हमें अपना कैफीन ठंडा चाहिए।
चूंकि हम एक समय में केवल एक केग रखते हैं, बिना खत्म हुए अपने ऑर्डर शेड्यूल करना मुश्किल हो सकता है, इसलिए जब ObjectRocket ऑफिस में किसी ने उल्लेख किया कि वे "चाहते हैं कि हमारे कोल्ड ब्रू उपयोग पर बेहतर डेटा हो" तो मैं इस पर कूद पड़ा। मैं हमेशा Elastic Stack क्या कर सकता है यह दिखाने के लिए कुछ नया तरीका ढूंढ रहा हूं, इसलिए मैंने एक सेमी-ऑटोनोमस मॉनिटरिंग और अलर्टिंग सिस्टम बनाने के लिए तैयार किया ताकि हम फिर कभी कोल्ड ब्रू से बाहर न निकलें।
हमारे पास जो परिणाम आया वह रास्पबेरी पाई, Elasticsearch, Kibana, और Sentinl/ElastAlert का संयोजन है जो केग के लिए कुछ महत्वपूर्ण होने पर Slack पर अलर्ट फायर करता है। 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" } }
Filebeat डेटा को हथियाता है और दो मुख्य फील्ड शामिल करता है जिनमें हम रुचि रखते हैं:
- प्रत्येक वजन रीडिंग का "@timestamp"
- उस टाइमस्टैम्प पर वास्तविक "वजन" रीडिंग
अलर्टिंग विकल्प
सबसे पहले: केग के साथ कुछ होने पर कार्रवाई करने के लिए, मुझे प्रमुख व्यक्तियों को सूचनाएं भेजने का एक तरीका चाहिए था। यहीं पर एक अलर्टिंग पैकेज चलन में आता है।
सौभाग्य से, Elasticsearch क्लस्टर में अलर्टिंग जोड़ने के लिए Apache 2.0 लाइसेंस प्राप्त कई विकल्प हैं: ElastAlert और Sentinl।
ElastAlert
ElastAlert Yelp द्वारा बनाया गया Elasticsearch के लिए एक फ्लेक्सिबल अलर्टिंग फ्रेमवर्क है जो Elasticsearch से अलग चलता है और मुख्य रूप से बेसिक कॉन्फिग फाइलों के माध्यम से कॉन्फ़िगर किया जाता है। यूजर ग्लोबल पैरामीटर्स के साथ एक मेन कॉन्फिग फाइल बना सकते हैं, फिर प्रत्येक नियम के लिए नियम फाइलें बना सकते हैं जिसमें ElastAlert-विशिष्ट YAML होता है जो नियमों और परिणामी अलर्ट को कॉन्फ़िगर करता है। प्रत्येक "नियम" में शामिल हैं:
- "फ्लैटलाइन", "स्पाइक", और "मेट्रिक एग्रीगेशन" जैसे नियमों की मानक सूची के आधार पर नियम कॉन्फिगरेशन
- प्रत्येक नियम द्वारा उपयोग किए जाने वाले क्वेरी हिट को सीमित करने के लिए Elasticsearch फिल्टर्स
- नियम भाग सकारात्मक होने पर फायर करने के लिए एक अलर्ट (जैसे ईमेल, Jira, Slack, आदि)
Sentinl
Sentinl ElastAlert की तुलना में थोड़ा नया है। ObjectRocket ने ObjectRocket सर्विस पर ग्राहकों के लिए नए अलर्टिंग विकल्पों की तलाश करते हुए Siren Solutions द्वारा बनाए गए Sentinl की खोज की। Sentinl एक Kibana प्लगइन है जो Elasticsearch के लिए रिपोर्टिंग के अलावा अलर्टिंग प्रदान करता है। यह प्रत्येक जॉब को "वॉचर" कहता है (पुराने प्लगइन के समान नाम से भ्रमित न हों) जिसमें शामिल हैं:
- एक शेड्यूल (कितनी बार और कब जांचना है)
- एक इनपुट क्वेरी (आप जिस डेटा की जांच करना चाहते हैं उसके लिए Elasticsearch क्वेरी)
- एक कंडीशन (लॉजिक जो निर्धारित करता है कि डेटा पर अलर्ट करना है या नहीं)
- एक ट्रांसफॉर्म (अलर्ट करने से पहले डेटा को संशोधित करने के लिए कोड)
- एक्शन (अलर्ट करते समय क्या करना है जैसे Slack, ईमेल, या वेबहुक)
आपके लिए कौन सा अलर्टिंग विकल्प सही है?
दोनों वास्तव में महान हैं, इसलिए यह सिर्फ इस बात पर निर्भर करता है कि आप किस प्रकार के अलर्ट ढूंढ रहे हैं। यहां मेरे निष्कर्ष हैं:
| ElastAlert | Sentinl | |
| फायदे |
|
|
| नुकसान |
|
|
अलर्ट बनाना
अब मुझे यह परिभाषित करने की आवश्यकता है कि हमें किस प्रकार के अलर्ट बनाने की आवश्यकता है। मैं अंततः जानना चाहता था कि हमें कब अधिक कोल्ड-ब्रू ऑर्डर करना चाहिए। मुझे ऐसे अलर्ट बनाने की आवश्यकता थी जो हमें बताएं:
केग खाली / लगभग खाली
काफी सरल: रिपोर्ट करें यदि वजन एक निश्चित थ्रेशोल्ड से नीचे गिर गया है जिसे "खाली" माना जाता है।
केग रिफिल किया गया है
अहा, ताजा कॉफी है: वजन में तेज वृद्धि का पता लगाता है।
मॉनिटरिंग टूटी हुई है
कोई डेटा नहीं, कोई अलर्ट नहीं: हमें यह जानने की आवश्यकता है कि स्केल ने डेटा भेजना कब बंद कर दिया है
केग खाली / लगभग खाली
इस परिदृश्य में, मैंने एक अलर्ट सेट किया यदि वजन "खाली" माने जाने वाले निर्दिष्ट थ्रेशोल्ड से नीचे है, और हमें चेतावनी दें यदि वजन इंगित करता है कि केग का लगभग 20% शेष है।
ElastAlert
ElastAlert मेट्रिक एग्रीगेशन नियम प्रकार के साथ इसे काफी आसान बनाता है: एक मेट्रिक से एक एग्रीगेशन बनाएं और फिर निर्धारित करें कि यह एक विशिष्ट थ्रेशोल्ड से ऊपर या नीचे है।
# (आवश्यक) # नियम नाम, अद्वितीय होना चाहिए name: Empty Alarm # (आवश्यक) # अलर्ट का प्रकार. type: metric_aggregation # (आवश्यक) # खोज करने के लिए इंडेक्स, वाइल्डकार्ड समर्थित index: filebeat-* # कितना डेटा उपयोग करना चाहिए buffer_time: hours: 1 # हम कितनी बार यह अलर्ट भेज सकते हैं? realert: hours: 24 # उपयोग करने के लिए elasticsearch डॉक्यूमेंट का प्रकार doc_type: doc metric_agg_key: weight metric_agg_type: max min_threshold: 41 # (आवश्यक) # अलर्ट का उपयोग तब किया जाता है जब कोई मैच मिलता है 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 घंटे में एक बार अलर्ट भेजना चाहता हूं। फिर, मैं Slack के अलर्ट, अलर्ट में भेजने के लिए डेटा का प्रकार, और यहां तक कि उपयोग किए जाने वाले रंग और इमोजी के बारे में विवरण कॉन्फ़िगर कर सकता हूं।
चेतावनी अलर्ट पर यह थोड़ा पेचीदा हो जाता है। मैं केवल तब जानना चाहता हूं जब यह चेतावनी थ्रेशोल्ड के भीतर हो: 41 (खाली) से ऊपर लेकिन 65 (25% निशान चेतावनी देना शुरू करने के लिए कि हम कोल्ड ब्रू से लगभग बाहर हैं) से नीचे। चूंकि ElastAlert केवल एक सिंगल थ्रेशोल्ड देता है, मैं इसे ठीक करने के लिए उनके फिल्टर्स का उपयोग करता हूं।
metric_agg_key: weight metric_agg_type: avg min_threshold: 65 filter: - range: weight: gte: 41
मैं 41 से अधिक या बराबर वजन का मूल्यांकन करने के लिए फिल्टर करता हूं क्योंकि यदि सभी वजन 41 से नीचे थे, तो मैं नहीं चाहता कि यह अलर्ट ट्रिगर हो (क्योंकि "खाली" अलर्ट होगा)। हालांकि, यदि कुछ वजन 41 या अधिक के बराबर हैं तो "खाली" अलर्ट ट्रिगर नहीं होगा, और मैं यह निर्धारित कर सकता हूं कि औसत हमारे 65 से कम आवश्यकता को पूरा करता है या नहीं।
Sentinl
Sentinl वॉचर कॉन्फ़िगर करने के लिए उपयोग में आसान GUI प्रदान करता है।
पहली स्क्रीन पर, बस अपने वॉचर का नाम दें और शेड्यूल सेट करें।

इनपुट एक Elasticsearch क्वेरी है जो आप जो डेटा चाहते हैं उसे हथियाने के लिए: कोई भी डॉक्स जिनमें वजन शामिल है और वजन फील्ड पर औसत एग्रीगेशन बना रहा है।

कंडीशन स्क्रीन में, निर्धारित करें कि क्या अलर्ट ट्रिगर करता है: कम से कम कुछ हिट वापस आने चाहिए और औसत वजन 41 से नीचे होना चाहिए।

यहां एक कंसोल अलर्ट है (जो एक विशेष इंडेक्स में एक डॉक्यूमेंट भी स्टोर करता है) जो कंडीशन सत्य होने पर एक संदेश फायर करता है।

Sentinl एक UI के साथ आता है, लेकिन आपको (थोड़ा) अधिक क्वेरी लिखने की आवश्यकता होती है। हालांकि, वे ज्यादातर सिर्फ Elasticsearch क्वेरी हैं, इसलिए संभावना है कि आप शायद उनके साथ सहज हैं।
केग रिफिल किया गया है
अब मुझे ऑफिस में सामान्य घोषणा भेजने का एक तरीका चाहिए कि केग रिफिल किया गया है। चूंकि हमें कभी-कभी अलग-अलग आकार के केग प्राप्त होते हैं, केवल एक निश्चित थ्रेशोल्ड से ऊपर लेवल देखने के बजाय, मैं वजन में तेज वृद्धि देखना चाहता था।
ElastAlert
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 (spike_height) से अधिक है, तो मैं एक अलर्ट फायर करना चाहता हूं। साथ ही, ध्यान दें कि 10-मिनट की विंडो के लिए "मान्य" होने के लिए इसमें कम से कम 100 सैंपल होने चाहिए (threshold_ref और threshold_cur सेटिंग्स) और अलर्ट हर 6 घंटे से अधिक बार फायर नहीं कर सकता।
Sentinl
Sentinl की तरफ, यह थोड़ा अधिक जटिल है, लेकिन हमने सीरियल डिफरेंस एग्रीगेशन का उपयोग यह निर्धारित करने के लिए किया कि क्या हम पिछले बकेट्स पर कोई बड़ी वृद्धि वाले बकेट्स देखते हैं:
{ "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 मिनट को स्कैन करता है, 30s बकेट में अलग करता है, फिर यह देखने के लिए देखता है कि क्या 3 बकेट्स में अंतर पिछले बकेट्स पर कम से कम 40 की वृद्धि है। एक बार फिर, यह ElastAlert समकक्ष की तुलना में थोड़ा अधिक जटिल है, लेकिन यह काफी अच्छा काम करता है।
मैंने यहां तीसरे अलर्ट को नहीं दिखाया है, जो टूटे हुए डेटा फीड की तलाश करता है, लेकिन दोनों मामलों में यह एक बहुत ही सरल अलर्ट है। ElastAlert का फ्लैटलाइन इसे अच्छी तरह से संभालता है और Sentinl उतना ही सरल है जितना कि एक विंडो में सभी वजन रीडिंग हथियाना और हिट गिनना। यदि कोई कोड देखना चाहता है, तो हमें बताएं।
अलर्ट डेटा का उपयोग करना
दोनों अलर्टिंग सिस्टम का एक बोनस यह है कि वे वास्तविक अलर्ट को क्वेरी करने की क्षमता रखते हैं, चूंकि अलर्ट का लॉग Elasticsearch में स्टोर होता है, जिससे आप अलर्ट के आधार पर विज़ुअलाइज़ेशन बना सकते हैं।
रिफिल्स
मैं अपने Kibana डैशबोर्ड पर रिफिल का समय प्लॉट करने के लिए रिफिल अलर्ट का उपयोग करता हूं। वजन डेटा को देखकर अंतिम रिफिल समय का विज़ुअलाइज़ेशन बनाने के बजाय, मैं अपने विज़ुअलाइज़ेशन के लिए बस अंतिम रिफिल अलर्ट देख सकता हूं। Sentinl, उदाहरण के लिए, तारीख के आधार पर "watcher_alerts-*" नामक स्थानीय इंडेक्स में सभी अलर्ट स्टोर करता है।

अंतिम रिफिल पर विज़ुअलाइज़ेशन बनाने के लिए, इवेंट को "वॉचर" फील्ड द्वारा फ़िल्टर करें, ताकि आपको केवल रिफिल इवेंट मिलें, फिर मैक्स डेट चुनें।

दैनिक रिपोर्टिंग
एक और बढ़िया विकल्प यह है कि आप नियमित अलर्ट का उपयोग करके रोल-अप के समान व्यवहार बना सकते हैं जिस पर आप बाद में रिपोर्ट कर सकते हैं।
उदाहरण के लिए: यदि मैं दैनिक खपत की मात्रा देखना चाहता हूं, तो मैं दिन-प्रतिदिन वजन में कमी को देखता हूं, बड़े स्पाइक्स को फ़िल्टर करता हूं (रिफिल या अन्य घटनाओं के कारण), और फिर वजन को औंस में परिवर्तित करता हूं।
यह एकल Kibana विज़ुअलाइज़ेशन के साथ थोड़ा मुश्किल हो सकता है। (हालांकि, Vega आशाजनक दिखता है।)
इसलिए इसके बजाय, मैंने एक दैनिक अलर्ट बनाया जो हर रात आधी रात से पहले चलता है और उस दिन के लिए खपत का योग बनाता है। फिर मैं एक साधारण विज़ुअलाइज़ेशन बनाता हूं जो "watcher_alerts" इंडेक्स से उन दैनिक योगों को पढ़ता है।


अंतिम परिणाम
एक बार इंस्टॉलेशन पूरा होने पर, Slack अब हमें बताता है कि कब अधिक कोल्ड ब्रू केग ऑर्डर करने हैं। और यह केवल IT या एडमिन, या कुछ अन्य चुनिंदा व्यक्तियों को नहीं भेजा जाता है। पूरा ऑफिस अब जानता है कि नया केग कब आता है।

यहां कोल्ड ब्रू के लिए कोई कोल्ड स्वेट नहीं: स्टाफ की खुशी और उत्पादकता सर्वकालिक उच्च स्तर पर है।
Elasticsearch + Sentinl/ElastAlert अलर्टिंग FTW!