हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं
तिखोन उस्कोव, ज़ैबिक्स एकीकरण टीम इंजीनियर

ज़ैबिक्स एक अनुकूलन योग्य प्लेटफ़ॉर्म है जिसका उपयोग किसी भी प्रकार के डेटा पर नज़र रखने के लिए किया जाता है। ज़ैबिक्स के शुरुआती संस्करणों के बाद से, निगरानी प्रशासकों के पास विभिन्न स्क्रिप्ट चलाने की क्षमता रही है क्रियाएँ लक्ष्य नेटवर्क नोड्स पर जाँच के लिए। उसी समय, स्क्रिप्ट के लॉन्च के कारण कई कठिनाइयाँ पैदा हुईं, जिनमें स्क्रिप्ट का समर्थन करने की आवश्यकता, संचार नोड्स और प्रॉक्सी तक उनकी डिलीवरी, साथ ही विभिन्न संस्करणों के लिए समर्थन शामिल था।

ज़ैबिक्स के लिए जावास्क्रिप्ट

अप्रैल 2019 में, ज़ैबिक्स 4.2 को जावास्क्रिप्ट प्रीप्रोसेसिंग के साथ पेश किया गया था। बहुत से लोग स्क्रिप्ट लिखने के विचार को छोड़ने के बारे में उत्साहित हो गए जो डेटा को कहीं ले जाते हैं, इसे पचाते हैं और इसे ज़ैबिक्स द्वारा समझे जाने वाले प्रारूप में प्रदान करते हैं, और सरल जांच करते हैं जो डेटा प्राप्त करेंगे जो ज़ैबिक्स द्वारा भंडारण और प्रसंस्करण के लिए तैयार नहीं है, और फिर ज़ैबिक्स और जावास्क्रिप्ट टूल का उपयोग करके इस डेटा स्ट्रीम को संसाधित करें। ज़ैबिक्स 3.4 में दिखाई देने वाली निम्न-स्तरीय खोज और आश्रित वस्तुओं के संयोजन में, हमें प्राप्त डेटा को सॉर्ट करने और प्रबंधित करने के लिए एक काफी लचीली अवधारणा मिली।

Zabbix 4.4 में, जावास्क्रिप्ट में पूर्व-प्रसंस्करण की तार्किक निरंतरता के रूप में, एक नई अधिसूचना विधि दिखाई दी है - Webhook, जिसका उपयोग Zabbix सूचनाओं को तृतीय-पक्ष अनुप्रयोगों के साथ आसानी से एकीकृत करने के लिए किया जा सकता है।

जावास्क्रिप्ट और डक्टटेप्स

JavaScript और Duktape को क्यों चुना गया? भाषाओं और इंजनों के लिए विभिन्न विकल्पों पर विचार किया गया:

  • लुआ - लुआ 5.1
  • लुआ - लुआजिट
  • जावास्क्रिप्ट - डुकटेप
  • जावास्क्रिप्ट - जेरीस्क्रिप्ट
  • एंबेडेड पायथन
  • एंबेडेड पर्ल

मुख्य चयन मानदंड थे व्यापकता, उत्पाद में इंजन के एकीकरण में आसानी, कम संसाधन खपत और इंजन का समग्र प्रदर्शन, और निगरानी में इस भाषा में कोड पेश करने की सुरक्षा। संकेतकों के संयोजन के आधार पर, जावास्क्रिप्ट ने डक्टटेप इंजन पर जीत हासिल की।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं

चयन मानदंड और प्रदर्शन परीक्षण

डुकटेप की विशेषताएं:

- मानक ईसीएमएस्क्रिप्ट E5/E5.1
- ड्यूकटेप के लिए ज़ैबिक्स मॉड्यूल:

  • Zabbix.log() - आपको सीधे Zabbix सर्वर लॉग में विवरण के विभिन्न स्तरों के साथ संदेश लिखने की अनुमति देता है, जो त्रुटियों को सहसंबंधित करना संभव बनाता है, उदाहरण के लिए, वेबहुक में, सर्वर स्थिति के साथ।
  • कर्लHttpRequest() - आपको नेटवर्क पर HTTP अनुरोध करने की अनुमति देता है, जिस पर वेबहुक का उपयोग आधारित है।
  • atob() और btoa() - आपको बेस64 प्रारूप में स्ट्रिंग्स को एनकोड और डीकोड करने की अनुमति देता है।

