يعد Zabbix منتجًا رائعًا لمسؤولي البرامج والأجهزة الكبيرة. إنه جيد جدًا لدرجة أنه لا يمكن استخدامه فقط من قبل الشركات الكبيرة ، ولكن أيضًا من خلال الشركات الصغيرة والمتوسطة ، وحتى في مشروع pet
. بشكل عام ، لدي خبرة قليلة مع Zabbix ويمكنني أن أوصي به بأمان للاستخدام.
صحيح ، لا أستطيع أن أقول أنني أفهم " فلسفة Zabbix ". على الرغم من الوثائق المفصلة واسعة النطاق باللغة الروسية ، كان من الصعب بالنسبة لي أن يغرق في عالم Zabbix - شعرت بأن المطورين وأنا اتصلت بالأشياء نفسها بأسماء مختلفة. ربما لأن Zabbix تم إنشاؤه بواسطة مدراء للمشرفين ، لكنني ما زلت أكثر مطور ومستخدم.
ومع ذلك ، لتشغيل Zabbix ومراقبة المعلمات الرئيسية لأنظمة الكمبيوتر (المعالج ، الذاكرة ، وما إلى ذلك) ، فإن مهارات مستخدم نظام التشغيل linux كافية. هناك عدد كبير من المكونات الإضافية من مطوري الطرف الثالث الذين يوسعون قدرات Zabbix. لاحتياجاتي ، كنت بحاجة لتهيئة مراقبة خادم Redis. قمت بالتفتيش قليلاً في رمز المكونات الإضافية المتاحة ، وباستخدام مثالهم ، اكتشفت أن بنية Zabbix تسمح لك ببساطة بالاتصال بمراقبة أي معلمات لنظم المعلومات التي يمكن التعبير عنها في شكل رقمي.
تحت القطة - مثال على ملحق Zabbix مع شرحي لمصطلحات Zabbix. بالنسبة للبعض ، سيبدو هذا المثال ساذجًا ، لكن بالنسبة للبعض سيساعد على الارتياح مع المفاهيم. في أي حال ، Zabbix كبير بما يكفي ليشعر به من زوايا مختلفة.
المفاهيم الأساسية
باختصار حول بعض المفاهيم المستخدمة في Zabbix: العوامل ، العناصر ، المشغلات ، الإجراءات ، الإشعارات ، القوالب .
الخادم والوكلاء
من وجهة نظر المستخدم ، ينقسم Zabbix إلى قسمين كبيرين: الخادم والوكلاء. يوجد الخادم على جهاز واحد يقوم بجمع البيانات الإحصائية وتخزينها ووكلاء على الأجهزة التي يتم جمع البيانات منها:

خيارات الرصد
يتم استدعاء أي كمية يمكن التعبير عنها في شكل رقمي أو سلسلة في مصطلحات Zabbix - عنصر بيانات (عنصر). يرتبط كل عنصر بمفتاح فريد (الاسم). فيما يلي أمثلة لعناصر البيانات:
- system.cpu.load [percpu ، avg1] : 0.1167
- system.uname : "Linux supru 4.15.0-50-generic # 54-Ubuntu SMP Mon May 6 18:46:08 UTC 2019 x86_64"
يتم إرفاق قيم عناصر البيانات هذه (معلمات المراقبة) بالوقت ؛ يتم تخزين محفوظات قيم المعلمات في قاعدة بيانات الخادم.
أحداث
عندما يحدث حدث في Zabbix ، يطلق المشعل النار. على سبيل المثال
- {system.cpu.load [percpu، avg1] .avg (5m)}> 10 - تجاوز متوسط قيمة المعلمة خلال الدقائق الخمس الماضية "10"
- {system.uname.diff (0)}> 0 - القيمة الحالية للمعلمة لا تساوي القيمة السابقة
في الواقع ، فإن المشغلات هي صيغ تعمل فيها معلمات المراقبة (الحالية والمحفوظة) كمتغيرات ، والتي تسفر عن true
/ false
في المخرجات.
الإجراءات والتنبيهات
في حالة وقوع حدث (المشغل) ، يمكن أن يقوم الخادم بإجراء. على سبيل المثال ، أرسل تنبيهًا عبر البريد الإلكتروني إلى عنوان محدد (" المشكلة: المضيف غير قابل للوصول لمدة 5 دقائق "). أيضًا ، يمكن تنفيذ إجراء ما إذا عاد المشغل إلى حالته الأصلية (" الحل: المضيف غير قابل للوصول لمدة 5 دقائق "). يتم تسجيل جميع الأحداث (تبديل المشغل) على جانب الخادم.
قوالب
يتيح Zabbix تكوين قواعد مراقبة لمضيف فردي ، وكذلك إنشاء قالب (قالب) يمكن تطبيقه على مضيفين مختلفين:

