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


به نام خدا

مانیتورینگ یعنی چی؟

خیلی ساده بخواهم بگویم: همةۀ ما می‌دانیم که وقتی سرویسی را توسعه می‌دهیم، قطعاً باید وضعیت آن سرویس همیشه جلوی چشممان باشد و اتفاق‌هایی را که برایش می‌افتد، رصد کنیم.

برای مثال، اگر یک وب سرویس داریم، باید بدانیم که در این لحظه میزان (rate) خطاهایش چقدر است یا اصلاً سرویس بالا هست یا نه!

شکی نیست که مانیتورینگ برای همةۀ سرویس‌ها ضروری است. حالا پرسش اینجاست که چطور سرویس خودمان را مانیتور کنیم؟

باید بگویم که خیلی ساده است؛ چراکه تاکنون شرکت‌های مختلف ابزارهای خیــلی متنوعی را برای این کار توسعه داده‌اند.

یکی از این ابزارها که متن باز و رایگان است، prometheus نام دارد.

این ابزار به زبان Go توسعه داده شده و لینک سایت و گیت‌هابش اینجاست:

https://prometheus.io/

https://github.com/prometheus

کار اصلی این ابزار و احتمالاً خیلی از ابزارهای دیگر این است که برخی متریک‌هایی (metric) را که در روند توسعه‌ کد سرویس تغییر داده‌ایم، بر روی نمودار نشان می‌دهند و تغییرات آن‌ها را نیز به نمایش می‌گذارند.

متریک چیست؟

معنی لغوی این واژه تعریف خوبی برای این اصطلاح است که تقریباً معادل است با معیار اندازه‌گیری؛

مثلاً ممکن است تعداد کاربرهای سایت شما، ممکن است از متریک‌های مانیتورینگ سایتتان باشد. نمونه دیگر،

تعداد خطاها یا میزان مصرف رم یا latency درخواست‌هایی است که به سرور فرستاده می‌شود.

برای اینکه بدانید هر متریک چیست و به چه دردی می‌خورد، این لینک را مطالعه کنید. من هم سعی می‌کنم در آینده مقاله‌ای درباره متریک‌ها منتشر کنم.

https://prometheus.io/docs/concepts/metric_types/

چطور prometheus را بالا بیاوریم؟

برای این کار لازم است دانش اولیه‌ای درباره‌ی «داکر» داشته باشید؛ چون‌که می‌خواهم چگونگی بالا آوردن با داکرش را توضیح بدهم.

خب، برای این کار اول از همه باید فایلی docker-compose.yaml مثل فایل زیر ایجاد کنیم:

version: &quot3&quot 
services:
  prometheus:
      image: prom/prometheus:v2.12.0
      hostname: &quot&quot
      container_name: prometheus
      volumes:
      - ./volumes/static/entrypoint.sh:/bin/prometheus-entrypoint.sh
      - ./volumes/static/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./volumes/dynamic/prometheus/:/var/lib/prometheus/data
      user: root
      entrypoint:
      - /bin/sh
      - /bin/prometheus-entrypoint.sh
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/var/lib/prometheus/data
      - --storage.tsdb.min-block-duration=1h
      - --storage.tsdb.max-block-duration=6h
      - --storage.tsdb.retention=7d
      - --web.console.libraries=/usr/share/prometheus/console_libraries
      - --web.console.templates=/usr/share/prometheus/consoles
      ports:
      - 9090:9090

اگر این را با کامند docker-compose up بالا بیاوریم، وب سرویس پرومتئوس توی پورت 9090 سرور بالا می‌آید. ولی الان مسئله این است که متریک‌ها را از کجا باید خواند؟ پس برای این هم باید کانفیگ‌هایی سِت شود:

بدین‌ ترتیب‌ که اول باید فایلی به اسم prometheus.yml ایجاد کنید با محتویات زیر:

global:
scrape_interval: 30s
scrape_configs
  - job_name: 'your_job
        static_configs:
             - targets: ['targer_host:target_port']

ـ منظور از scrape_interval این است که پرومتئوسی که این‌طرف بالا آمده، چند ثانیه‌ای یک بار، برود و آن تارگت‌هایی (target) را که بهش می‌دهیم، بررسی کند.

ـ منظور از job_name اسمی است که برای آن کار انتخاب می‌کنید و دلخواه شماست.

ـ اما این هدف‌هایی (target) که برای کار خودتان تعریف می‌کنید، چی هستند؟ باید همان سروری را که متریک‌ها تویش ریخته شده‌اند، به آن بدهید.

اینجا پرانتزی باز می‌کنم و نکته‌ای را توضیح می‌دهم: دقت کنید که پرومتئوس اکسپورترهایی دارد که برایش توسعه داده شده‌‌اند و اینجا می‌توانید آن‌ها را ببینید. کاری که اکسپورترها انجام می‌دهند، این است که متریک‌های مدنظر خودشان را توی سروری می‌ریزند و می‌شود اینجا توی targetهای پرومتئوسی که می‌سازیم، آدرس آن سرورها را بهش بدهیم و آن‌ها را توی داشبوردمان نگه داریم.

بعد یک فایل entrypoint.sh با محتویات زیر ایجاد کنید:

چیز خاصی نیست؛ اسکریپتی برای چطوری اجرا شدن داکر است. :)

#!/bin/sh
#
# Entrypoint that adds `host.docker.internal` for Linux
# https://github.com/docker/for-linux/issues/264
HOST_DOMAIN=&quothost.docker.internal&quot
ping -q -c1 $HOST_DOMAIN > /dev/null 2>&1
if [ $? -ne 0 ]; then
 HOST_IP=$(ip route | awk 'NR==1 {print $3}')
   echo -e &quot$HOST_IP\t$HOST_DOMAIN&quot >> /etc/hosts
   fi
   exec /bin/prometheus &quot$@&quot

بعد از آنکه این دو تا فایل را ایجاد کردید، دستورهای زیر را اجرا کنید: (دقت کنید که فرض بر این است که الان توی مسیری هستیم که فایل docker-compose.yaml بالا را گذاشتیم.)

sudo mkdir -p ./volumes/dynamic/
sudo mkdir -p ./volumes/static/
sudo cp prometheus.yml ./volumes/static/
sudo cp entrypoint.sh ./volumes/static/

این‌ها هم چیز خاصی نیستند و همان‌طور که می‌بینید، برای کپی‌کردن آن فایل‌ها داخل volume داکر است. :)

بعد از این کار با دستور زیر داکرتان را اجرا کنید و بروید روی پورت 9090 (اگر توی داکر عوضش نکرده‌اید.) سرورتان را ببینید که بالا آمده است. :دی

docker-compose up -d


بعد از این کار با دستور زیر داکرتان را اجرا کنید و بروید روی پورت 9090 (اگر توی داکر عوضش نکرده‌اید.) سرورتان را ببینید که بالا آمده است. :دی

خب با همین کانفیگ، کار به‌کلی تمام است و می‌توانید داکر را اجرا کنید.

اگر سؤال یا ابهامی هست، حتماً کامنت بگذارید که توضیحات را بهتر کنم یا جواب بدهم.

توی نوشته‌های بعدی می‌روم سراغ گرافانا و گری‌لاگ و نهایتاً پروژه‌ای آزمایشی با این‌ها بالا می‌آورم و توضیح می‌دهم که چگونه است.

ضمناً اینجا می‌توانید فایل‌هایی را که گفتم، ببینید. :)

https://github.com/mmdaz/useful_dockers/tree/master/prometheus