नोट. डुकटेप एसीएमई मानकों का अनुपालन करता है। ज़ैबिक्स स्क्रिप्ट के 2015 संस्करण का उपयोग करता है। बाद के परिवर्तन मामूली हैं, इसलिए उन्हें अनदेखा किया जा सकता है।.

जावास्क्रिप्ट जादू

जावास्क्रिप्ट का सारा जादू गतिशील टाइपिंग और टाइप कास्टिंग में निहित है: स्ट्रिंग, न्यूमेरिक और बूलियन।

इसका मतलब यह है कि यह पहले से घोषित करने के लिए आवश्यक नहीं है कि किस प्रकार के चर को एक मान वापस करना चाहिए।

गणितीय संक्रियाओं में, फ़ंक्शन ऑपरेटरों द्वारा लौटाए गए मान संख्याओं में परिवर्तित हो जाते हैं। ऐसे परिचालनों का अपवाद जोड़ है, क्योंकि यदि कम से कम एक पद एक स्ट्रिंग है, तो स्ट्रिंग रूपांतरण सभी पदों पर लागू होता है।

नोट. ऐसे परिवर्तनों के लिए जिम्मेदार विधियाँ आमतौर पर ऑब्जेक्ट के मूल प्रोटोटाइप में लागू की जाती हैं, का मूल्य и तार. का मूल्य संख्यात्मक रूपांतरण के दौरान और हमेशा विधि से पहले बुलाया जाता है तार. तरीका का मूल्य आदिम मूल्यों को वापस करना चाहिए, अन्यथा इसके परिणाम को नजरअंदाज कर दिया जाता है।

किसी वस्तु पर एक विधि कहलाती है का मूल्य. यदि यह नहीं मिलता है या कोई आदिम मान नहीं लौटाता है, तो विधि को कॉल किया जाता है तार. यदि विधि तार नहीं मिला, खोजा जा रहा है का मूल्य वस्तु के प्रोटोटाइप में, और मूल्य के प्रसंस्करण के पूरा होने तक सब कुछ दोहराया जाता है और अभिव्यक्ति में सभी मूल्यों को एक ही प्रकार में डाला जाता है. यदि वस्तु किसी विधि को लागू करती है तार, जो एक आदिम मान लौटाता है, तो इसका उपयोग स्ट्रिंग रूपांतरण के लिए किया जाता है। हालाँकि, इस पद्धति को लागू करने का परिणाम आवश्यक रूप से एक स्ट्रिंग नहीं है।

उदाहरण के लिए, यदि वस्तु के लिए 'obj'विधि परिभाषित है तार,

`var obj = { toString() { return "200" }}` 

विधि तार बिल्कुल एक स्ट्रिंग लौटाता है, और जब एक संख्या के साथ एक स्ट्रिंग जोड़ते हैं, तो हमें एक चिपकी हुई स्ट्रिंग मिलती है:

`obj + 1 // '2001'` 

`obj + 'a' // ‘200a'`

लेकिन अगर आप दोबारा लिखते हैं तार, ताकि विधि एक संख्या लौटाए, जब ऑब्जेक्ट जोड़ा जाता है, तो संख्यात्मक रूपांतरण के साथ एक गणितीय ऑपरेशन किया जाएगा और गणितीय जोड़ का परिणाम प्राप्त किया जाएगा।

`var obj = { toString() { return 200 }}` 

`obj + 1 // '2001'`

इस स्थिति में, यदि हम एक स्ट्रिंग के साथ जोड़ का प्रदर्शन करते हैं, तो एक स्ट्रिंग रूपांतरण किया जाता है, और हमें एक चिपका हुआ स्ट्रिंग मिलता है।

`obj + 'a' // ‘200a'`

नौसिखिए जावास्क्रिप्ट उपयोगकर्ताओं द्वारा बड़ी संख्या में गलतियों का यही कारण है।

प्रक्रिया तार आप एक फ़ंक्शन लिख सकते हैं जो ऑब्जेक्ट के वर्तमान मान को 1 से बढ़ा देगा।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं
स्क्रिप्ट का निष्पादन, बशर्ते कि चर 3 के बराबर हो, और यह 4 के बराबर भी हो।

