ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔
Tikhon Uskov، زبکس انٹیگریشن ٹیم انجینئر

Zabbix ایک حسب ضرورت پلیٹ فارم ہے جو کسی بھی قسم کے ڈیٹا کی نگرانی کے لیے استعمال ہوتا ہے۔ Zabbix کے ابتدائی ورژن کے بعد سے، نگرانی کرنے والے منتظمین کو مختلف اسکرپٹس کے ذریعے چلانے کی صلاحیت حاصل ہے۔ عوامل ٹارگٹ نیٹ ورک نوڈس کی جانچ کے لیے۔ ایک ہی وقت میں، اسکرپٹس کے اجراء سے کئی مشکلات پیش آئیں، جن میں اسکرپٹس کو سپورٹ کرنے کی ضرورت، کمیونیکیشن نوڈس اور پراکسیز تک ان کی ترسیل کے ساتھ ساتھ مختلف ورژنز کے لیے سپورٹ شامل ہیں۔

Zabbix کے لیے جاوا اسکرپٹ

اپریل 2019 میں، Zabbix 4.2 کو JavaScript پری پروسیسنگ کے ساتھ متعارف کرایا گیا تھا۔ بہت سے لوگ لکھنے والی اسکرپٹس کو ترک کرنے کے خیال سے پرجوش ہو گئے جو ڈیٹا کہیں لے جاتے ہیں، اسے ہضم کرتے ہیں اور اسے Zabbix کے سمجھ میں آنے والے فارمیٹ میں فراہم کرتے ہیں، اور سادہ چیکس انجام دیتے ہیں جو ڈیٹا وصول کریں گے جو Zabbix کے ذریعے ذخیرہ کرنے اور پروسیسنگ کے لیے تیار نہیں ہے، اور پھر Zabbix اور JavaScript ٹولز کا استعمال کرتے ہوئے اس ڈیٹا سٹریم پر کارروائی کریں۔ Zabbix 3.4 میں نمودار ہونے والی کم سطح کی دریافت اور منحصر اشیاء کے ساتھ مل کر، ہمیں موصول ہونے والے ڈیٹا کو چھانٹنے اور اس کا انتظام کرنے کے لیے کافی لچکدار تصور ملا۔

Zabbix 4.4 میں، JavaScript میں پری پروسیسنگ کے منطقی تسلسل کے طور پر، نوٹیفکیشن کا ایک نیا طریقہ سامنے آیا ہے - Webhook، جسے Zabbix اطلاعات کو تیسرے فریق کے ایپلیکیشنز کے ساتھ آسانی سے مربوط کرنے کے لیے استعمال کیا جا سکتا ہے۔

جاوا اسکرپٹ اور ڈکٹیپس

JavaScript اور Duktape کا انتخاب کیوں کیا گیا؟ زبانوں اور انجنوں کے لیے مختلف اختیارات پر غور کیا گیا:

  • Lua - Lua 5.1
  • Lua - LuaJIT
  • جاوا اسکرپٹ - Duktape
  • جاوا اسکرپٹ - جیری اسکرپٹ
  • ایمبیڈڈ ازگر
  • ایمبیڈڈ پرل

انتخاب کے اہم معیارات کا پھیلاؤ، پروڈکٹ میں انجن کے انضمام میں آسانی، کم وسائل کی کھپت اور انجن کی مجموعی کارکردگی، اور نگرانی میں اس زبان میں کوڈ متعارف کرانے کی حفاظت شامل ہیں۔ اشارے کے مجموعہ کی بنیاد پر، JavaScript نے Duktape انجن پر کامیابی حاصل کی۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔

انتخاب کے معیار اور کارکردگی کی جانچ

ڈکٹیپ کی خصوصیات:

- معیاری ECMAScript E5/E5.1
— Duktape کے لیے Zabbix ماڈیولز:

  • Zabbix.log() - آپ کو Zabbix سرور لاگ میں براہ راست تفصیل کی مختلف سطحوں کے ساتھ پیغامات لکھنے کی اجازت دیتا ہے، جو غلطیوں کو آپس میں جوڑنا ممکن بناتا ہے، مثال کے طور پر، ویب ہُک میں، سرور کی حالت کے ساتھ۔
  • CurlHttpRequest() - آپ کو نیٹ ورک پر HTTP درخواستیں کرنے کی اجازت دیتا ہے، جس پر Webhook کا استعمال مبنی ہے۔
  • atob() اور btoa() - آپ کو بیس 64 فارمیٹ میں تاروں کو انکوڈ اور ڈی کوڈ کرنے کی اجازت دیتا ہے۔

نوٹ. Duktape ACME معیارات کی تعمیل کرتا ہے۔ Zabbix اسکرپٹ کا 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 تک بڑھا دے گا۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔
اسکرپٹ کا نفاذ، بشرطیکہ متغیر 3 کے برابر ہو، اور یہ بھی 4 کے برابر ہو۔

