Prometheus یک سیستم مانیتورینگ قدرتمند و متن‌باز است که متریک‌ها را از سرویس‌های شما دریافت می‌کند و آن‌ها را در یک دیتابیس Time-Series ذخیره می‌کند. این ابزار یک مدل داده یا Data Model چند بعدی، یک زبان کوئری انعطاف‌پذیر و امکانات ترسیم داده‌ی متنوعی را از طریق ابزارهایی مانند Grafana ارایه می‌دهد.

به‌طور پیش‌فرض، Prometheus فقط متریک‌های مربوط به خود را در اختیارتان می‌گذارد (مثلن تعداد درخواست‌هایی که دریافت می‌کند، مصرف حافظه‌اش و…) اما، می‌توانید با نصب Exporterها (برنامه‌هایی که متریک‌های اضافی را تولید می‌کنند) Prometheus را تا حد زیادی گسترش دهید.

Exporterها اطلاعاتی در مورد همه چیز از زیرساخت‌، پایگاه‌ داده‌ها و وب‌سرورها گرفته تا سیستم‌های پیام‌رسان، APIها و… را ارایه می‌دهند.

در این راهنما Prometheus و Node Exporter را نصب و پیکربندی می‌کنیم تا به‌راحتی متریک‌هایی برای نظارت بر کارایی سرور ایجاد کنیم.

پیش نیازها

  • یک سرور Ubuntu 20.04 با یک کاربر غیر root و دسترسی‌های sudo

  • نصب Nginx روی سرور به‌کمک این راهنما

گام نخست: ایجاد کاربران سرویس

برای اهداف امنیتی، ما با ایجاد دو حساب کاربری جدید prometheus و node_exporter شروع می‌کنیم و از آن‌ها برای جدا کردن مالکیت فایل‌ها و دایرکتوری‌های اصلی Prometheus استفاده می‌کنیم.

sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter

قبل از دانلود باینری‌های Prometheus، دایرکتوری‌های لازم برای ذخیره فایل‌ها و داده‌های Prometheus را ایجاد کنید.

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus

اکنون، مالکیت کاربر و گروه در دایرکتوری‌های جدید را روی کاربر prometheus تنظیم کنید.

sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

گام دوم: دانلود Prometheus

ابتدا نسخه پایدار فعلی Prometheus را در دایرکتوری home دانلود کنید:

cd ~
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz

سپس آرشیو دانلود شده را باز کنید:

tar xvf prometheus-2.0.0.linux-amd64.tar.gz

دو فایل باینری دانلودشده را در usr/local/bin/ کپی می‌کنیم:

sudo cp prometheus-2.0.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.0.0.linux-amd64/promtool /usr/local/bin/

مالکیت کاربر و گروه باینری‌ها را روی کاربر prometheus تنظیم می‌کنیم:

sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

دایرکتوری‌های consoles و console_libraries را در /etc/prometheus کپی می‌کنیم:

sudo cp -r prometheus-2.0.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.0.0.linux-amd64/console_libraries /etc/prometheus

مالکیت کاربر و گروه دایرکتوری‌ها را روی کاربر prometheus تنظیم می‌کنیم:

sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries

در نهایت، فایل‌های باقی‌مانده را احذف می‌کنیم:

rm -rf prometheus-2.0.0.linux-amd64.tar.gz prometheus-2.0.0.linux-amd64

گام سوم: پیکربندی Prometheus

در دایرکتوری etc/prometheus/، از ویرایش‌گر متن دلخواه خود برای ایجاد یک فایل پیکربندی با نام prometheus.yml استفاده کنید:

sudo nano /etc/prometheus/prometheus.yml

توجه داشته باشید که فایل پیکربندی Prometheus از فرمت YAML استفاده می‌کند که به‌هیچ‌وجه با Tab سازگار نیست و به دو فاصله برای Indent نیاز دارد. اگر فرمت فایل پیکربندی نادرست باشد، Prometheus شروع به کار نخواهد کرد.