يوضح المثال أن قالب "خدمة تطبيق SSH لخدمة القوالب" يصف تطبيقًا واحدًا (تطبيقات) ، ومعلمة مراقبة واحدة (العناصر) ، ومشغل واحد (المشغلات). تتوفر أيضًا أوصاف للرسوم البيانية والشاشات وقواعد الاكتشاف ونصوص الويب.
تحديد مهمة البرنامج المساعد
وضع البداية
يقدم Zabbix نفسه المكون الإضافي الخاص به لمراقبة حالة Redis ، لكن على إصدار الخادم الخاص بي (4.2.8) لم أتمكن من استخدامه (البرنامج المساعد للإصدار 4.4 وما بعده). يتم تقديم حلول من جهات خارجية أيضًا (حوالي عشرة خيارات لإصدارات مختلفة من Zabbix ، لا يوجد سوى الثلاثة الأولى في الصورة):

كان لكل منهم إيجابيات وسلبيات خاصة به ، وكان عليه أن ينظر من الداخل للاختيار. الأفضل ، في رأيي ، كان المكون الإضافي Shakeeljaveed / zabbix-redis-userparamaters ، الذي يتكون من ملفين:
- README.md
- رديس-userparameter.conf
كان علي أن أعمل "أقلام" صغيرة ، لكن على مثاله ، أصبح من الواضح قليلاً كيف يتم نقل البيانات من الوكيل إلى الخادم. بناءً على اقتراح المؤلف Javeed Shakeel ، تمت إعادة تعيين حالة /tmp/redismetric
كل دقيقتين بواسطة التاج إلى ملف /tmp/redismetric
:
*/2 * * * * /usr/bin/redis-cli info > /tmp/redismetric
ثم تم استخراج كل معلمة مراقبة بواسطة العامل من الملف /tmp/redismetric
باستخدام أدوات نظام التشغيل نفسه. تم وضع التعليمات الخاصة بهذا في تكوين عميل /etc/zabbix/zabbix_agent.conf.d/userparameter_redis.conf
. على سبيل المثال ، هذه هي الطريقة التي يبدو بها تعليمة استرداد المعلمة used_memory
(استخدام الذاكرة بواسطة خادم used_memory
) كما يلي:
UserParameter=used_memory,grep -w 'used_memory' /tmp/redismetric | cut -d: -f2
أي أنه في الملف /tmp/redismetric
مع إخراج معلومات redis-cli INFO
، يتم البحث عن السلسلة ( grep -w ...
) بواسطة المفتاح used_memory
used_memory:7153216
والتي يتم تقسيمها إلى أعمدة بواسطة الفاصل ":" ( cut -d: -f2
). في الخرج ، يتلقى العامل الرقم 7153216
used_memory
للمعلمة used_memory
.
يبقى تكوين الخادم من خلال الواجهة المستندة إلى الويب بحيث يرسل بشكل دوري طلبات إلى الوكيل لتلقي البيانات باستخدام المعلمة used_memory
، وبعد ذلك تبدأ البيانات في used_memory
على الخادم ، المخزنة في قاعدة البيانات ، يمكنك استخدامه لإنشاء الرسوم البيانية وإنشاء مشغلات تستجيب للتغيرات التي تطرأ على هذه المعلمة.
هدف
لا تتمثل مهمة مراقبة حالة أي نظام في جمع الإحصاءات فحسب ، بل أيضًا التحذير من حدوث المواقف التي تتطلب تدخلًا بشريًا. منذ أن عملت مع Redis كمستخدم مبتدئ للغاية ، كان علي أن أبحث عن معلومات حول ماهية المعلمات "الصحية" التي يجب الانتباه إليها وما تعنيه. وكان المقال الأكثر جدارة هو " 6 مقاييس رصد حاسمة تحتاج إلى مشاهدتها ." بعد تحليلها ، توصلت إلى استنتاج مفاده أنه "من أجل السعادة الكاملة" أحتاج إلى جمع البيانات لاكتشاف الأحداث التالية:
- تجزئة الذاكرة: used_memory_rss / used_memory> 1.5
- نسبة الدخول إلى ذاكرة التخزين المؤقت المنخفضة: (keyspace_hits) / (keyspace_hits + keyspace_misses) <0.8
- الاتصالات المرفوضة: المرفوضة> 0
- مفاتيح الإخلاء: evicted_keys> 0
أردت أيضًا أن أجمع إحصائيات حول معلمات إضافية (إصدار Redis ، مدة التشغيل ، إلخ). بشكل عام ، مع وجود فكرة عامة عن كيفية جمع البيانات من قبل الوكيل ونقلها إلى الخادم ، يمكن أن تكون قائمة الأمنيات محدودة للغاية. والنتيجة هي قائمة المعلمات للرصد من 12 وظيفة.
إنشاء البرنامج المساعد الخاص بك
خيارات الرصد
يفترض المكون الإضافي الذي قمت بتحليله تنفيذ أمر منفصل للحصول على معلمة منفصلة (عنصر البيانات ، العنصر):
grep -w 'used_memory' /tmp/redismetric | cut -d: -f2
أي للحصول على بيانات حول 12 معلمة ، سيتعين على الوكيل تنفيذ مجموعات مختلفة من الأوامر 12 مرة. وإذا كنت بحاجة إلى مراقبة المعلمات التي يصعب استخراجها من خلال سلسلة من الأوامر وتحتاج إلى كتابة برنامج نصي shell منفصل أو برنامج كامل؟ لمثل هذه "قائمة الامنيات" Zabbix يقدم البديل مع عناصر البيانات التابعة. جوهرها هو أنه من ناحية الوكيل ، يقوم البرنامج النصي بتكوين مجموعة بيانات (على سبيل المثال ، بتنسيق JSON) ، والتي يتم إرسالها إلى الخادم كمعلمة سلسلة. ثم ، على جانب الخادم ، يتم تحليل البيانات المستلمة ويتم استخراج المعلمات الأولية الفردية منها.
عنصر البيانات الرئيسي
وصفت redis.info
بيانات redis.info
الرئيسي redis.info
السلسلة مع فترة تحديث مدتها دقيقة واحدة ، دون حفظ سجل التغيير:

من المفترض ، يجب إنشاء JSON التالية على جانب الوكيل:
{ "version": "4.0.9", "uptime": 1897336, "used_memory": 1054943416, "used_memory_rss": 1138159616, "keyspace_hits": 75810274, "keyspace_misses": 13545949, "connected_clients": 15, "rdb_last_save_time": 1580126954, "total_connections_received": 1258614, "rejected_connections": 0, "expired_keys": 60270, "evicted_keys": 0 }
بعد ذلك ، يجب redis.info
هذا النص إلى الخادم redis.info
بيانات redis.info
، ولكن لا يتم حفظه ، ولكنه بمثابة قاعدة لعناصر البيانات الأخرى (معلمات المراقبة).
عنصر البيانات التابعة
تعتمد معلمة الاختبار redis.info.version
على redis.info
وتخزن قيمها في قاعدة البيانات لمدة 90 يومًا. يعتمد تكرار مراقبة المعلمة على العنصر الأساسي ( redis.info
):

يتم استرداد redis.info.version
معلمة redis.info.version
من قيمة redis.info باستخدام إرشادات JSONPath:

يصف مخطط مماثل عناصر البيانات التابعة المتبقية (معلمات المراقبة) ، والتي يتم إرسالها في شكل JSON. فيما يلي مثال على وصف المعلمة الرقمية redis.info.used_memory
:

كل شيء شفاف إلى حد ما ، باستثناء Trend storage period
Units
و Trend storage period
. لم أفهم النقطة الثانية ، لقد تركتها افتراضيًا ، ويتم شرح وحدات القياس في الوثائق . في هذه الحالة ، يتم قياس قيمة redis.info.used_memory
بالبايت وتقليلها إلى كيلو بايت / ميجا / جيجا /...- بايت في واجهة الويب.
الصيغة لاستخراج قيمة من JSON هي: JSONPath = $.used_memory
عنصر البيانات المحسوبة
لحساب تجزئة الذاكرة ، يتم استخدام العلاقة used_memory
/ used_memory
، وعلى أساسها يتم تحديد المشغل الذي ينطلق عندما تتجاوز النسبة 1.5. يحتوي Zabbix على نوع عنصر بيانات محسوب:

redis.info.used_memory_ratio
حساب قيمة المعلمة redis.info.used_memory_ratio
كل دقيقة بناءً على القيم الأخيرة redis.info.used_memory_rss
( redis.info.used_memory_rss
و redis.info.used_memory
) ، ويتم تخزينها في قاعدة البيانات لمدة 90 يومًا ، إلخ.
مشغلات
فيما يلي مثال لمشغل يطلق النار عندما تكون الذاكرة مجزأة جدًا:

لا شيء غير عادي ، باستثناء تنسيق التعبير المستخدم في صيغة تغيير حالة التشغيل. لدى Zabbix مُنشئ نماذج ، يمكنك استخدامه أو الرجوع إلى الوثائق / الأمثلة (تتوفر قائمة المشغلات من خلال واجهة الويب في " Configuration / Templates / $ {TemplateName} / Triggers ").
يمكن أن يعتمد المشغل على أي عناصر بيانات (عنصر) ، بغض النظر عن نوعها (رئيسي ، تابع ، محسوب).
إعداد الوكيل
جسون الجيل
للحصول على قيم معلمات المراقبة وتكوين JSON ، استخدم هذا البرنامج النصي shell:
لقد وضعت هذا البرنامج النصي في الملف /var/lib/zabbix/user_parameter/redis/get_info.sh
على الخادم مع Redis ، والذي تم تثبيت عميل Zabbix عليه بالفعل. يجب أن يكون لدى المستخدم الذي تم تشغيل وكيل Zabbix (عادة zabbix
) إذن لتنفيذ ملف get_info.sh
.
userparameter_XXX.conf
ملف
على جانب العامل ، تتم userparameter_*.conf
معلمات مراقبة إضافية في userparameter_*.conf
في ملفات userparameter_*.conf
. لذلك ، لكي redis.info
العامل كيف يحتاج إلى جمع البيانات على المعلمة redis.info
، قمتُ بإنشاء ملف /etc/zabbix/zabbix_agentd.d/userparameter_redis.conf
مع المحتويات التالية:
UserParameter=redis.info,/var/lib/zabbix/user_parameter/redis/get_info.sh
أي للحصول على بيانات حول المعلمة redis.info
يجب على الوكيل تشغيل البرنامج النصي /var/lib/zabbix/user_parameter/redis/get_info.sh
ونقل نتيجة التنفيذ إلى الخادم.
بعد إعادة تشغيل وكيل Zabbix (إعادة تشغيل sudo service zabbix-agent restart
) ، يصبح من الممكن جمع البيانات لمعلمة redis.info
وإرسالها إلى الخادم.
ملخص
جاء فهم Zabbix لي (وما زال يأتي) بشدة. ومع ذلك ، فأنا أعتبرها أداة رائعة ، خاصة بعد بساطة إضافة معلمات المراقبة الخاصة بي (عناصر البيانات) التي فتحت لي. بشكل عام ، ما عليك سوى إضافة ملف واحد إلى الخادم مع الوكيل ( userparameter_XXX.conf
) باستخدام أمر shell لجمع البيانات وتكوين خادم Zabbix لتلقي هذه البيانات من خلال واجهة الويب. وهذا كل شيء - يمكنك تجميع البيانات ، وبناء الرسوم البيانية ، وتحليل التغييرات ، وإنشاء محفز يستجيب لهذه التغييرات.
يمكن عرض رمز القالب وملف get_info.sh
النصي get_info.sh
في مشروع flancer32 / zabbix_plugin_redis .
شكراً لكل من قرأ حتى النهاية ، وخاصةً لأولئك الذين وجدوا شيئًا مفيدًا لأنفسهم في المنشور.