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
فایل پیکربندی را باز کنید:
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
به طور پیش فرض Node Exporter این مقدار را بر حسب بایت گزارش میکند. برای تبدیل به مگابایت، از عملگرهای ریاضی برای دو بار تقسیم بر 1024 استفاده میکنیم.
در قسمت Expression عبارت node_memory_MemAvailable/1024/1024
اکنون تب Console نتایج را بر اساس مگابایت نمایش میدهد.
اگر میخواهید از صحت نتایج مطمین شوید، دستور زیر را در ترمینال خود اجرا کنید:
free -h
علاوه بر عملگرهای اصلی، زبان کوئری Prometheus نیز عملکردهای زیادی را برای جمع آوری نتایج ارائه میدهد.
در قسمت Expression عبارت avg_over_time(node_memory_MemAvailable[5m])/1024/1024
حال روی تب Graph کلیک کنید تا عبارت اجرا شده به جای متن بهشکل نمودار نمایش داده شود.
اگر دربارهی ایجاد عبارات در رابط وب Prometheus به اطلاعات بیشتری نیاز دارید، به راهنمای این بخش از مستندات Prometheus مراجعه کنید.