जब किसी कास्ट (==) के साथ तुलना की जाती है, तो विधि हर बार निष्पादित होती है तार मूल्य वृद्धि फ़ंक्शन के साथ। तदनुसार, प्रत्येक बाद की तुलना के साथ, मूल्य बढ़ता है। नॉन-कास्ट तुलना (===) का उपयोग करके इससे बचा जा सकता है।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं
टाइप कास्टिंग के बिना तुलना

नोट. कास्ट कम्पेरिजन का अनावश्यक प्रयोग न करें.

जटिल स्क्रिप्ट के लिए, जैसे कि जटिल तर्क वाले वेबहुक, जिन्हें टाइप कास्टिंग के साथ तुलना की आवश्यकता होती है, उन मानों के लिए चेक को पूर्व-लिखने की अनुशंसा की जाती है जो चर लौटाते हैं और विसंगतियों और त्रुटियों को संभालते हैं।

वेबहुक मीडिया

2019 के अंत और 2020 की शुरुआत में, ज़ैबिक्स एकीकरण टीम सक्रिय रूप से वेबहुक और आउट-ऑफ़-द-बॉक्स एकीकरण विकसित कर रही है जो ज़ैबिक्स वितरण के साथ आते हैं।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं
से लिंक करें प्रलेखन

preprocessing

  • जावास्क्रिप्ट में प्रीप्रोसेसिंग के आगमन ने अधिकांश बाहरी लिपियों को छोड़ना संभव बना दिया है, और वर्तमान में ज़ैबिक्स में आप कोई भी मूल्य प्राप्त कर सकते हैं और इसे पूरी तरह से अलग मूल्य में बदल सकते हैं।
  • Zabbix में प्रीप्रोसेसिंग को जावास्क्रिप्ट कोड द्वारा कार्यान्वित किया जाता है, जिसे जब बायटेकोड में संकलित किया जाता है, तो एक फ़ंक्शन में परिवर्तित हो जाता है जो एक पैरामीटर के रूप में एकल मान लेता है मूल्य एक स्ट्रिंग के रूप में (एक स्ट्रिंग में अंक और संख्या दोनों हो सकते हैं)।
  • चूंकि आउटपुट एक फ़ंक्शन है, इसलिए स्क्रिप्ट के अंत में इसकी आवश्यकता होती है वापसी.
  • कोड में कस्टम मैक्रोज़ का उपयोग करना संभव है।
  • संसाधन न केवल ऑपरेटिंग सिस्टम स्तर पर, बल्कि प्रोग्रामेटिक रूप से भी सीमित हो सकते हैं। प्रीप्रोसेसिंग चरण में अधिकतम 10 मेगाबाइट रैम और 10 सेकंड की रन टाइम सीमा आवंटित की जाती है।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं

नोट. 10 सेकंड का टाइमआउट मान बहुत अधिक है, क्योंकि एक "भारी" प्रीप्रोसेसिंग परिदृश्य के अनुसार 1 सेकंड में सशर्त हजारों डेटा आइटम एकत्र करना Zabbix को धीमा कर सकता है। इसलिए, तथाकथित छाया डेटा तत्वों (डमी आइटम) के माध्यम से पूर्ण जावास्क्रिप्ट स्क्रिप्ट को निष्पादित करने के लिए प्रीप्रोसेसिंग का उपयोग करने की अनुशंसा नहीं की जाती है, जो केवल प्रीप्रोसेसिंग करने के लिए चलाए जाते हैं।.

आप प्रीप्रोसेसिंग परीक्षण के माध्यम से या उपयोगिता का उपयोग करके अपना कोड जांच सकते हैं zabbix_js:

`zabbix_js -s *script-file -p *input-param* [-l log-level] [-t timeout]`

`zabbix_js -s script-file -i input-file [-l log-level] [-t timeout]`

`zabbix_js -h`

`zabbix_js -V`

व्यावहारिक कार्य

कार्य 1

परिकलित आइटम को प्रीप्रोसेसिंग से बदलें।

शर्त: सेल्सियस में स्टोर करने के लिए सेंसर से फ़ारेनहाइट में तापमान प्राप्त करें।

पहले, हम एक ऐसा आइटम बनाते थे जो तापमान को डिग्री फ़ारेनहाइट में एकत्र करता है। उसके बाद, एक अन्य डेटा आइटम (गणना की गई) जो सूत्र का उपयोग करके फ़ारेनहाइट को सेल्सियस में बदल देगा।