محتوای زیر را کپی و در این فایل قرار دهید:

global:
scrape_interval: 15s
​
scrape_configs:
- job_name: 'prometheus'
  scrape_interval: 5s
  static_configs:
    - targets: ['localhost:9090']

فایل را ذخیره کنید و از ویرایش‌گر خارج شوید.

اکنون، مالکیت کاربر و گروه فایل پیکربندی را روی کاربر prometheus تنظیم کنید:

sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml

گام چهارم: اجرای Prometheus

با مشخص کردن مسیر فایل پیکربندی و دایرکتوری داده‌ها Prometheus را به عنوان کاربر prometheus راه اندازی کنید :

sudo -u prometheus /usr/local/bin/prometheus \
   --config.file /etc/prometheus/prometheus.yml \
   --storage.tsdb.path /var/lib/prometheus/ \
   --web.console.templates=/etc/prometheus/consoles \
   --web.console.libraries=/etc/prometheus/console_libraries

خروجی اطلاعاتی در مورد پیشرفت لود Prometheus، فایل پیکربندی و سرویس‌های مرتبط است. هم‌چنین نشان‌دهنده‌ی آن است که پرومتئوس روی پورت 9090 در حال Listen کردن است.

اکنون، Prometheus را با فشار دادن CTRL+C متوقف کنید و سپس دستور زیر را اجرا کنید:

sudo nano /etc/systemd/system/prometheus.service

محتوای زیر را در فایل کپی کنید:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
​
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file /etc/prometheus/prometheus.yml \
  --storage.tsdb.path /var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries
​
[Install]
WantedBy=multi-user.target

در نهایت فایل را ذخیره کرده و ویرایش‌گر را ببندید.

برای استفاده از سرویس، systemd را ری‌لود کنید:

sudo systemctl daemon-reload

اکنون Prometheus را با استفاده از دستور زیر راه اندازی کنید:

sudo systemctl start prometheus

برای اطمینان از اینکه Prometheus در حال اجرا است، وضعیت سرویس را بررسی کنید:

sudo systemctl status prometheus

برای خروج Q را فشار دهید و با دستور زیر سرویس را فعال کنید تا در هنگام بوت شروع شود:

sudo systemctl enable prometheus

گام پنجم: دانلود Node Exporter

Node Exporter اطلاعات دقیقی در مورد سرور مانند CPU، دیسک و استفاده از حافظه ارایه می‌دهد. ابتدا نسخه‌ی پایدار فعلی Node Exporter را دانلود کنید.

cd ~
curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.15.1/node_exporter-0.15.1.linux-amd64.tar.gz

سپس، آرشیو دانلود شده را باز کنید:

tar xvf node_exporter-0.15.1.linux-amd64.tar.gz

مالکیت کاربر و گروه را روی کاربر node_exporter که در مرحله 1 ایجاد کردید تنظیم کنید:

sudo cp node_exporter-0.15.1.linux-amd64/node_exporter /usr/local/bin
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

در نهایت، فایل‌های باقی‌مانده را حذف کنید:

rm -rf node_exporter-0.15.1.linux-amd64.tar.gz node_exporter-0.15.1.linux-amd64

گام ششم: اجرای Node Exporter

مراحل اجرای Node Exporter مشابه مراحل اجرای Prometheus است. با ایجاد فایل سرویس Systemd برای Node Exporter شروع کنید:

sudo nano /etc/systemd/system/node_exporter.service

محتوای زیر را در فایل کپی کنید:

[Unit] 
Description=Node Exporter 
Wants=network-online.target 
After=network-online.target 
[Service] 
User=node_exporter 
Group=node_exporter 
Type=simple ExecStart=/usr/local/bin/node_exporter 
[Install] 
WantedBy=multi-user.target

فایل را ذخیره کنید و ویرایش‌گر را ببندید.