جب کاسٹ (==) کے ساتھ موازنہ کیا جائے تو، طریقہ ہر بار عمل میں لایا جاتا ہے۔ سٹرنگ قدر بڑھانے کی تقریب کے ساتھ۔ اس کے مطابق، ہر بعد کے موازنہ کے ساتھ، قدر میں اضافہ ہوتا ہے۔ نان کاسٹ موازنہ (===) استعمال کرکے اس سے بچا جاسکتا ہے۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔
قسم کاسٹنگ کے بغیر موازنہ

نوٹ. کاسٹ موازنہ کو غیر ضروری طور پر استعمال نہ کریں۔.

پیچیدہ اسکرپٹس کے لیے، جیسے کہ پیچیدہ منطق کے ساتھ Webhooks، جن کے لیے ٹائپ کاسٹنگ کے ساتھ موازنہ کی ضرورت ہوتی ہے، ان اقدار کے لیے پہلے سے چیک لکھنے کی سفارش کی جاتی ہے جو متغیرات کو واپس کرتی ہیں اور تضادات اور غلطیوں کو سنبھالتی ہیں۔

ویب ہُک میڈیا

2019 کے آخر اور 2020 کے اوائل میں، Zabbix انٹیگریشن ٹیم فعال طور پر Webhooks اور آؤٹ آف دی باکس انٹیگریشنز تیار کر رہی ہے جو Zabbix ڈسٹری بیوشن کے ساتھ آتے ہیں۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔
سے لنک کریں دستاویزات

پیشگی کارروائی

  • JavaScript میں پری پروسیسنگ کی آمد نے زیادہ تر بیرونی اسکرپٹس کو ترک کرنا ممکن بنایا، اور فی الحال Zabbix میں آپ کوئی بھی قدر حاصل کر سکتے ہیں اور اسے بالکل مختلف قدر میں تبدیل کر سکتے ہیں۔
  • Zabbix میں پری پروسیسنگ جاوا اسکرپٹ کوڈ کے ذریعہ لاگو کی جاتی ہے، جسے، بائیک کوڈ میں مرتب کرنے پر، ایک فنکشن میں تبدیل کیا جاتا ہے جو پیرامیٹر کے طور پر ایک واحد قدر لیتا ہے۔ قیمت ایک تار کے طور پر (ایک تار میں ہندسہ اور عدد دونوں شامل ہو سکتے ہیں)۔
  • چونکہ آؤٹ پٹ ایک فنکشن ہے، اسکرپٹ کے آخر میں ضروری ہے۔ واپسی.
  • کوڈ میں اپنی مرضی کے مطابق میکرو استعمال کرنا ممکن ہے۔
  • وسائل کو نہ صرف آپریٹنگ سسٹم کی سطح پر بلکہ پروگرام کے لحاظ سے بھی محدود کیا جا سکتا ہے۔ پری پروسیسنگ مرحلے میں زیادہ سے زیادہ 10 میگا بائٹس RAM اور 10 سیکنڈ کی رن ٹائم حد مختص کی گئی ہے۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔

نوٹ. 10 سیکنڈ کی ٹائم آؤٹ ویلیو بہت زیادہ ہے، کیونکہ ایک سیکنڈ میں "بھاری" پری پروسیسنگ منظر نامے کے مطابق مشروط ہزاروں ڈیٹا آئٹمز کو اکٹھا کرنا 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 سیکنڈ میں ایک بار کیا جاتا ہے، تو Zabbix 29 سیکنڈ کے لیے "ہیکس" ہوجاتا ہے، اور آخری سیکنڈ میں یہ جانچنا اور حساب لگانا شروع کردیتا ہے۔ یہ ایک قطار بناتا ہے اور کارکردگی کو متاثر کرتا ہے۔ لہذا، مقررہ وقفوں کو صرف اس صورت میں استعمال کرنے کی سفارش کی جاتی ہے جب یہ واقعی ضروری ہو۔

اس مسئلے میں، بہترین حل ایک لائن جاوا اسکرپٹ پری پروسیسنگ ہے جو ڈگری فارن ہائیٹ کو ڈگری سیلسیس میں تبدیل کرتا ہے:

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

یہ تیز اور آسان ہے، آپ کو غیر ضروری ڈیٹا آئٹمز بنانے اور ان پر تاریخ رکھنے کی ضرورت نہیں ہے، اور آپ چیک کے لیے لچکدار وقفے بھی استعمال کر سکتے ہیں۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔

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