समस्याओं:

  • डेटा तत्वों को डुप्लिकेट करना और डेटाबेस में सभी मानों को संग्रहीत करना आवश्यक है।
  • आपको "मूल" डेटा आइटम के लिए अंतराल पर सहमत होना होगा जिसकी गणना और सूत्र में उपयोग किया जाता है, और परिकलित डेटा आइटम के लिए। अन्यथा, गणना की गई वस्तु असमर्थित स्थिति में जा सकती है या पिछले मान की गणना कर सकती है, जो निगरानी परिणामों की विश्वसनीयता को प्रभावित करेगी।

एक समाधान यह सुनिश्चित करने के लिए लचीले चेक अंतरालों से हटकर निश्चित अंतरालों के पक्ष में जाना था कि गणना की गई वस्तु का मूल्यांकन डेटा प्राप्त करने वाली वस्तु के बाद किया जाता है (हमारे मामले में, तापमान डिग्री फ़ारेनहाइट में)।

लेकिन यदि, उदाहरण के लिए, हम बड़ी संख्या में उपकरणों की जांच करने के लिए टेम्पलेट का उपयोग करते हैं, और जांच हर 30 सेकंड में एक बार की जाती है, तो ज़ैबिक्स 29 सेकंड के लिए "हैक" करता है, और अंतिम सेकंड में यह जांच और गणना करना शुरू कर देता है। यह एक कतार बनाता है और प्रदर्शन को प्रभावित करता है। इसलिए, निश्चित अंतराल का उपयोग केवल तभी करने की अनुशंसा की जाती है जब यह वास्तव में आवश्यक हो।

इस समस्या में, इष्टतम समाधान एक-पंक्ति जावास्क्रिप्ट प्रीप्रोसेसिंग है जो डिग्री फ़ारेनहाइट को डिग्री सेल्सियस में परिवर्तित करता है:

`return (value - 32) * 5 / 9;`

यह तेज़ और आसान है, आपको अनावश्यक डेटा आइटम बनाने और उन पर इतिहास रखने की ज़रूरत नहीं है, और आप जांच के लिए लचीले अंतराल का भी उपयोग कर सकते हैं।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं

`return (parseInt(value) + parseInt("{$EXAMPLE.MACRO}"));`

लेकिन, यदि किसी काल्पनिक स्थिति में प्राप्त डेटा तत्व को जोड़ना आवश्यक है, उदाहरण के लिए, मैक्रो में परिभाषित किसी भी स्थिरांक के साथ, यह ध्यान में रखा जाना चाहिए कि पैरामीटर मूल्य एक तार में फैलता है। एक स्ट्रिंग एडिशन ऑपरेशन में, दो स्ट्रिंग्स को बस एक में जोड़ दिया जाता है।

हम जावास्क्रिप्ट का उपयोग करके ज़ैबिक्स में व्यावहारिक समस्याओं का समाधान करते हैं

`return (value + "{$EXAMPLE.MACRO}");`

गणितीय ऑपरेशन का परिणाम प्राप्त करने के लिए, प्राप्त मूल्यों के प्रकारों को एक संख्यात्मक प्रारूप में बदलना आवश्यक है। इसके लिए आप फंक्शन का इस्तेमाल कर सकते हैं पार्सइंट (), जो एक पूर्णांक, एक फ़ंक्शन उत्पन्न करता है पार्सफ्लोट(), जो एक दशमलव, या एक फ़ंक्शन उत्पन्न करता है संख्या, जो पूर्णांक या दशमलव लौटाता है।

कार्य 2

प्रमाणपत्र के अंत तक का समय सेकंड में प्राप्त करें।

शर्त: एक सेवा "12 फरवरी 12:33:56 2022 जीएमटी" प्रारूप में एक प्रमाणपत्र समाप्ति तिथि जारी करती है।

ईसीएमएस्क्रिप्ट5 में Date.parse () आईएसओ 8601 प्रारूप (YYYY-MM-DDTHH:mm:ss.sssZ) में एक तारीख स्वीकार करता है। इसमें MMM DD YYYY HH:mm:ss ZZ प्रारूप में एक स्ट्रिंग डालना आवश्यक है

समस्या: महीने का मान पाठ के रूप में व्यक्त किया जाता है, संख्या के रूप में नहीं। इस प्रारूप में डेटा डुकटेप द्वारा स्वीकार नहीं किया जाता है।