سپس برای استفاده از سرویس جدید، systemd را ری‌لود کنید.

sudo systemctl daemon-reload

اکنون می‌توانید Node Exporter را با استفاده از دستور زیر اجرا کنید:

sudo systemctl start node_exporter

با این دستور بررسی کنید که Node Exporter به درستی اجرا می‌شود:

sudo systemctl status node_exporter

در نهایت، Node Exporter را فعال کنید تا هنگام بوت شروع شود.

sudo systemctl enable node_exporter

گام هفتم: پیکربندی Prometheus برای دریافت داده‌های Node Exporter

از آنجایی که Prometheus فقط داده‌های Exporterهایی را که در قسمت scrape_configs از فایل پیکربندی آن تعریف شده‌اند دریافت می‌کند، باید یک ورودی برای Node Exporter اضافه کنیم، درست مانند کاری که برای Prometheus انجام دادیم.

فایل پیکربندی را باز کنید:

sudo nano /etc/prometheus/prometheus.yml

محتوای زیر را در آن قرار دهید:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node_exporter'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9100']

از آن‌جایی که این اکسپورتر نیز روی همان سروری است که Prometheus در حال اجراست، می‌توانیم جای آدرس IP از localhost به همراه پورت پیش‌فرض Node Exporter یعنی 9100 استفاده کنیم.

فایل را ذخیره کرده و از ویرایش‌گر خارج شوید.

در نهایت، Prometheus را دوباره راه اندازی کنید تا تغییرات اعمال شود:

sudo systemctl restart prometheus

یک بار دیگر، بررسی کنید که همه چیز به درستی با statusدستور اجرا می‌شود.

sudo systemctl status prometheus

گام هشتم: ایمن سازی Prometheus

Prometheus دارای احراز هویت داخلی یا مکانیسم امنیتی عمومی دیگری نیست. یعنی از یک طرف، شما با یک سیستم بسیار انعطاف پذیر با محدودیت‌های پیکربندی کمتر روبه‌رو هستید و از سوی دیگر، باید مطمین شوید که متریک‌ها و تنظیمات کلی شما به اندازه‌ی کافی ایمن هستند.

با نصب apache2-utils، امکان دسترسی به ابزار تولید فایل‌های رمز عبور htpasswd را خواهید داشت:

sudo apt-get update 
sudo apt-get install apache2-utils

اکنون یک فایل پسورد با مشخص کردن مسیر ذخیره‌ شدن آن و یوزرنیم آن بسازید:

sudo htpasswd -c /etc/nginx/.htpasswd username

پس از اجرای این دستور یک فایل جدید به نام htpasswd.در etc/nginx/ ایجاد شده که شامل نام کاربری و یک نسخه‌ی هش‌شده از رمز عبوری است که وارد کردید.

ابتدا، یک کپی از فایل تنظیمات پیش‌فرض Nginx برای Prometheus بگیرید تا اگر مشکلی ایجاد شد، بتوانید به حالت پیش‌فرض برگردید:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/prometheus

سپس، فایل پیکربندی جدید را باز کنید:

sudo nano /etc/nginx/sites-available/prometheus

بلوک location را که به‌شکل زیر است زیر بلوک server پیدا کنید:

location / {
    try_files $uri $uri/ =404;
}

از آن‌جایی که ما تمام ترافیک را به Prometheus ارسال خواهیم کرد، try_files را با محتوای زیر جایگزین کنید:

location / {
    auth_basic "Prometheus server authentication";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://localhost:9090;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}

فایل را ذخیره کرده و ویرایش‌گر را ببندید.

فایل پیکربندی پیش‌فرض Nginx را حذف و فایل جدید را جایگزین آن کنید:

sudo rm /etc/nginx/sites-enabled/default 
sudo ln -s /etc/nginx/sites-available/prometheus /etc/nginx/sites-enabled/

قبل از راه اندازی مجدد Nginx، با استفاده از دستور زیر تنظیمات را بررسی کنید:

sudo nginx -t

خروجی باید ن syntax is ok و test is successful را شان دهد.

سپس، Nginx را ری‌لود کنید:

sudo systemctl reload nginx

بررسی کنید که Nginx آماده و در حال اجرا است:

sudo systemctl status nginx

گام نهم: بررسی Prometheus

با این‌که Prometheus یک رابط مبتنی بر وب پایه برای مانیتور کردن وضعیت خود و Exporterهایش، اجرای کوئری‌ها و تولید نمودارها فراهم می‌کند، به دلیل سادگی این رابط، تیم Prometheus نصب و استفاده از Grafana را برای هر فرآیندی که پیچیده‌تر از تست و عیب‌یابی است توصیه می‌کند.

در این راهنما، از رابط وب داخلی برای اطمینان از راه‌اندازی Prometheus و Node Exporter استفاده می‌کنیم و نگاهی به کوئری‌ها و گراف‌های ساده‌ی آن می‌اندازیم.

برای شروع، http://IP را در مرورگر باز کنید.

در کادر نام کاربری و رمز عبوری را که در مرحله‌‌ی ۸ انتخاب کردید وارد کنید.

پس از ورود به سیستم، بخش Expression را مشاهده خواهید کرد، جایی که می‌توانید کوئری‌ها را اجرا و ترسیم کنید.

قبل از اجرای هر Expression، با کلیک روی منوی Status در بالای صفحه و سپس گزینه‌ی Targets، وضعیت Prometheus و Node Explorer را بررسی کنید. با توجه به این‌که Prometheus را به گونه‌ای پیکربندی کرده‌ایم که خودش و Node Exporter را Scrape کند، باید هر دو را در حالت UP ببینید .

اگر یکی از اکسپورترها در لیست نیست یا پیام خطا نشان می‌دهد، وضعیت سرویس را با دستورهای زیر بررسی کنید:

sudo systemctl status prometheus
sudo systemctl status node_exporter

در مرحله بعد، برای اطمینان از این‌که Exporterها به درستی کار می‌کنند، چند عبارت را در Node Exporter اجرا می‌کنیم.

ابتدا روی منوی Graph در بالای صفحه کلیک کنید تا به Expression برگردید.

در قسمت Expression ، عبارت node_memory_MemAvailable را تایپ کرده و دکمه‌ی Execute را فشار دهید تا تب Console با مقدار حافظه سرور شما به روز شود.

به طور پیش فرض Node Exporter این مقدار را بر حسب بایت گزارش می‌کند. برای تبدیل به مگابایت، از عملگرهای ریاضی برای دو بار تقسیم بر 1024 استفاده می‌کنیم.

در قسمت Expression عبارت node_memory_MemAvailable/1024/1024 را وارد کرده و سپس دکمه‌ی Execute را فشار دهید.

اکنون تب Console نتایج را بر اساس مگابایت نمایش می‌دهد.

اگر می‌خواهید از صحت نتایج مطمین شوید، دستور زیر را در ترمینال خود اجرا کنید:

free -h

علاوه بر عملگرهای اصلی، زبان کوئری Prometheus نیز عملکردهای زیادی را برای جمع آوری نتایج ارائه می‌دهد.

در قسمت Expression عبارت avg_over_time(node_memory_MemAvailable[5m])/1024/1024 را تایپ کرده و روی دکمه‌ی Execute کلیک کنید. نتیجه، میانگین حافظه موجود در 5 دقیقه گذشته بر حسب مگابایت خواهد بود.

حال روی تب Graph کلیک کنید تا عبارت اجرا شده به جای متن به‌شکل نمودار نمایش داده شود.

اگر درباره‌ی ایجاد عبارات در رابط وب Prometheus به اطلاعات بیشتری نیاز دارید، به راهنمای این بخش از مستندات Prometheus مراجعه کنید.