Professional Documents
Culture Documents
ماینیتوریگ Web API با Prometheus و Grafana - بخش 1 - ویرگول
ماینیتوریگ Web API با Prometheus و Grafana - بخش 1 - ویرگول
ir/xddzt
ویرگول -جایی برای نوشتن و خواندن
امروزه پایش لحظه ای سرویسهای نرم افزاری و اعالم سریع مشکالت به وجود اومده به گروه هدف (یه چیزی شبیه سیستم
های اعالن خطر) جز بخش بسیار مهم سرویس های نرم افزاری هستش چرا که تشخیص سریع مشکل باعث صرفه جویی در
وقت و هزینه مالکان و ذینفعان سرویس خواهد شد .البته سیستم های مانیتورینگ مزایای خیلی بیشتری هم دارند که در
ادامه باهاشون روبرو خواهیم شد.
کارهایی که در طی این مقاله انجام میدیم اینطوریه که قراره چند تا instanceاز یه Web APIبیاریم باال و یه سری Metric
شبه واقعی برای مانیتورینگ سرویسمون تعریف کنیم ،بعدش اونها رو بفرستیم روی ( Prometheusدر واقع Prometheus
اونها رو از ما بگیره و ذخیره کنه) و به کمک Grafanaیه سری داشبورد مانیتورینگ برای سرویس(ها) بسازیم .برای اینکه شما
درگیر راه اندازی سرویس ها نشید و بعد از مباحث ابتدایی بریم سراغ کوئری و داشبوردهای Prometheusکافیه فایل
docker-composeرو باال بیارید و اتفاقاتی که افتاده رو ببینید ،البته سورس کل کارها و توضیحات مراحل کار هم اینجا
نوشته میشه که برای درک بهتر کارهای انجام شده میتونه کمک کنه.
همه چیزهایی که گفتم توی گیتهاب این مقاله گذاشتم و میتونید ببینید و اگر براتون مفید بود بهش ستاره بدید.
بعد از دریافت سورس از گیت با این دستور از روت پروژه ،سرویس ها pullو runخواهند شد .اگه مشکلی با docker-
composeداشتید این لینک رو ببینید
1- VS Code
2- Docker
کار با Grafanaو ساختن داشبورد روی یک مسئله شبه واقعی نزدیک به دنیای واقعی
من راجع به دیتابیس های Time Serieمثل Prometheusو InfluxDBو شبیه اینها زیاد نمینویسم چون راجع بهشون
مقاله زیاد نوشته شده ولی به یک سری مسائل اصلی در موردشون اشاره میکنم ،البته با محوریت Prometheus
قبل از اینکه یکم بحث رو فنی کنیم لطفا به این دو تا مثال توجه کنید:
به ساعت هوشمندی که دارین دقت کنید ،اونها ضربان قلب شما رو در هر لحظه نشون میدن ،حاال اگر بخوایم
مقادیر ضربان رو در بازه زمانی طوالنی مدت ذخیره کنیم (مثال یک ماه) ،باید در چه ساختاری ذخیره کنیم؟
یک ُبعد اصلی به نام زمان داریم ( )Keyو یک مقدار داریم به نام تعداد ضربان ( .)Valueدر واقع در یک زمان
مشخص یک مقدار برای تعداد ضربان وجود داره .احتماال شما رو به یاد یکی از ساختارهای نگهداری داده میندازه
عالوه بر این شاید بخوایم یک سری اطالعات دیگه رو در کنارش نگهداری کنیم ،مثال شهری که االن توش هستیم ،و
اینکه در چه حالی هستم (خواب ،بیداری ،پیاده روی ،ورزش)
و در پایان هم میخوایم گزارش تهیه کنیم یا ماینتور کنیم
:
.1میانگین ضربان قلب اون فرد در یک شهر ساحلی یا در یک شهر کوهستانی چقدر هستن
.
.2نرخ کاهش یا افزایش ضربان قلب در ساعات شروع خواب ،عمق خواب و پایانی خواب به چه صورت هستن
.
.3نرخ ضربان قلب در یک ساعت اخیر چقدر بوده است.
. . . .
امروزه ساعت های هوشمند و حتی گوشی ها قدم های شما را هم ثبت می کنند و به شما گزارش می دهند در طول
یک روز چند قدم برداشتید
.
به چه روشی این دیتا ها رو ذخیره کنیم که بتونیم هم روی این اطالعات مانیتورینگ انجام بدیم و هم گزارشاتی مانند
مواردی که باال گفتم رو تهیه کنیم
آیا RDBMSهای مثل MySQLو MSSQLبرای نگهداری و گزارش گیری این نوع اطالعات مناسب هستند؟ در واقع Time
Serie Databaseها برای چنین استفاده هایی طراحی و بهینه سازی شده اند و Prometheusیکی از اونهاست.
- 3چه اطالعات اضافه ای در کنارش ذخیره می شود؟ مثال شهر ،وضعیت فرد (خواب ،بیدار و .)...به مواردی که در کنار
متریک ذخیره می شوند Labelیا Tagمیگیم.
بطور خالصه میشه گفت برای یک Valueعالوه بر زمان یک سری Tagیا labelهم میشه ذخیره کرد.
ضربان قلب در تاریخ 14:17:25.1000 2021/07/14در شهر شیراز و وضعیت خواب 103ثبت شده است.
در کل باید گفت در Time Serie Databasesمحور اصلی و کلید زمان هستش ،به این تصویر توجه کنید:
همونطور که در این تصویر میبینید ،ما یه سری نقطه زمانی داریم از t0تا t6که در هر کدوم از این زمان ها اطالعات متریک
ها ذخیره میشه ،مثال تعداد درخواستهای سرچی که تا لحظه t3وارد اپلیکیشن اندروید شده (سطر اول از پایین) 18تا
هستش که تا زمان t5این عدد به 22میرسه یعنی در ( )t5 - t3ثانیه 5تا درخواست سرچ جدید روی سرویس اندروید اومده
.
یه نکته هم که اهمیت داره بدونید اینه که در Prometheusیه مفهومی داریم به اسم Scrapeکه با کانفیگ کردن اون
مشخص میکنیم اطالعات متریک ها هر چند ثانیه از Exporterها گرفته بشه و ذخیره بشه .حاال باید ببینیم Exporterها
چیا هستن؟ اما قبلش معماری کلی رو ببینیم:
معماری Prometheus
روش :Pullدر این روش هر سرویسی که قراره اطالعات متریک هاشو در اختیار Prometheusقرار بده به عنوان یک
Exporterمعرفی میشه و مقادیر متریک ها رو در یک قالب مشخص ایجاد میکنه و Prometheusدر بازه های مشخصی
اطالعاتشو میخونه ( )Scrapeو ذخیره میکنه.
روش :Pushدر این روش هر سرویس مقادیر متریک هاشو برای Pushgatewayمیفرسته و Prometheusبا
Pushgatewayهم مثل یک Exporterبرخورد میکنه و اطالعات رو در بازه زمانی مشخص ازش میخونه .البته ما در این
پروژه از روش Pullاستفاده خواهیم کرد.
نکته جذاب تر اینه که کتابخانه های جانبی زیادی وجود دارند که برای انواع مختلف سرویس ها Exporterارائه میکنند .مثال
شما اگر بخواین از بخشی اطالعات موجود در MSSQLدر Prometheusاستفاده کنید میتونید سرچ کنید و Exporter
مناسب رو پیدا کنید ،یا اگر بخواین سیستم عامل ویندوز رو مانیتور کنید میتونید از Windows Exporterاستفاده کنید.
تقریبا برای اکثر سرویس های مهمی که میشناسید Exporterوجود داره و میشه به سادگی به Prometheusمتصلش کرد.
یکی از بخش های دیگه Alertmanagerهستش که وظیفه ی ارسال هشدار ها از طریق ایمیل ،اسلک ،اس ام اس و ...رو
داره.
پرومتئوس از Service Discoveryبرای شناسایی Targetها و بررسی upیا downبودن اونها استفاده میکنه که امکان
Integrateشدنش با Kubernetes، Consulوجود داره.
از ابزارهایی مثل Grafanaهم برای نمایش اطالعات روی نمودار و داشبورد استفاده میشه Prometheus .یه HTTP Server
هم داره که از طریق اون کوئریها رو دریافت میکنه و خروجی مورد نیاز رو به گرافانا یا هر APIدیگه ای ارائه میده ،این کوئری
ها به زبان PromQLهستن که در ادامه باهاش آشنا میشیم
یک Counter .یک شمارنده ست که مقدارش در گذر زمان افزایش پیدا میکنه ،برای مثال تعداد درخواستها وارد شده به
سرویس به ازای هر درخواست جدید که وارد سرویس میشه یک واحد افزایش پیدا میکنه .مقادیر یه شمارنده همیشه
افزایشی است
.....10-9-8-7-6-5-4-3-2-1 :
1
# TYPE application_request_counter gauge
2 "application_request_counter{endpoint="product-detail-page",responsecode="200
مثال باال به این معناست که برای Endpointجزئیات محصول با پاسخ 200تا این لحظه 532تا درخواست وارد سیستم شده
و زمانی که درخواست جدیدی بیاد میشه 533
دو Gauge .برای نگهداری مقادیر عددی متغیر استفاده میشه ،مثل مصرف CPUدر یک زمان خاص یا مدت زمانی که صرف
اجرای یک درخواست میشه400-125-1250-470-320-450 :
1
# TYPE application_request_duration gauge
2 application_request_duration{endpoint="product-list-page"} 845
مثال باال هم به این معناست که مدت زمان اجرای یک درخواست نمایش محصوالت 845میلی ثانیه است.
سه و چهار Summary .و Histogramمتریک های ترکیبی هستند ،یعنی اگر بخوایم مقدار یک متریک رو بسنجیم هم
تعدادش ( )countرو ثبت میکنه و هم مجموع رخداد ( )sumاین متریک ثبت میشه .که داشتن این دو مقدار به ما برای
رسیدن به میانگین اون متریک کمک میکنه ،فرض کنید ما تعداد درخواستها رو داریم و در کنارش مجموع Response Time
درخواست ها هم هست و با کمک این دوتا مقدار میتونیم به میانگین زمان پاسخ درخواست ها برسیم .حاال تفاوت کجاست
.
در Histogramمیتونیم در کنار موارد باال ،مجموع تعداد درخواست در دسته های مختلف را هم داشته باشیم ،مثال تعداد
درخواستهایی که زمان پاسخ کمتر از 50میلی ثانیه بوده ،تعداد درخواستهایی که زمان پاسخ کمتر از 180میلی ثانیه و...
1 # TYPE application_request histogram
2 application_request_bucket{le="50"} 502
3 application_request_bucket{le="100"} 954
4 application_request_bucket{le="180"} 1166
5 application_request_bucket{le="250"} 1296
6 application_request_bucket{le="400"} 1383
7 application_request_bucket{le="800"} 1424
8 application_request_bucket{le="2000"} 1429
9 application_request_bucket{le="+Inf"} 1429
10 application_request_sum 25465
11 application_request_count 1429
) هم داریم که با عددی بین صفر وquantile( هم مجموع و تعداد رو داریم اما در کنارش یه دسته بندی کمیSummary در
یکم تعریفش گنگ بود با یک مثال فهمش،یک نشون میدیم که تا هر دهک درصدی میانگین زمان پاسخ سرویس چقدره
برای میانگین زمان پاسخ به این شکل هستش که مثال ثبت میکنیم میانگین زمان پاسِخSummary یک نمونه از.راحت تره
. میلی ثانیه146 درصد درخواست ها95 میلی ثانیه هستش و میانگین زمان پاسِخ114 درصد درخواستها حدود50
2 application_request_duration_sum{app="MonitoringExample.Api"} 95743
3 application_request_duration_count{app="MonitoringExample.Api"} 1429
4 application_request_duration{app="MonitoringExample.Api",quantile="0.5"} 114
5 application_request_duration{app="MonitoringExample.Api",quantile="0.75"} 132
6 application_request_duration{app="MonitoringExample.Api",quantile="0.95"} 146
7 application_request_duration{app="MonitoringExample.Api",quantile="0.99"} 152
.توضیحات تکمیلی و مثالهایی از این متریک ها را در قسمتهای بعد سعی میکنم اضافه کنم
اینجا لینک هر سرویس و. میتونید سرویس ها رو در مرورگر ببینیدdocker-compose شما بعد از اجرا شدن دستور
وقتی وارد پنل گرافانا شدید.اطالعات جانبی برای ورود رو گذاشتم که برای مشاهده داشبورد اولیه الزمه وارد پنل گرافانا بشید
میتونید نمودارهایی که قراره بسازیم رو ببینید تا در قسمت های بعد نحوه ساختن هر کدومmy api dshboard در داشبورد
.رو توضیح بدیم