اگر شما ارائهدهندهی سرویسی باشید، احتمالاً مانیتورینگ به گوشتان خوردهاست. در ارائهی یک سرویس، مثل یک سایت، فقط توسعهی محصول و بالابردن آن روی سرورها نیست که اهمیت دارد، بلکه مراقبت از آن و همچنین بررسی عملکرد و یافتن ایرادات آن نیز بسیار مهم است. تا در صورت بروز مشکل، حتما اقدامات لازم انجام شود.
پارامترهایی که باید بررسی شوند، آنقدر زیادند که مراقبت از همهی آنها کاری سخت و حتی غیرممکن است. پس نیاز به فرایندهایی خودکار برای انجام اینکارها داریم. فرایندهایی که به آنها «مانیتورینگ» گفته میشود. در این نوشته قصد داریم به مفاهیم کلی مانیتورینگ بپردازیم و سپس یک سناریوی ساده مانیتورینگ را با استفاده از ابزارهای مطرح، مثل پرومتئوس، گرافانا و … پیاده کنیم.
در مانیتورینگ ابتداییترین گام، دریافت دادهها از ابزارها و سرویسهاییست که میخواهیم بر آنها نظارت کنیم. این دادهها میتوانند میزان RAM پر شدهی سرورها، درصد CPU اشغال شدهی سرور، تعداد کوئریهای موفق ۱۰ دقیقهی گذشتهی دیتابیس، میزان رم مصرفی هر کدام از سرویسها (اعم از بکاند، دیتابیس، کش و …..)، یا میانگین زمان مورد نیاز برای پاسخگویی بکاند به درخواستها باشد.
به این دادهها که به روشها و با ابزارهای متفاوتی (بسته به نوع سرویسی که میخواهیم دادههای آن را دریافت کنیم) قابل دریافت هستند، سنجه (metric) گفته میشود. متریکها به صورت key-value هستند. کلید نشاندهندهی این است که این داده چه چیزی را نشان میدهد و مقدار نشاندهندهی عدد مربوط به متغیّر در لحظهی دریافت دادهها است.
همانطور که پیشتر اشاره شد، گرفتن دادهها برای سرویسهای مختلف اندکی متفاوت است.
روال کلی این است که با استفاده از سرویسهایی، دادههای موردنیاز را دریافت کنیم و سپس در یک جا تجمیع کنیم. به این سرویسها که وظیفهی دریافت متریکها از Backend, Database و ….. را دارند، اکسپورتر (exporter) گفته میشود. به طور مثال، خروجی یک اکسپورتر به شکل زیر خواهد بود:
خطهایی که قبل از آنها علامت # آمدهاست، کامنتهایی هستند که توضیحاتی در مورد متریک میدهند.
برای ابزارهای پرکاربرد مثل دیتابیسها، سرویسهای کش و حتی فریمورکهای بکاندی، اکسپورترهای آماده وجود دارند. فهرستی از این اکسپورترها از طریق این لینک قابل مشاهده و دسترسی هستند.
بعد از این که برای سرویسهای مختلف، با استفاده از اکسپورتر مخصوص آنها، متریکها ساخته شدند، باید همهی آنها در جایی تجمیع شوند. Prometheus وظیفهی این کار را بر عهده دارد.
پرومتئوس(Prometheus) یک جعبه ابزار متنباز نظارت و هشدار است که در ابتدا در SoundCloud ساخته شد. پرومتئوس با استفاده از یک کانفیگفایل، آدرس اکسپورترها را میفهمد و از آنها متریکها را دریافت میکند. همچنین پرومتئوس با استفاده از یک زبان به نام PromQuery، امکان اعمال فرمول روی متریکها را میدهد. مثلا میتوان یک متریک را در متریک دیگری ضرب کرد، از یک متریک در یک بازهی زمانی میانگین گرفت و یا مشتق یک متریک (روی یک بازهی زمانی) را محاسبه کرد. در نهایت، با استفاده از این تغییرات، میتوان به مقادیری رسید که قرار است آنها را مانیتور کنیم. یک نمونه از فایل کانفیگ پرومتئوس در پایین قابل مشاهده است:
در این فایل کانفیگ، یک مسیر به عنوان مسیر فایلهای rule تعریف شدهاست. این فایلها، برای تعریف alertها هستند. به این مسئله جلوتر میپردازیم. بعد از آن، یک node_exporter تعریف شده و آدرس آن در قسمت targets مشخص شدهاست. توجهکنید که عموما اکسپورترها روی آدرس /metrics متریکها را میدهند. پرومتئوس به طور پیشفرض به این آدرس درخواست ارسال میکند. در قسمت بعد فایل کانفیگ هم یک alertmanager مشخص شده که وظیفهی مدیریت و ارسال الرتها در کانالهای مختلف را بر عهده دارد.
پرومتئوس همچنین یک پنل مدیریتی ساده را ارائه میکند که میتوان برخی اطلاعات جزئی را در آن مشاهده کرد. البته قابلیت رسم نمودار به طور ساده را نیز دارد که معمولا به خاطر سادگی و دلایل دیگر، برای این کار از پرومتئوس استفاده نمیشود. مگر برای تستهای کوچک روی محیطهای غیر پروداکشن. در پنل مدیریتی پرومتئوس، میتوان اکسپورترهایی که پرومتئوس از آنها متریک میگیرد را مشاهده کرد:
همانطور که در تصویر مشخص است، اکسپورتر دوم (cadvisor)، در دسترس نیست و به هر دلیلی، پرومتئوس قادر به دریافت متریکها از آن نیست.
حالا که همهی متریکها در یک جا تجمیع شدهاند، میتوانیم روی آنها کارهای متفاوتی انجام دهیم. دو مورد که در این نوشته میخواهیم به آنها بپردازیم رسم نمودار و ایجاد الرت و ارسال آنها در کانالهای مختلف است.
همانطور که پیشتر اشاره شد، پرومتئوس هم امکان ساخت گراف را دارد، اما امکانات آن کافی نیستند. اینجاست که گرافانا به میدان میآید. گرافانا ابزاریست که با یک پنل گرافیکی که کار با آن هم چندان سخت نیست، امکان ساخت انواع و اقسام چارتها را به ما میدهد. البته قابلیتهای آن در این خلاصه نمیشوند، اما سایر امکانات آن در حوصلهی این نوشته نیست.
ساخت نمودار در گرافانا سادهاست. ابتدا در بخش تنظیمات، آدرس پرومتئوس را به گرافانا میدهیم، سپس یک داشبورد میسازیم و نهایتا هر بلایی که میخواهیم سر متریکها میآوریم تا نمودارهای مختلفی تولید کنیم. در گرافانا هم داشبوردهای آماده مختلفی توسط اشخاص مختلف ساخته شده و در دسترس عموم قرار گرفتهاست. به این صورت شما میتوانید با import کردن یکی از این داشبوردها و اعمال تغییرات مورد نظر خود روی آن، به داشبورد ایدهآل خود برسید. تصویر یک داشبورد که برای مانیتور یک بکاند جنگویی ایجاد شده در زیر قابل مشاهدهاست:
یکی از اصول و اهداف مهم مانیتورینگ، این است که همیشه قبل از وقوع فاجعه، از آن خبردار شویم و اقدامات لازم را انجام دهیم. به طور مثال، اگر قرار است با روند فعلی، هفتهی دیگر دیسک یکی از سرورها پر شود، یک هفته زودتر خبردار شویم تا اقدامات لازم را انجام دهیم. یا قبل از این که رم سرور کاملا پر شود و عملا از کار بیافتد، متوجه بروز مشکل شویم و یا سرویسی که مموری لیک دارد را پیدا کنیم. همهی اینها و دلایل متعدد دیگر، لزوم یک سیستم الرتینگ مناسب را نشان میدهند.
پرومتئوس با استفاده از زبان مخصوص خود، یعنی PromeQuery، امکان اعمال فرمولهایی روی متریکها را میدهد. پس میتوان با استفاده از این فرمولها، مقادیری را پیشبینی و روند تغییر یک متریک را بررسی کرد.
در قسمت پایین، میتوان ایجاد یک الرت را مشاهده کرد. در این الرت، تعداد کانکشنهایی که به دیتابیس Postgresزده شدهاست را بررسی کردهایم. اگر این تعداد از ۸۰ درصد مقدار حداکثر کانکشنهای ممکن برای پوستگرس بیشتر باشد، یک الرت تولید و یا اصطلاحا fire میشود.
الرتهای فایر شده، به الرتمنیجر سپرده میشوند تا در مورد آنها تصمیمگیری شود. الرتمنیجر، وظیفهی ارسال، گروهبندی و روتینگ الرتها را بر عهده دارد.
یک نمونه از کانفیگ الرتمنیجر:
این الرتمنیجر، الرتها را برای آدرس که مشخص شده، یعنی پورت ۸۲۸۲ روی لوکالهاست ارسال میکند. میتوان وبهوکهای مختلفی برای الرتمنیجر مشخص کرد. به طور مثال، این وبهوک میتواند مربوط به یک بات تلگرام باشد که الرتها را روی تلگرام برای شما ارسال میکند. یک نمونه از الرتهای ارسالی روی تلگرام:
این الرت نشان میدهد که سرویس cadvisor در دسترس نیست. (همانطور که در تصویر اول از تارگتهای پرومتئوس مشاهده کردیم).
فرمت پیامی که ارسال میشود نیز قابل تنظیم است. یکی از باتهای تلگرام که برای اتصال به الرتمنیجر قابل استفادهاند، از صفحهی گیتهاب این بات تلگرام (alertmanager bot) قابل دسترسیست. البته میتوان الرتها را روی کانالهای متفاوتی فرستاد. فقط به یک وبهوک نیاز است که در تنظیمات الرتمنیجر قرار دادهشود. دیسکورد، اسلک و ابزارهای مشابه، همگی امکان ایجاد یک وبهوک برای ارسال پیام روی آنها را دارند.
پیشتر گفتیم که گرافانا نیز امکان ایجاد الرت را به ما میدهد. الرتها در گرافانا به طور گرافیکی قابل ساخت هستند که در مواقعی میتوان از این قابلیت آنها نیز استفاده کرد.
این مطلب توسط محمدحسین بهمنی در بلاگ راهبردهای خلاق آرمان نوشته شده است.