اخیراً، Prometheus به استانداردی برای نظارت بر (monitoring) برنامه‌ها در فضای فناوری تبدیل شده است. به نظر شما ابزار Prometheus دقیقاً چیست؟ در طول این مقاله، به موضوعات فرعی مختلف برای کمک به پاسخ به این سؤال (از ابتدا تا معماری و نحوه دقیق عملکرد) پرداخته شده است. علاوه بر این به ابزارهای مختلفی که می‌توان در کنار Prometheus استفاده کرد، و اینکه چرا Prometheus یک ابزار عالی برای نظارت بر این برنامه‌ها است، اشاره شده است.

 

به منظور شروع کار با Prometheus می‌توانید از مرورگر Prometheus Expression Browser استفاده نمایید:

 

Prometheus معمولاً در کنار Grafana استفاده می‌شود. Grafana یک ابزار تجسم سازی است که معیارهای Prometheus را دریافت کرده و عملیات مانیتورینگ را آسان‌تر می‌نماید. اغلب، وقتی مردم در مورد مانیتورینگ Prometheus خود صحبت می‌کنند، به ویژه هنگامی‌که صحبت از تجسم سازی است، مشابه زیر به نظر می‌رسد:

 

MetricFire، یک پلت فرم Prometheus میزبانی شده است؛ بنابراین اگر می‌خواهید Prometheus را خودتان بررسی کنید، می‌توانید بصورت دوره آزمایشی رایگان MetricFire وارد سیستم شوید! شما می‌توانید معیارها را به پلت فرم MetricFire ارسال کرده و آن‌ها را در داشبوردهای Grafana تجسم سازی نمایید.

 

تاریخچه Prometheus

در سال 2012، پس از کشف اینکه معیارها و ابزارهای نظارتی استفاده شده (StatsD و Graphite) برای نیازهای مانیتورینگ کافی نیست، Prometheus به عنوان یک پروژه منبع باز در SoundCloud شروع به کار کرد. این ابزار با الهام از ابزار مانیتورینگ Borgmon در Google ایجاد شد.

به عنوان مثال، آن‌ها به یک مدل داده چند بعدی، عملکرد ساده، جمع آوری داده‌های مقیاس پذیر و یک زبان پرس و جوی قوی نیاز داشتند. آن‌ها Prometheus را ساختند تا همه این ویژگی‌ها را در یک ابزار واحد ارائه دهند. ابزار حاصله آنقدر موفق شد که در سال 2016 در بنیاد محاسبات CloudNative به عنوان دومین پروژه پس از Kubernetes پذیرفته شد.

 

معماری Prometheus

Prometheus از اجزای متعددی تشکیل شده است که هریک عملکرد خاصی را برای بهبود مأموریت مانیتورینگ و هشدار Prometheus ارائه می‌کنند. این اجزا عبارتند از:

سرور Prometheus: این عنصرکه مغز سیستم است، معیارها را در قالب داده‌های سری زمانی از نودها جمع آوری کرده و آن‌ها را ذخیره می‌نماید. فرآیند جمع آوری معیارها را scraping می‌نامند.

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

به عنوان مثال، فرض کنید راهی را برای دنبال کردن تعداد درخواست‌های http برای صفحات مختلف برنامه خود (با توجه به مسیر آن‌ها) می‌خواهید. یکی از راه‌ها برای انجام این کار، ایجاد معیارهای متعدد است که هریک مربوط به هر مسیر (به عنوان مثال http_requests_login_total ،http_requests_logout_total ،http_requests_adduser_total ،http_requests_comment_total به ترتیب برای پیگیری درخواست‌های http به صفحه نظردهی، صفحه addUser، صفحه خروج و صفحه ورود) است. در شرایطی که کل درخواست‌های http از برنامه خود را میخواهید، این کار دشوار می‌شود؛ زیرا در این صورت باید هر یک از مسیرهای برنامه خود را بشناسید و همه معیارهای آن‌ها را درخواست نمایید. با این حال، با استفاده از برچسب‌ها، شما می‌توانید یک معیار واحد تنظیم کنید، به عنوان مثال برای http_requests_total، برچسب "path" را بصورت http_requests_total{path = "/login"} می‌توانید اضافه نمایید. این به شما این امکان را می‌دهد که کل درخواست‌ها را به سادگی با حذف برچسب "path" از کوئری درخواست کنید، یا یک صفحه خاص را به سادگی با افزودن مسیر به آن صفحه در قالب توضیح داده شده در بالا، درخواست نمایید.

 

