प्रविष्टि
इस लेख में मैं आपको बताऊंगा कि
जेबीएक्स मेट्रिक्स के सबसे सुविधाजनक निम्न-स्तरीय पहचान के लिए
ज़ैबिक्स जावागेटवे को कैसे अनुकूलित किया
जाए । यहाँ
github.com/mfocuz/zabbix_plugins/tree/master/jmx_discovery आप पैच 2.0 वर्जन के लिए ले सकते हैं और बाहरी स्क्रिप्ट के उदाहरण देख सकते हैं। लेकिन पहले बातें पहले।
संस्करण 2.0 के बाद से, Zabbix में
JMX के माध्यम से
जावा अनुप्रयोगों की निगरानी के लिए मूल समर्थन है। लेकिन शायद हर कोई नहीं जानता है कि मैट्रिक्स इकट्ठा करने के अलावा, हम उन्हें बॉक्स से ज़ैबिक्स में भी मिटा सकते हैं। दस्तावेज़ीकरण में, उन्होंने या तो इस बिंदु को याद किया या इस सुविधा को काफी तैयार नहीं माना (हालांकि शायद मैं इसे गोदी में नहीं मिला?), लेकिन यह सुविधा वहां है, और, मेरी राय में, यह वास्तव में बिल्कुल तैयार नहीं है। हालाँकि मुझे यकीन नहीं है कि यह बिल्कुल काम करता है, लेकिन यह परीक्षण में नहीं आया है।
स्रोत कोड zabbix_javagw में
JMXItemChecker.java संस्करण 2.0.11 लाइन 157 के बाद के लिए:
else if (item.getKeyId().equals("jmx.discovery”)) { … for (ObjectName name : mbsc.queryNames(null, null)) { logger.trace("discovered object '{}'", name); for (MBeanAttributeInfo attrInfo : mbsc.getMBeanInfo(name).getAttributes()) { logger.trace("discovered attribute '{}'", attrInfo.getName()); if (!attrInfo.isReadable()) { logger.trace("attribute not readable, skipping"); continue; } try { logger.trace("looking for attributes of primitive types"); String descr = (attrInfo.getName().equals(attrInfo.getDescription()) ? null : attrInfo.getDescription()); findPrimitiveAttributes(counters, name, descr, attrInfo.getName(), mbsc.getAttribute(name, attrInfo.getName())); } catch (Exception e) { Object[] logInfo = {name, attrInfo.getName(), e}; logger.trace("processing '{},{}' failed", logInfo); } } } }
जैसा कि आप कोड से देख सकते हैं, यदि आप नियमों की खोज कॉन्फ़िगरेशन में
"jmx.discovery" नाम के साथ एक कुंजी सेट करते हैं, तो एक पता लगाने का काम करेगा जो
पाए गए सभी mbeans के लिए सभी विशेषताओं को वापस कर देगा।
यहां, सबसे पहले, मैं यह नोट करना चाहता हूं कि इस तरह के अनुरोध की कोई विशेष आवश्यकता नहीं है। सबसे पहले, इस तरह का अनुरोध बहुत जल्दी काम नहीं करता है, क्योंकि प्रत्येक मेबिन की विशेषताओं का अनुरोध एक अलग अनुरोध द्वारा पारित किया जाता है, और बहुत सारे डिब्बे हो सकते हैं। दूसरे, नियम खोज कुंजी
ज़ैबिक्स में एक अद्वितीय मूल्य है, जिसका अर्थ है कि
jmx.discovery का उपयोग
करके हम एक ही मेजबान के भीतर
जेएमएक्स मैट्रिक्स के लिए एक एकल नियम खोज बना सकते हैं, जो कि अधिकांश कार्यों के लिए पूरी तरह से अनुपयुक्त है। और तीसरा, प्रत्येक
जावा mbean के लिए विशेषताएं आमतौर पर नहीं बदलती हैं, अर्थात, एक ही बिन के भीतर उनकी संख्या और उद्देश्य स्थिर है। इसका अर्थ है कि आइटम प्रोटोटाइप और कोड के भाग में सेट करने के लिए विशेषताएँ स्वयं बेहतर हैं, जो वास्तव में ब्रेक है:
for (MBeanAttributeInfo attrInfo : mbsc.getMBeanInfo(name).getAttributes()) { ....... try { (attrInfo.getName().equals(attrInfo.getDescription()) ? null : attrInfo.getDescription()); findPrimitiveAttributes(counters, name, descr, attrInfo.getName(), mbsc.getAttribute(name, attrInfo.getName())); ......
अनावश्यक हो जाता है। लेकिन
mbeans की संख्या परिवर्तनशील हो सकती है। उदाहरण के लिए,
Oracle Coherence क्लस्टर में प्रत्येक नोड के तहत एक विशिष्ट संख्या में सेम बनाता है। नतीजतन, हमारे पास सेम है जिसका नाम केवल
नोडआईड में
भिन्न है । और उदाहरण के लिए, जब आप क्लस्टर को पुनरारंभ करते हैं, तो सभी नोडआईड बदल जाते हैं। यही है,
जावा मेट्रिक्स में डायनामिक
mbeans है । यह वह जगह है जहां हम
एलएलडी का उपयोग करते हैं, लेकिन:
1. हमें केवल विशेषताओं के बिना स्वयं mbeans की आवश्यकता होती है (आप उन्हें भी पा सकते हैं, लेकिन IMHO यह बहुत अच्छा है)।
2. हमारे लिए यह महत्वपूर्ण है कि हम एक ही मेजबान पर कई नियमों की खोज करने में सक्षम हों।
3. हमें नियम खोज के लिए विभिन्न प्रकार के तर्क को कूटबद्ध करने की क्षमता चाहिए।
इतना समय पहले नहीं, एक लेख
JMX डिस्कवरी
www.zabbix.org/wiki/Docs/howto/jmx_discovery पर दिखाई दिया। पिछले साल मैंने इसी तरह के समाधान का इस्तेमाल किया था। अंत में: इस समाधान का सार .jar फ़ाइल को बाहरी स्क्रिप्ट के रूप में चलाना है। इसका विशाल ऋण यह है कि जावा को कई बार चलाने के लिए डिज़ाइन नहीं किया गया है, जैसा कि आमतौर पर व्याख्यायित भाषाओं जैसे अजगर या पर्ल के लिए किया जाता है। यह माइनस समाधान को व्यावहारिक रूप से गैर-काम करता है। कहते हैं, 2 कोर के साथ एक आभासी मशीन पर, 20 नियमों की खोज शुरू करने के लिए, सीपीयू लोड शेल्फ से दूर चला गया, बाहरी चेक के परिणामस्वरूप बस टाइमआउट से गिर गया। लोहे के टुकड़ों पर जहां यह 8kor था, यह ठीक से काम करता था। लेकिन सभी एक ही, हर N मिनट में एक बार JVM बंडल लॉन्च करना एक सुंदर समाधान नहीं है और इसे केवल बैसाखी माना जा सकता है।
नई कार्यक्षमता कैसे काम करेगी
आरंभ करने के लिए, ज़ैबिक्स सर्वर और जावागेटवे कैसे बातचीत करते हैं, इस पर विचार करें।
जेएमएक्स मेट्रिक्स को इकट्ठा करने के लिए, ज़ैबिक्स सर्वर टीसीपी के माध्यम से जावागेटवे से जुड़ता है, जिसके बाद यह ज़ैबिक्स प्रोटोकॉल का उपयोग करके आवश्यक डेटा के लिए अनुरोध करता है। साइट पर प्रोटोकॉल का एक सामान्य विवरण है, मैं इसे थोड़ा अधिक विस्तृत वर्णन करूंगा हमें
एलएलडी के लिए उसकी जरूरत है।
सर्वर को संदेश और उस से प्रतिक्रिया 3 भागों के होते हैं:
1. हैडर ZBXD \ 1
2. संदेश की लंबाई
3. संदेश JSON प्रारूप में है।
यह कुछ इस तरह दिखता है:

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

अर्थात्, regexp फ़ील्ड और एक नए प्रकार का अनुरोध = "जावा jmx lld" जोड़ा गया।
जावागेटवे कोड बदलना
JMX खोज को सुविधाजनक और तेज बनाने के लिए क्या करने की आवश्यकता है? जैसा कि डेवलपर्स द्वारा कल्पना की गई है, JavaGateway में दो संभावित
अनुरोध अनुरोध हैं, उन्हें ItemChecker.java कोड में पाया जा सकता है, ये
JSON_REQUEST_INTERNAL स्थिरांक हैं जो एक आंतरिक आंतरिक गेट मेट्रिक्स की जोड़ी को इकट्ठा करने के लिए हैं, और
JSON_REQUEST_JMX - जो कि मुख्य अनुरोध है और इसका उपयोग एकत्रित करने के लिए किया जाता है।
सॉकेटप्रोसेसर.जवा कोड में
हम देखते हैं:
if (request.getString(ItemChecker.JSON_TAG_REQUEST).equals(ItemChecker.JSON_REQUEST_INTERNAL)) checker = new InternalItemChecker(request); else if (request.getString(ItemChecker.JSON_TAG_REQUEST).equals(ItemChecker.JSON_REQUEST_JMX)) checker = new JMXItemChecker(request); ….. JSONArray values = checker.getValues();
यही है, यह निर्धारित करता है कि
चेकर किस प्रकार का होगा। हम 3 प्रकार के अनुरोध
जोड़ेंगे -
JSON_JMX_LLD । और तदनुसार, सॉकेटप्रोसेसर में हमारे अनुरोध के लिए एक और शर्त। जावा:
…... else if (request.getString(ItemChecker.JSON_TAG_REQUEST).equals(ItemChecker.JSON_JMX_LLD)) checker = new JMXItemDiscoverer(request); …… JSONArray values = checker.getValues();
अब, जब सर्वर को
JSON_JMX_LLD के लिए अनुरोध प्राप्त होता है, तो
JMXItemDiscoverer वर्ग का एक उदाहरण बनाया जाएगा और
getValues विधि को
कॉल किया जाएगा। यह JMXItemDiscoverer वर्ग को जोड़ने के लिए बना हुआ है, जो खोज नियम बना देगा क्योंकि यह हमारे लिए सुविधाजनक होगा, अर्थात्, यह सभी उपलब्ध डिब्बे के लिए एक अनुरोध करेगा और आउटपुट पर यह दिए गए regexp के लिए डिब्बे की सूची लौटाएगा। नए वर्ग के कोड को पैच में देखा जा सकता है।
नया जावा गेटवे कॉन्फ़िगर करें
दो विकल्प हैं, आप स्वयं जावागेटवे को बदल सकते हैं, या आप एक और बढ़ा सकते हैं, जो केवल एलएलडी के लिए काम करेगा। अगर मैं गेटवे को PRO में बदलता हूं, तो:
1. Zabbix साइड में, केवल JavaGateway को बदलना होगा। लेख की शुरुआत में लिंक द्वारा आप zabbix जावा गेटवे संस्करण 2.0.11 पर पैच पा सकते हैं। मैं कोड 2.2 और 2.0.11 पर थोड़ा भिन्न था, और इसलिए जावा गेटवे बहुत अलग नहीं है, इसलिए मुझे लगता है कि जावा के बुनियादी ज्ञान के साथ पैच को नवीनतम संस्करण में स्थानांतरित करना मुश्किल नहीं होगा।
2. अगला, पैच को रोल करें और जावा के स्थापित संस्करण के लिए जावागेटवे का निर्माण करें।
3. हमें परिणामी मिलता है। पुराने के स्थान पर। हम सभी अन्य जावा गेटवे फ़ाइलों को छोड़ देते हैं, जिसमें कॉन्फ़िगरेशन, या जो कुछ भी है, जैसा है।
4. हम शुरू करते हैं। हम एक ही जावा गेटवे प्राप्त करते हैं, लेकिन अब यह एक और प्रकार के अनुरोधों को संसाधित करने में सक्षम है।
5. स्वयं अनुरोधों के लिए, हम एक स्क्रिप्ट लिखते हैं जो टीसीपी के माध्यम से सर्वर से चिपकेगी और वास्तव में अनुरोध स्वयं करेगी। मैंने पर्ल के लिए एक सरल JMXDiscovery.pm मॉड्यूल का स्केच किया, जिससे एक खोज स्क्रिप्ट लिखना आसान हो गया और साथ ही jmx_discovery.pl स्क्रिप्ट
खोज और मॉड्यूल उपयोग का उदाहरण (शुरुआत में लिंक पर पाया जा सकता है)।
6. ठीक है, अंत में, नियम की खोज बनाएं, प्रकार में बाह्य विवरण निर्दिष्ट करें। स्क्रिप्ट में दिए गए पैरामीटर कुंजी की विशिष्टता को सुनिश्चित करेंगे, जो आपको किसी भी नियम बनाने की अनुमति देगा।
यदि आप
एलएलडी के लिए एक अलग सर्वर उठाना चाहते हैं, तो चरण 3 को छोड़ दें, और असेंबली के बाद, पैच के साथ, हम बस
जावागेटवे को एक अलग सेवा के
रूप में सेट
करते हैं ।
निष्कर्ष
यह जल्दी और stably काम करता है।