لیکن، اگر فرضی صورت حال میں موصولہ ڈیٹا عنصر کو شامل کرنا ضروری ہے، مثال کے طور پر، میکرو میں کسی بھی مستقل کی وضاحت کے ساتھ، اس کو مدنظر رکھنا ضروری ہے کہ پیرامیٹر قیمت ایک تار میں پھیلتا ہے۔ سٹرنگ کے اضافے کے عمل میں، دو تاروں کو آسانی سے ایک میں ملایا جاتا ہے۔

ہم جاوا اسکرپٹ کا استعمال کرتے ہوئے Zabbix میں عملی مسائل حل کرتے ہیں۔

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

ریاضیاتی آپریشن کا نتیجہ حاصل کرنے کے لیے، حاصل شدہ اقدار کی اقسام کو عددی شکل میں تبدیل کرنا ضروری ہے۔ اس کے لیے آپ فنکشن استعمال کر سکتے ہیں۔ parseInt()، جو ایک عدد، ایک فنکشن پیدا کرتا ہے۔ parseFloat()، جو ایک اعشاریہ، یا ایک فنکشن پیدا کرتا ہے۔ تعداد، جو ایک عدد یا اعشاریہ لوٹاتا ہے۔

ٹاسک 2

سرٹیفکیٹ کے اختتام تک سیکنڈ میں وقت حاصل کریں۔

حالت: ایک سروس سرٹیفکیٹ کی میعاد ختم ہونے کی تاریخ "فروری 12 12:33:56 2022 GMT" کی شکل میں جاری کرتی ہے۔

ECMAScript5 میں date.parse() ISO 8601 فارمیٹ میں تاریخ قبول کرتا ہے (YYYY-MM-DDTHH:mm:ss.sssZ)۔ اسے MMM DD YYYY HH:mm:ss ZZ فارمیٹ میں اسٹرنگ کاسٹ کرنا ضروری ہے۔

مسئلہ: مہینے کی قدر کو متن کے طور پر ظاہر کیا جاتا ہے، نمبر کے طور پر نہیں۔ اس فارمیٹ میں ڈیٹا Duktape کے ذریعہ قبول نہیں کیا جاتا ہے۔

حل مثال:

  • سب سے پہلے، ایک متغیر کا اعلان کیا جاتا ہے جو ایک قدر لیتا ہے (پورا اسکرپٹ متغیرات کا اعلان ہے جو کوما سے الگ کرکے درج کیا جاتا ہے)۔

  • پہلی لائن میں ہمیں پیرامیٹر میں تاریخ ملتی ہے۔ قیمت اور طریقہ استعمال کرتے ہوئے اسے خالی جگہوں سے الگ کریں۔ تقسیم. اس طرح، ہمیں ایک صف ملتی ہے، جہاں سرنی کا ہر عنصر، انڈیکس 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 سے مستقبل میں کسی وقت تک سیکنڈوں کی تعداد ہے۔ ٹرگرز میں موصول شدہ فارمیٹ میں ڈیٹا استعمال کرنا تقریباً ناممکن ہے، کیونکہ Zabbix آپ کو صرف میکرو کے ساتھ کام کرنے کی اجازت دیتا ہے۔ {تاریخ и {وقت}، جو صارف کے موافق فارمیٹ میں تاریخ اور وقت لوٹاتا ہے۔

  • اس کے بعد ہم یونکس ٹائم اسٹیمپ فارمیٹ میں جاوا اسکرپٹ میں موجودہ تاریخ حاصل کر سکتے ہیں اور سرٹیفکیٹ کی میعاد ختم ہونے تک ملی سیکنڈ کی تعداد حاصل کرنے کے لیے اسے نتیجے میں سرٹیفکیٹ کی میعاد ختم ہونے کی تاریخ سے گھٹا سکتے ہیں۔

`now = Date.now();`

  • Zabbix میں سیکنڈ حاصل کرنے کے لیے ہم موصول ہونے والی قیمت کو ہزار سے تقسیم کرتے ہیں۔

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

ٹرگر میں، آپ اظہار کی وضاحت کر سکتے ہیں 'آخری' اس کے بعد ہندسوں کا ایک سیٹ جو اس مدت میں سیکنڈوں کی تعداد سے مطابقت رکھتا ہے جس میں آپ جواب دینا چاہتے ہیں، مثال کے طور پر، ہفتوں میں۔ اس طرح، ٹرگر مطلع کرے گا کہ سرٹیفکیٹ ایک ہفتے میں ختم ہو جائے گا.

نوٹ. استعمال پر توجہ دیں۔ parseInt() فنکشن میں واپسیملی سیکنڈز کی تقسیم کے نتیجے میں عددی عدد کو عدد میں تبدیل کرنے کے لیے۔ آپ بھی استعمال کر سکتے ہیں۔ parseFloat() اور فریکشنل ڈیٹا اسٹور کریں۔.

رپورٹ دیکھیں

ماخذ: www.habr.com

نیا تبصرہ شامل کریں