समाधान उदाहरण:

  • सबसे पहले, एक वेरिएबल घोषित किया जाता है जो एक मान लेता है (संपूर्ण स्क्रिप्ट उन वेरिएबल्स की घोषणा है जिन्हें अल्पविराम से अलग करके सूचीबद्ध किया गया है)।

  • पहली पंक्ति में हमें पैरामीटर में दिनांक मिलती है मूल्य और विधि का उपयोग करके इसे रिक्त स्थान से अलग करें विभाजित. इस प्रकार, हमें एक सरणी मिलती है, जहां सरणी का प्रत्येक तत्व, सूचकांक 0 से शुरू होकर, एक स्थान के पहले और बाद में एक दिनांक तत्व से मेल खाता है। विभाजन(0) - महीना, विभाजन(1) - संख्या, विभाजन(2) - समय के साथ एक स्ट्रिंग, आदि। उसके बाद, दिनांक के प्रत्येक तत्व को सरणी में अनुक्रमणिका द्वारा एक्सेस किया जा सकता है।

`var split = value.split(' '),`

  • प्रत्येक माह (कालानुक्रमिक क्रम में) सरणी में उसकी स्थिति के सूचकांक (0 से 11 तक) से मेल खाता है। किसी पाठ मान को संख्यात्मक मान में बदलने के लिए, महीने के सूचकांक में एक जोड़ा जाता है (क्योंकि महीनों को 1 से शुरू करके क्रमांकित किया जाता है)। इस मामले में, एक को जोड़ने वाला व्यंजक कोष्ठक में लिया जाता है, क्योंकि अन्यथा एक स्ट्रिंग प्राप्त होगी, कोई संख्या नहीं। अंत में हम ऐसा करते हैं टुकड़ा () - केवल दो वर्णों को छोड़ने के लिए सरणी को अंत से काटें (जो दो अंकों की संख्या वाले महीनों के लिए महत्वपूर्ण है)।

`MONTHS_LIST = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],`

`month_index = ('0' + (MONTHS_LIST.indexOf(split[0]) + 1)).slice(-2),`

  • हम उचित क्रम में स्ट्रिंग्स के सामान्य जोड़ द्वारा प्राप्त मूल्यों से आईएसओ प्रारूप में एक स्ट्रिंग बनाते हैं।

`ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],`

परिणामी प्रारूप में डेटा 1970 से भविष्य के किसी बिंदु तक सेकंड की संख्या है। ट्रिगर्स में प्राप्त प्रारूप में डेटा का उपयोग करना लगभग असंभव है, क्योंकि ज़ैबिक्स आपको केवल मैक्रोज़ के साथ काम करने की अनुमति देता है {तारीख} и {समय}, जो उपयोगकर्ता के अनुकूल प्रारूप में दिनांक और समय लौटाता है।

  • फिर हम यूनिक्स टाइमस्टैम्प प्रारूप में जावास्क्रिप्ट में वर्तमान तिथि प्राप्त कर सकते हैं और प्रमाणपत्र समाप्त होने तक मिलीसेकंड की संख्या प्राप्त करने के लिए इसे परिणामी प्रमाणपत्र समाप्ति तिथि से घटा सकते हैं।

`now = Date.now();`

  • Zabbix में सेकंड प्राप्त करने के लिए हम प्राप्त मूल्य को एक हजार से विभाजित करते हैं।

`return parseInt((Date.parse(ISOdate) - now) / 1000);`

ट्रिगर में, आप अभिव्यक्ति निर्दिष्ट कर सकते हैं 'अंतिम' इसके बाद अंकों का एक सेट होता है जो उस अवधि में सेकंड की संख्या से मेल खाता है जिसका आप जवाब देना चाहते हैं, उदाहरण के लिए, हफ्तों में। इस प्रकार, ट्रिगर सूचित करेगा कि प्रमाणपत्र एक सप्ताह में समाप्त हो रहा है।

नोट. उपयोग पर ध्यान दें पार्सइंट () समारोह में वापसीमिलीसेकंड के विभाजन से उत्पन्न भिन्नात्मक संख्या को पूर्णांक में बदलने के लिए। आप भी उपयोग कर सकते हैं पार्सफ्लोट() और भिन्नात्मक डेटा संग्रहीत करें.

रिपोर्ट देखें

स्रोत: www.habr.com

एक टिप्पणी जोड़ें