این مطلب نیز ممکن است برای شما مفید باشد: مشاهده وضعیت سرویس در لینوکس با استفاده از systemctl

 

سرور Prometheus به طور فعال معیارها را از برنامه‌هایی دریافت (scrape) می‌کند که در فواصل زمانی متغیر (scrape interval) مانیتور می‌نمایند، برخلاف دیگر ابزارهای مشابه Graphite که به طور غیر فعال منتظر می‌مانند تا برنامه‌ها معیارهای خود را وارد کنند. این مدل، کلاینت‌هایی با بیشترین workload را داراست؛ زیرا سرور Prometheus تمام کارهای سنگین را انجام می‌دهد. تنها کاری که باید انجام شود، این است که معیارهای خود را به گونه‌ای نشان دهند که سرور Prometheus بتواند به آن دسترسی داشته باشد. آن‌ها این کار را با افشای یک نقطه پایانی HTTP (معمولاً metrics/) انجام می‌دهند، که لیست کامل معیارها (با مجموعه برچسب همراه) و مقادیر آن‌ها را برمی‌گرداند.

کتابخانه(library)ها و استخراج کننده(Exporter)های کلاینت: قبلاً ذکر کرده‌ایم که کلاینت‌ها باید معیارهای خود را برای Prometheus مشخص کنند؛ اما این داده‌ها باید در قالبی باشند که Prometheus درک می‌کند. Prometheus، داده‌ها را در قالب سری زمانی ذخیره می‌کند و تنها داده‌هایی با آن فرم را می‌پذیرد. بنابراین، معیارهای نشان داده شده توسط کلاینت‌ها باید در این قالب باشد تا Prometheus بتواند عملیات scarpe را انجام دهد. با این حال، معیارهای قالب دهی شده در سری‌های زمانی معمولاً از برنامه‌ها ایجاد نمی‌شود. به طور معمول ابزارهایی که این نوع معیارها را تولید می‌کنند باید به صورت دستی اضافه شوند. بسته به اینکه شما می‌توانید کد منبع برنامه مورد نظر (برای ارسال معیارهای آن به Prometheus) را کنترل کرده و تغییر دهید یا خیر، این کار به دو طریق قابل انجام است.

در صورتی که کد منبع را کنترل می‌نمایید، با اضافه کردن چند خط کد می‌توانید معیارهای مورد نظر خود را با استفاده از کتابخانه‌های کلاینت Prometheus در فرآیندی به نام direct instrumentation تعریف و اضافه کنید. کتابخانه‌های کلاینت همه جزئیات ضروری مانند bookkeeping  یا thread-safety را بررسی نموده و معیارهای شما را در قالب قابل درک برای Prometheus تولید می‌کند. بدین صورت کار بسیار کمی برای کاربر باقی می‌گذارد. بیشتر کتابخانه‌ها نیز بسته به محیط runtime و کتابخانه مورد استفاده، معیارهای خاصی مانند مصرف CPU و جمع آوری زباله را ارائه می‌دهند.

در مواردی که هیچ کنترلی بر کد منبع ندارید، direct instrumentation کاربردی نیست. به عنوان مثال، زمانی که شما اطلاعات معیارها را در مورد هسته لینوکس را بخواهید. اگرچه هسته احتمالاً مکانیزمی برای خروج اطلاعات معیارها دارد؛ اما بعید است که این داده‌ها در فرمت قابل درک برای Prometheus باشند. در چنین مواردی نمی‌توانیم از کتابخانه‌های کلاینت برای استخراج معیارها استفاده کنیم؛ زیرا به کد منبع هسته لینوکس دسترسی نداریم. برای این حالت، می‌توان از Exporterها (استخراج کنندگان) استفاده کرد. Exporterها، بخش‌هایی از نرم افزار هستند که شما می‌توانید در کنار برنامه‌های کاربردی دارای معیارهای مورد نظر بکار ببرید.

 

