اگر برنامهنویس هستید یا در یک شرکت نرمافزاری کار میکنید حتماً اسم پایش (مانیتورینگ) به گوشتان خورده است. امروزه پایش (مانیتورینگ) یکی از بخشهای مهم و پرچالش هر پروژهی نرمافزاری است. در این مطلب به معرفی پایش و مفاهیم آن میپردازیم. ابتدا به اهمیت و لزوم پایش نرمافزارها اشاره میکنیم. سپس مفاهیم آن را بیان میکنیم و در نهایت ابزارهای موجود را معرفی کرده و بهاختصار بررسی میکنیم.

برای اینکه سرویس یا نرمافزار با کیفیتی ارائه دهیم نیاز داریم که همیشه وضعیت سلامت سرویس خود را در اختیار داشته باشیم و بهمحض اینکه مشکلی برای سیستم پیش آمد از آن باخبر شویم و آن را برطرف کنیم. برای ما بهعنوان سرویسدهنده اصلاً خوشایند نیست که کاربر نهایی سرویس متوجه اشکال در سیستم شود یا نتواند از سرویس ما استفاده کند. بسته به نوع نرمافزار یا سرویسی که ارائه میشود، هر لحظه خرابی یا وجود اشکال در سیستم ممکن است خسارتهای زیادی به اعتبار کسبوکار بزند.
برای بازیابی و رفع اشکال و همچنین پیداکردن ریشهی مشکل نیز نیاز داریم تا وضعیت سرویس و زیرساخت را در لحظهی رخدادن حادثه بدانیم. برای مثال باید بفهمیم برنامهی ما به دلیل کمبود پهنای باند دچار حادثه شده است یا به دلیل کمبود حافظه. در زمان حادثه چه تعداد تراکنش در دقیقه را پردازش میکردهایم و ... .
همچنین برای ما بسیار مطلوب است اگر قبل از بروز حادثه و قطع شدن سرویس از آن باخبر شویم. برای مثال با بروز اولین نشانههای خرابی یا کندی و قبل از اینکه سرویس کاملاً از کار بیفتد بتوانیم از آن باخبر شویم و برای آن چارهای پیدا کنیم یا از بروز حادثه جلوگیری کنیم تا کاربر سرویس متوجه مشکل نشود.
علاوه بر همهی اینها برای بهبود کارایی برنامه نیز نیاز داریم تا بهصورت منظم به وضعیت زیرساخت و سرویس دسترسی داشته باشیم. برای مثال میخواهیم نرخ تراکنشهای پردازش شده در ثانیه را بهبود دهیم. برای این کار لازم است بفهمیم که چه منبعی در حال حاضر گلوگاه برنامهی ماست. آیا منابع پردازشی را باید بیشتر کنیم یا اینکه سوئیچهای شبکه را بهبود دهیم؟
پایش کردن نرمافزار میتواند در تمامی موارد گفته شده در بالا به ما کمک کند.
سیستم پایش (monitoring system)، سیستمی است که با جمعآوری و ذخیرهسازی اطلاعات مختلف از سرویسها و نرمافزارهای ما، کمک میکند دید خوبی نسبت به وضعیت سلامتی نرمافزار پیدا کرده و درک خود را از رفتار نرمافزار و اثرات تغییرات خود بهبود دهیم. همچنین این در این سیستم میتوانیم قوانین مختلفی را تعریف کنیم تا درصورتیکه نرمافزار رفتار عادی نداشت به ما هشدار بدهد و ما را از وضعیت نرمافزار در اولین فرصت ممکن مطلع کند.
سنجه (metric)، پایش (monitoring)و هشداردهی (alerting) سه تا از اساسیترین مفاهیم یک سرویس پایش (monitoring systrm) هستند.
سنجه به مقدار اندازهگیری شدهی خامی گفته میشود که قابل جمعآوری از نرمافزار است و معمولاً مصرف یک منبع یا رفتار خاصی در سیستم را نشان میدهد. برای مثال میزان رم استفاده شده توسط نرمافزار یک سنجه است. سنجهها ممکن است سطح پایین یا سطح بالا باشند. برای مثال اطلاعات منابع سیستمعامل یا سرور (رم، سیپییو، حافظه و ...) بهعنوان سنجههای سطح پایین شناخته میشوند. از طرف دیگر سنجههایی عملکرد خاصی در نرمافزار را نشان میدهند مثل تعداد درخواست پردازش شده در دقیقه برای وب سرور یا تعداد کاربران ثبتنامشده در روز بهعنوان سنجههای سطح بالا بهحساب میآیند.
معمولاً سنجههایی که توسط سیستمعامل در اختیار قرار میگیرند از سادهترین و اولین سنجههایی هستند که میتوان جمعآوری کرد. این سنجهها میزان استفاده از منابع فیزیکی را نشان میدهند. ابزارهای پایش معمولاً بلدند با هزینه کم اطلاعات سرورها و زیرساخت را جمعآوری کنند و نشان دهند. همچنین بعضی از آنها بهصورت پیشفرض برای منابع سرور هشدار و قوانینی تعریف کردهاند که میتواند کاربردی باشد و با هزینه کم، پایش خوبی از زیرساخت را فراهم کند.
همچنین بسیاری از پایگاهدادهها و وب سرورها، سنجههای استانداردی را تعریف کردهاند و بهراحتی سیستمهای پایش میتوانند اطلاعات آنها را نمایش دهند. برای برنامههای دیگر باید خود برنامهنویسها سنجههای لازم را تعریف کنند. برای مثال اگر ما در حال نوشتن برنامهی یک فروشگاه آنلاین هستیم، لازم است که سنجههای مختلفی را تعریف کنیم تا وضعیت نرمافزار را نشان دهند. برای مثال تعداد خریدهای انجام شده در دقیقه یا تعداد درخواستهای دارای خطا و ... .
پایش، فرایند جمعآوری، تجمیع و تحلیل مقادیر سنجههای مختلف در سیستم است که آگاهی ما را از مؤلفههای مختلف سیستم بالا میبرد. داده از مکانهای مختلف در سیستم جمعآوری شده در سیستم پایش ذخیره میشوند. اینم سیستم پایش است که مسئول نگهداری دادهها و انجام پرسوجو بر روی آنهاست.
سیستمهای پایش کارهای مختلفی انجام میدهند. اولین وظیفهی آنها جمعآوری و ذخیرهی مقدار فعلی سنجههای مختلف است. با اینکه دانستن مقادیر سنجههای مختلف در حال حاضر قابلیتی کاربردی است اما ما برای استفادهی بهتر نیاز داریم تا بتوانیم مقادیر سنجههای مختلف درگذشته را نیز بدانیم و این وظیفهی سیستم پایش است که مقادیر سنجههای مختلف در گذر زمان را نگهداری کرده و بتواند به ما نشان دهد.
با اینکه دیدن مقادیر عددی سنجههای مختلف کاربردی است اما ما انسانها معمولاً با دیدن نمودارها راحتتر هستیم و اطلاعات بیشتری را میتوانیم از نمودار استخراج کنیم. اغلب سیستمهای پایش امکاناتی برای مصورسازی سنجهها و شخصیسازی آنها دارند که بسیار کاربردی است.
بعضی از سیستمهای پیشرفته امکاناتی مثل پیداکردن الگو بین سنجهها و همچنین کوریلیشن بین آنها را نیز دارند که در سیستمهای پیچیده و بزرگ بسیار کارآمد است. اکثر سیستمهای رایگان دارای چنین قابلیتهایی نیستند.
یکی از قابلیتهای بسیار کاربردی سیستمهای پایش، هشداردهی است. ما میخواهیم که در اولین فرصت ممکن از حادثهها یا وضعیت بد سرویس مطلع شویم. در واقع برنامهنویسها و مسئولان نگهداری هر سرویس باید اولین افرادی باشند که متوجه وضعیت غیرعادی میشوند. به همین دلیل لازم است که سیستم پایش به طور مرتب وضعیت سرویس را بررسی کرده و در صورت لزوم به افراد لازم اطلاع دهد.
معمولاً در سیستمهای پایش این قابلیت وجود دارد که چندین قانون برای هشداردهی تعریف شود. این قوانین برحسب نیاز و به صلاح دید برنامهنویسهای سیستم تعریف میشوند. این وظیفهی سیستم پایش است که این قوانین را مرتب بررسی کرده و درصورتیکه هر قانون برقرار شد هشداری را به افراد لازم بفرستد. با استفاده از این قابلیت مسئولان نگهداری سرویس میتوانند قوانینی طراحی کنند تا درصورتیکه اوضاع سیستم بهصورت غیرعادی بود، هشدار دریافت کنند و هرچه سریعتر مشکل را برطرف کنند.
همچنین سیستمهای پایش میتوانند به جز هشداردهی عملیاتهای دیگری را نیز انجام بدهند. برای مثال اگر تعداد درخواستها زیاد بشود میتوانند به Orchestrator پیام بدهند تا تعداد نرمافزارها را بهصورت اتوماتیک بیشتر کند.
محتوای هشدارهایی که به افراد ارسال میشوند باید بهگونهای باشد که مشخص کند چه چیزی مشکل پیدا کرده و کجا باید دنبال مشکل بگردند. یکی از چالشهای موجود در این حوضه این است که چگونه در عین تعریف هشدارهای کم به نتیجهی مطلوب دست پیدا کنیم. برای مثال اگر ما 1000 سرور داشته باشیم و شبکهی کلاستر برای مدتی قطع شود ممکن است 1000 هشدار ارسال شود و افراد را اذیت کند. به همین دلیل یکی از قابلیتهای سیستمهای پایش alert correlation است. با این قابلیت سعی میشوند هشدارهایی که به هم مربوط هستند شناسایی شوند و تعداد هشدارها کم بشود. برای مثال اگر هشدار قطع شدن نتورک کلاستر به وجود آمد دیگر بهازای تکتک سرورها نباید هشدار بیاید.
در پروژههای نرمافزاری بهتر است که از همان اول به فکر پایش آن باشیم و نرمافزار را با این دید طراحی کنیم. اضافهکردن پایش به سیستمی که با این دید طراحی نشده است ممکن است کار پرهزینه و سختتری باشد. همچنین اضافهکردن پایش از همان اول به ما کمک میکند سیستم را بهتر تحلیل کنیم و دید مناسبی از فرایند توسعه و پیشرفت آن داشته باشیم.
زبیکس یکی از قدیمیترین سیستمهای پایش متنباز است که هستهی اصلی آن با زبان C نوشته شده است و فرانتاند آن با PHP کار میکند. زبیکس درگذشته بسیار محبوب بود اما با آمدن ابزارهای جدید و پردازشهای ابری از محبوبیت آن کاسته شد. زبیکس برای ذخیرهسازی سازی داده از RDBSها استفاده میکند و همین یکی از دلایلی است که بهخوبی scale نمیشود و نمیتواند روی دادههای بسیار حجیم با سرعت خوبی کار کند. نکتهی قوت زبیکس UI بسیار کامل و جذاب آن است بهگونهای که تمامی تنظیمات از طریق یوآی قابل انجام است و همچنین نمودارهای خوبی میکشد. در زبیکس مؤلفهای وجود دارد به اسم Zabbix agent که بر روی سرورهای مختلف نصب میشود و زبیکس میتواند از ایجنت خود دادههای آن سرور را دریافت کند. یکی دیگر از مزیتهای زبیکس نداشتن قابلیت query زدن ساده بر روی تمامی سنجهها هست.
پرومتئوس یکی از ابزارهای قدرتمند، معروف و متنباز موجود برای پایش است. این ابزار در ابتدا در شرکت SoundCloud ساخته شد و اکنون بهصورت مستقل و متنباز توسعه داده میشود. در اصل پرومتئوس ازروی سیستم مانیتورینگ گوگل به اسم Borgmon ساخته شده است و با زبان Go برنامهنویسی شده است. این سیستم در حال حاضر یکی از بهترین گزینههای رایگان برای پایش است. پرومتئوس دیتابیس time-series مخصوص خودش را دارد و دادهها را با فرمت خودش ذخیره میکند. یکی از مزیتهای این کار این است که پرومتئوس به نسبت زبیکس پرفورمنس بسیار بهتری را ارائه میدهد و دادههای بیشتری را میتواند ذخیره کند. همچنین پرومتئوس زیان پرسوجوی مخصوص به خود به اسم PromQL را ارائه داده است که اجازه میدهد بر روی تمامی متریکها پرسوجو انجام شده و آنها را بهصورت سرپایی بررسی کنید. این قابلیت یکی از مزیتهای بسیار جدی پرومتئوس به نسبت زبیکس است.
پرومتئوس با پروتکل HTTP کار میکند و بهطورکلی pull-based است. این ابزار برای جمعآوری نیاز دارد تا مؤلفههای مختلف روی port مشخص و با فرمت مشخص شده با پروتکل HTTP سنجههای خود را ارائه دهند. پرومتئوس بر اساس کانفیگ انجام شده هرچند لحظه یکبار این اندپوینتها را بررسی کرده و آخرین سنجهها و مقادیر آنها را ذخیره میکند.
خیلی از برنامهها بهصورت پیشفرض اندپوینتی مخصوص پرومتئوس دارند اما برای آنهایی که بهصورت پیشفرض اندپونت پرومتئوس ندارند باید برنامهای به اسم exporter نوشته شود تا مقادیر را از برنامهی لازم گرفته و به فرمت لازم ارائه دهد. یکی از نقاط قوت پرومتئوس داشتن کامیونیتی قوی و exporterهای زیاد است.
همچنین پرومتئوس یک exporter به اسم node_exporter دارد که روی سرور نصب میشوند و میتواند سنجههای بسیار کاملی را از سرور ارائه دهد. علاوه بر همهی اینها پرومتئوس مؤلفهای به اسم alertmanager دارد که وظیفهی آن مدیریت هشدارها و ارسال هشدارها به افراد است. همچنین این مؤلفه میتواند هشدارها را گروهبندی کند و هشدارهای تکراری را حذف کند یا رابطهی بین هشدارها را گرفته و بر اساس آن تشخیص بدهد چه هشداری را باید ارسال کند.
شرکت همروش یکی از شرکتهای موجود در ایران است که خدمات ابری ارائه میدهد. بر اساس اطلاعات ارائه شده در سایت این شرکت، نرمافزارهای استقراریافته در پلتفرم این شرکت با استفاده از پرومتئوس پایش میشوند و کاربران نیز میتوانند از این اطلاعات استفاده کنند. همچنین این شرکت سرویس آپداموس را نیز ارائه میدهد که برای مانیتور کردن وبسایتها و بالا بودن آنهاست.
شرکت سحاب پرداز نیز از دیگر شرکتهایی است که در این زمینه فعال است. این شرکت در حوزهی big data فعالیت میکند و با تجربهی چندینساله در پایش سرورها میتواند خدمات مشاورهای خوبی در این زمینه ارائه دهد.
در این مقاله به معرفی پایش و اهمیت آن پرداختیم و با مفاهیم اصلی آن آشنا شدیم. همچنین به معرفی دوتا از ابزارهای بسیار معروف در این حوزه پرداختیم و نقاط قوت و ضعف هرکدام را بررسی کردیم. در نهایت دوتا از شرکتهای نرمافزاری ایران که در این حوزه فعال هستند را معرفی کردیم.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است.
https://www.digitalocean.com/community/tutorials/an-introduction-to-metrics-monitoring-and-alerting
https://www.ibm.com/cloud/learn/application-performance-management