امیر توحیدی
امیر توحیدی
خواندن ۲ دقیقه·۲ سال پیش

مانیتورینگ سرویس nodejs توسط prometheus

prometheus and nodejs
prometheus and nodejs


یکی از موارد جذاب در کد نویسی بحث مانیتورینگ کد و نمایش آن است که همیشه برای خود من از موارد جذاب بوده.

در سرویسی که در حال حاضر بر روی ان در حال کار هستم که با nodejs و typescript پیاده سازی شده است از prometheus برای ثبت داده های جهت ارسال به مانیتورینگ استفاده کرده است .

به زبان ساده بخوام سیستم کاری آن را توضیح بدم سرویس که راه اندازی میشود به زبان ساده یه متغیر عمومی روی اون کد کامپایل شده ایجاد می کند که شما از قبل مشخص کردید یه سری متغیر بر روی ان وجود دارید و شما در قسمت های مختلف کد می توانید این مقادیر را تغییر دهید .

این مقادیر می تواند از نوع Guage باشه که تنها صفر و یک را دریافت می کند.

یا می تواند به صورت عدد باشد که با ساختار مختلف می توانید این مقادیر را کاهش و افزایش دهید .

و توسط این ساختار می توانید یک روت توسط Express روی کد تعیین نمایید و از روی سیستم مربوطه prometheus این روت را صدا کرده و مقادیر را برای نمایش در سیستم گرافانا جمع اوری کنید..


چالش کجاست !؟
چالش وقتی جالب میشه که شما چند instance از اون سرویس دارید و یا وقتی که سرویس ریستارت میشه . و لزوما ریاستارت نیست و شما دپلوی روی اون سرویس انجام بدید و ریبیلد بشه هم این مسئله هست که مقادیر صفر و به حالت دیفالت باز می گردد. !!


من خیلی در مورد استفاده از این مورد جستجو کردم که مورد اماده و روتینی برای یه جورایی persist کردن این مقادیر روی هارد یا ردیس یا هر سیستم نگهداری دیگه ای وجود ندارد .


راه حل این که مقادیر prometheus persist نمیشه کرد چیه !؟
من بعد از کلی فسفر سوزوندن به یه راه حلی رسیدم که نمیشه گفت درسته یا غلط شاید برای من بهترین کار بوده ! من کاری که انجام دادم .

من اومدم که داده های مهم بودن یه کاری انجام دادم یه سری روت اختصاصی درست کردم .

ابتدای اون روت

const registery = new prometheus.Registry();

رجیستری جدید ایجاد کردم و اون موردی که می خواستم داده اش از روی بانک اطلاعاتی یا کش ردیس ایجاد کرده بودم و ذخیره کرده بودم دریافت و در خروجی جهت خوندن توسط prometheus ارسال کردم .

const registery = new prometheus.Registry(); try { await Service.routeForCheckMonitoringSystem('2022-12-04'); MetricsType.ExternalService.set(1); } catch (error) { MetricsType.ExternalService.set(0); } finally { registery.registerMetric(MetricsType.ExternalService); res.set('Content-Type', registery.contentType); res.end(await registery.metrics()); }

این طوری داده چون وابسته به ساختاری prometheus اون کردیم به درستی کار می کند و تست شده است.



اگر شما برای این مورد راهکاری میشناسید خوشحال میشم تو کامنت ها برای من بزارید

کد نویسیprometheusnodejsmonitoring
امیر توحیدی هستم. برنامه نویس و توسعه دهنده یا هر چیزی که شما بگید. :)
شاید از این پست‌ها خوشتان بیاید