Zabbix: راقب كل شيء على التوالي (على سبيل المثال Redis)

يعد Zabbix منتجًا رائعًا لمسؤولي البرامج والأجهزة الكبيرة. إنه جيد جدًا لدرجة أنه لا يمكن استخدامه فقط من قبل الشركات الكبيرة ، ولكن أيضًا من خلال الشركات الصغيرة والمتوسطة ، وحتى في مشروع pet . بشكل عام ، لدي خبرة قليلة مع Zabbix ويمكنني أن أوصي به بأمان للاستخدام.


صحيح ، لا أستطيع أن أقول أنني أفهم " فلسفة Zabbix ". على الرغم من الوثائق المفصلة واسعة النطاق باللغة الروسية ، كان من الصعب بالنسبة لي أن يغرق في عالم Zabbix - شعرت بأن المطورين وأنا اتصلت بالأشياء نفسها بأسماء مختلفة. ربما لأن Zabbix تم إنشاؤه بواسطة مدراء للمشرفين ، لكنني ما زلت أكثر مطور ومستخدم.


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


تحت القطة - مثال على ملحق 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 تكوين قواعد مراقبة لمضيف فردي ، وكذلك إنشاء قالب (قالب) يمكن تطبيقه على مضيفين مختلفين:


قوالب zabbix


يوضح المثال أن قالب "خدمة تطبيق SSH لخدمة القوالب" يصف تطبيقًا واحدًا (تطبيقات) ، ومعلمة مراقبة واحدة (العناصر) ، ومشغل واحد (المشغلات). تتوفر أيضًا أوصاف للرسوم البيانية والشاشات وقواعد الاكتشاف ونصوص الويب.


تحديد مهمة البرنامج المساعد


وضع البداية


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


الإضافات Redis ل 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:


 #!/bin/bash ## =========================================================================== # Script to generate Redis monitoring data in JSON format # for 'zabbix-agent'. ## =========================================================================== # collect working variables/data BIN_REDIS=$(whereis -b redis-cli | cut -d" " -f2) # /usr/bin/redis-cli DATA_INFO=$(${BIN_REDIS} INFO | tr -d '\r') # get info and remove trailing '\r' from output ## # Extract stats and save it into env. vars. ## # find lines with 'grep', cut second field after ":" and put it into env. variable: ITEM_VERSION=$(grep "^redis_version:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_UPTIME=$(grep "^uptime_in_seconds:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_USED_MEMORY=$(grep "^used_memory:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_USED_MEMORY_RSS=$(grep "^used_memory_rss:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_KEYSPACE_HITS=$(grep "^keyspace_hits:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_KEYSPACE_MISSES=$(grep "^keyspace_misses:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_CONNECTED_CLIENTS=$(grep "^connected_clients:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_RDB_LAST_SAVE_TIME=$(grep "^rdb_last_save_time:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_TOTAL_CONNECTIONS_RECEIVED=$(grep "^total_connections_received:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_REJECTED_CONNECTIONS=$(grep "^rejected_connections:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_EXPIRED_KEYS=$(grep "^expired_keys:" <<<"${DATA_INFO}" | cut -d: -f2) ITEM_EVICTED_KEYS=$(grep "^evicted_keys:" <<<"${DATA_INFO}" | cut -d: -f2) # compose output JSON for Zabbix server: echo -n "{" echo -n "\"version\": \"${ITEM_VERSION}\"," echo -n "\"uptime\": ${ITEM_UPTIME}," echo -n "\"used_memory\": ${ITEM_USED_MEMORY}," echo -n "\"used_memory_rss\": ${ITEM_USED_MEMORY_RSS}," echo -n "\"keyspace_hits\": ${ITEM_KEYSPACE_HITS}," echo -n "\"keyspace_misses\": ${ITEM_KEYSPACE_MISSES}," echo -n "\"connected_clients\": ${ITEM_CONNECTED_CLIENTS}," echo -n "\"rdb_last_save_time\": ${ITEM_RDB_LAST_SAVE_TIME}," echo -n "\"total_connections_received\": ${ITEM_TOTAL_CONNECTIONS_RECEIVED}," echo -n "\"rejected_connections\": ${ITEM_REJECTED_CONNECTIONS}," echo -n "\"expired_keys\": ${ITEM_EXPIRED_KEYS}," echo -n "\"evicted_keys\": ${ITEM_EVICTED_KEYS}" echo -n "}" 

لقد وضعت هذا البرنامج النصي في الملف /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 .


شكراً لكل من قرأ حتى النهاية ، وخاصةً لأولئك الذين وجدوا شيئًا مفيدًا لأنفسهم في المنشور.

Source: https://habr.com/ru/post/ar485538/


All Articles