Push Gateway: اگر jobهای کوتاه مدت یا دسته‌ای دارید که طول عمر آن‌ها کم‌تر از فاصله scrap است. جمع آوری معیارها چگونه خواهد بود؟ به این معنا که job مورد نظر شما شروع به کار می‌کند و قبل از اینکه Prometheus فرصتی برای scrape برروی معیارها داشته باشد، به پایان می‌رسد. پس چگونه معیارهایی برای چنین jobهایی جمع آوری می‌کنید؟ Push Gateway راه حل آن است! Prometheus Push Gateway تنها برای این ایجاد شده است که به jobهای کوتاه مدت اجازه دهد، معیارهای خود را در معرض Prometheus قرار دهند. از آنجا که این نوع jobها ممکن است به اندازه کافی برای Prometheus بصورت طولانی وجود نداشته باشند تا آن‌ها را scrape نماید، آن‌ها می‌توانند معیارهای خود را به Push Gateway (که به عنوان یک حافظه پنهان (cache) معیار عمل می‌کند) منتقل کنند. سپس push Gateway، معیارها را به اندازه کافی نگه می‌دارد تا Prometheus بتواند برروی آن‌ها scrap انجام دهد.

هشدار دهنده(Alertmanager): اگرچه Prometheus بیشتر به جمع آوری معیار خود شناخته می‌شود؛ اما اگر این اقدامات سریع انجام نشود، همه این داده‌ها بی فایده خواهند بود. Prometheus Alertmanager به شما امکان می‌دهد هشدارهای خود را برروی معیارهای جمع آوری شده تعریف کنید تا در صورت هرگونه ناهنجاری یا مغایرت در داده‌های جمع آوری شده به شما اطلاع داده شود. Alertmanager را می‌توان به گونه‌ای پیکربندی کرد که هشدارهایی با نوع یکسان را گروه بندی کرده و آن‌ها را بر اساس سایر هشدارها فعال نمایید. به عنوان مثال، یک هشدار فعال شده نشان می‌دهد که یک کلاستر خراب شده است. بر این اساس، Alertmanager می‌تواند پیکربندی شود تا همه هشدارهای دیگر از آن کلاستر و بسیاری از موارد پیشرفته دیگر را فعال نماید. با استفاده از ادغام‌های مختلف موجود، از ابزار مدیریت هشدار می‌توان برای ارسال مستقیم هشدارها از طریق SMS، ایمیل، Slack ،PagerDuty و غیره استفاده کرد.

تجسم سازی (visualization): معیارهای جمع آوری شده توسط Prometheus به صورت محلی در پایگاه داده سری زمانی ذخیره می‌شوند. با کمک زبان پرس و جوی Prometheus (یا PromQL)، کاربر می‌تواند داده‌های سری زمانی موجود را بصورت زمان واقعی (real time) انتخاب و جمع آوری کند. نتیجه این کار را می‌توان به صورت نمودار یا داده جداول در مرورگر Prometheus Expression نشان داد یا برای ایجاد یکپارچه سازی تجسم خارجی از طریق استفاده از یک API HTTP استفاده کرد. یکپارچه سازی خارجی انتخاب برای تجسم سازی Prometheus، همان Grafana خواهد بود.

با این حال، از آنجا که Prometheus یک پروژه منبع باز است، شما باید هر یک از این اجزا را به صورت دستی تنظیم کرده و آن‌ها را حفظ نمایید تا مطمئن شوید که آن‌ها مقدار توصیف شده در بالا را ارائه می‌دهند. به منظور امتحان نسخه‌ای از Prometheus که برروی cloud قرار دارد، یک نسخه demo درخواست دهید و یا اینکه از free trial استفاده کنید.

 

کاربردهای Prometheus

Prometheus، اخیراً به عنوان نرم افزار مانیتورینگ شهرت یافته است. سهولت استفاده، تطبیق پذیری و گزینه‌های یکپارچه سازی، آن را در بین دیگر نرم افزارهای نظارت و هشدار برجسته کرده است. این به خوبی با IoT، نظارت ابری و به طور کلی هر مورد نظارت دیگری مناسب است. با همه این‌ها، تنها موقعیتی که Prometheus در آن رشد نکرده است، در مورد جمع آوردی معیارهای مبتنی بر روش push است که البته راه حل‌هایی برای آن ارائه شده است.

اگرچه Prometheus دارای Push gateway برای کنترل معیارهای مبتنی بر روش push است، با این حال Pushgateway قادر به تبدیل Prometheus به یک سیستم نظارت مبتنی بر push نیست. بلکه (همانطور که در بالا توضیح داده شد) تنها هدف آن این است که به عنوان نوعی حافظه پنهان (catch) برای jobهای کوتاه مدت عمل کند.

 

 

 

منبع:

metricfire