WIUNIX ACADEMY
آموزش نصب Prometheus و Grafana در اوبونتو و دبیان
صفحهٔ 2 از 3؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
ویرایش 2 مقدار این آموزش
قدم بعدی
بررسی دریافت متریک از API
اولین scrape فوری نیست. این بررسی حداکثر ۱۲ بار، با فاصلهٔ پنج ثانیه تلاش میکند و علاوه بر HTTP 200، وضعیت success و مقدار up=1 را برای هر دو هدف محلیِ مشخصشده میخواهد.
ترمینال سرور مانیتورینگ.
(
set -euo pipefail
response=$(mktemp)
trap 'rm -f "$response"' EXIT
ok=0
for attempt in $(seq 1 12); do
if code=$(curl -sS --connect-timeout 2 --max-time 5 -G \
--data-urlencode 'query=up' -o "$response" -w '%{http_code}' \
http://127.0.0.1:9090/api/v1/query); then
if [ "$code" = 200 ] && jq -e '.status == "success" and .data.resultType == "vector" and any(.data.result[]; .metric.job == "prometheus" and .metric.instance == "127.0.0.1:9090" and .value[1] == "1") and any(.data.result[]; .metric.job == "node-exporter" and .metric.instance == "127.0.0.1:9100" and .value[1] == "1")' "$response" >/dev/null; then
ok=1; break
fi
fi
sleep 5
done
[ "$ok" = 1 ] || { cat "$response" >&2; echo 'Both local targets must have up=1' >&2; exit 1; }
jq . "$response"
)نمونهٔ پاسخ؛ زمان واقعی متفاوت است:
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"job":"prometheus","instance":"127.0.0.1:9090"},"value":[1792444800,"1"]},{"metric":{"job":"node-exporter","instance":"127.0.0.1:9100"},"value":[1792444800,"1"]}]}}فیلد status برابر success است و برای jobهای prometheus و node-exporter مقدار 1 دیده میشود.
پاسخ Query خالی است
لیست targetهای کشفشده را بررسی کن تا مشخص شود Prometheus واقعاً میتواند هر job را scrape کند یا نه.
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:9090/api/v1/targets | jq .آمادهکردن دسترسی محلی Grafana پیش از نصب
این override را پیش از نصب بسته بسازید تا حتی راهاندازی احتمالی توسط بسته هم فقط روی loopback باشد.
ترمینال سرور مانیتورینگ.
(
set -euo pipefail
sudo install -d -m 0755 /etc/systemd/system/grafana-server.service.d
sudo nano /etc/systemd/system/grafana-server.service.d/academy-local.conf
)دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
محتوای override دسترسی محلی Grafana
این محتوا را ذخیره کنید و از ویرایشگر خارج شوید. متغیر محیطی بر grafana.ini اولویت دارد. بعداً یک reverse proxy تأییدشده با TLS میتواند به همین شنوندهٔ محلی متصل شود.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[Service]
Environment="GF_SERVER_HTTP_ADDR=127.0.0.1"
فقط آدرس loopback برای شنونده تنظیم شده است.
قدم بعدی
نصب Grafana از مخزن رسمی APT
مستندات Grafana، مخزن APT برای Ubuntu و Debian را مسیر استاندارد نصب معرفی میکنند. در این آموزش بستهٔ متنباز grafana را نصب میکنیم. اگر در محیطت به نسخهٔ Enterprise رایگان نیاز داری، فقط نام بسته را عوض کن و همین مخزن را نگه دار.
کلید مخزن زیر /etc/apt/keyrings ذخیره میشود و فایل منبع مخزن هم در /etc/apt/sources.list.d قرار میگیرد.
ترمینال سرور مانیتورینگ.
(
set -euo pipefail
sudo systemctl daemon-reload
sudo install -d -m 0755 /etc/apt/keyrings
key=$(mktemp)
trap 'rm -f "$key"' EXIT
curl -fL --connect-timeout 10 --max-time 60 https://apt.grafana.com/gpg-full.key -o "$key"
gpg --show-keys "$key"
sudo install -m 0644 "$key" /etc/apt/keyrings/grafana.asc
printf '%s\n' 'deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main' | sudo tee /etc/apt/sources.list.d/grafana.list >/dev/null
sudo apt-get update
sudo apt-get install -y grafana
dpkg-query -W -f='${Version}\n' grafana
)مخزن Grafana برای APT قابلخواندن میشود و بستهٔ grafana بدون خطای امضا یا وابستگی نصب میگردد.
APT بستهٔ Grafana را پیدا یا اعتبارسنجی نمیکند
فایل مخزن، فایل کلید و خروجی policy را ببین تا مطمئن شوی APT واقعاً مخزن رسمی Grafana را میبیند.
sudo cat /etc/apt/sources.list.d/grafana.list
sudo ls -l /etc/apt/keyrings/grafana.asc
sudo apt-cache policy grafanaبازکردن فایل تنظیمات بعدی
فایل را باز کنید، محتوای پنل بعدی را در آن قرار دهید و ذخیره کنید. در nano با Ctrl+O و Enter ذخیره و با Ctrl+X خارج شوید. محتوای فایل را در ترمینال اجرا نکنید.
ترمینال سرور مانیتورینگ.
sudo nano /etc/grafana/provisioning/datasources/prometheus.yamlدستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
قدم بعدی
تعریف منبع دادهٔ Prometheus در Grafana
با فایل provisioning، منبع داده هنگام راهاندازی Grafana بهصورت تکرارپذیر تعریف میشود. نیازی به افزودن دستی آن در رابط کاربری نیست.
فایل زیر Prometheus محلی را بهعنوان منبع پیشفرض معرفی میکند. پس از ذخیره، در پنل بعدی سرویس را restart و اتصال را بررسی کنید.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
apiVersion: 1
datasources:
- name: Prometheus
uid: prometheus-local
type: prometheus
access: proxy
url: http://127.0.0.1:9090
isDefault: true
editable: true
فایل provisioning ساخته میشود و Grafana را به API محلی Prometheus متصل میکند.
قدم بعدی
راهاندازی و بررسی سلامت Grafana
پس از ذخیرهٔ provisioning سرویس را یک بار restart کنید؛ enable کردن سرویسِ در حال اجرا، تنظیمات آن را دوباره بارگذاری نمیکند. HTTP 200 و database=ok را بررسی کنید؛ سپس مطمئن شوید شنونده پیش از ورود فقط روی 127.0.0.1:3000 است.
ترمینال سرور مانیتورینگ.
(
set -euo pipefail
sudo chown root:grafana /etc/grafana/provisioning/datasources/prometheus.yaml
sudo chmod 0640 /etc/grafana/provisioning/datasources/prometheus.yaml
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl restart grafana-server
systemctl is-active grafana-server
ok=0
for attempt in $(seq 1 12); do
if code=$(curl -sS --connect-timeout 2 --max-time 5 -o /dev/null -w '%{http_code}' http://127.0.0.1:3000/api/health); then
if [ "$code" = 200 ]; then ok=1; break; fi
fi
sleep 2
done
[ "$ok" = 1 ] || { echo 'Endpoint did not become ready: http://127.0.0.1:3000/api/health' >&2; exit 1; }
printf '%s -> 200\n' 'http://127.0.0.1:3000/api/health'
curl -fsS --connect-timeout 2 --max-time 5 http://127.0.0.1:3000/api/health | jq -e '.database == "ok"'
sudo ss -lntp 'sport = :3000'
)نمونهٔ خلاصهشده:
active
http://127.0.0.1:3000/api/health -> 200
true
Listener: 127.0.0.1:3000واحد grafana-server در وضعیت active قرار میگیرد، endpoint سلامت دقیقاً 200 برمیگرداند و پاسخ JSON مقدار database را ok نشان میدهد.
Grafana کد 200 برنمیگرداند
لاگ سرویس Grafana را بررسی کن و مطمئن شو فایل provisioning مربوط به data source در مسیر درست قرار دارد.
sudo journalctl -u grafana-server -n 100 --no-pager
sudo ls -l /etc/grafana/provisioning/datasources
sudo sed -n "1,120p" /etc/grafana/provisioning/datasources/prometheus.yamlقدم بعدی
ورود امن و بررسی منبع داده
روی رایانهٔ خودتان، دو مقدار نمونهٔ SSH را با حساب موجود و آدرس سرور جایگزین کنید و ترمینال تونل را باز نگه دارید. در مرورگر http://127.0.0.1:13000 را باز کنید؛ سرویس روی سرور خصوصی میماند و مسیر شبکه با SSH رمزگذاری میشود.
در نصب تازه، نام کاربری و رمز اولیه admin است؛ بلافاصله رمز قوی و منحصربهفرد تعیین کنید. رمز جدید را در دستور، فایل منبع یا تصویر ثبت نکنید. سرور SSH باید local forwarding را مجاز کرده باشد.
در Connections منبع Prometheus را پیدا کنید. در Explore همین منبع را انتخاب و کوئری up را اجرا کنید؛ هر دو هدف محلی باید مقدار 1 داشته باشند. پاسخ health بهتنهایی اتصال منبع داده را اثبات نمیکند.
ترمینال رایانهٔ خودتان، نه سرور مانیتورینگ؛ YOUR_SSH_USER و MONITORING_SERVER را پیش از اجرا جایگزین کنید.
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:13000:127.0.0.1:3000 YOUR_SSH_USER@MONITORING_SERVERورود به Grafana انجام میشود، گذرواژهٔ اولیه تغییر میکند و data source provisionشدهٔ Prometheus در رابط Grafana دیده میشود.
قدم بعدی
ساخت اولین داشبورد با PromQL
یک داشبورد و سه پنل برای مصرف پردازنده، استفاده از حافظه و فضای آزاد فایلسیستم بسازید. برای هر پنل، منبع Prometheus را انتخاب کنید.
هر عبارت را جداگانه در ویرایشگر کوئریِ یک پنل قرار دهید و نام و واحد پنل را متناسب با آن تنظیم کنید.
ویرایشگر پنل داشبورد Grafana در مرورگر.
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))
node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}هر پنل بهجای حالت خالی یا خطا، دادهٔ زنده نمایش میدهد و ثابت میکند Grafana میتواند از Prometheus داده بگیرد.
اختیاری: آمادهسازی امن سرور دوم
روی سرور تازهٔ دوم با معماری amd64، ابتدا نصب ابزارهای پایه، ساخت حساب node_exporter، دانلود تأییدشده و سرویس loopback آن را طبق مراحل قبل انجام دهید؛ آنجا نیازی به Prometheus یا Grafana نیست. در مثال، IP مانیتورینگ 10.20.30.10 و IP سرور دوم 10.20.30.41 است؛ هر دو را یکدست جایگزین کنید. در UFW فعال با رد ورودی پیشفرض، فقط سرور مانیتورینگ را مجاز کنید. قواعد موجود را هم ببینید و اجازههای عمومی پورت 9100 را با روش مدیریت معمول فایروال خودتان حذف کنید؛ دسترسی SSH باید حفظ شود. در فایروال دیگر، همین محدودیت را پیش از ادامه اعمال کنید.
ترمینال سرور مانیتورینگ.
(
set -euo pipefail
sudo ufw status verbose
sudo ufw status verbose | grep -q '^Status: active'
sudo ufw status verbose | grep -q '^Default: deny (incoming)'
sudo ufw allow proto tcp from 10.20.30.10 to 10.20.30.41 port 9100
sudo ufw status numbered
sudo install -d -m 0755 /etc/systemd/system/node_exporter.service.d
sudo nano /etc/systemd/system/node_exporter.service.d/private.conf
)دستور باید بدون خطا تمام شود؛ در صورت خطا، پیش از ادامه علت را برطرف کنید.
شنوندهٔ خصوصی exporter سرور دوم
این override را روی سرور دوم با IP خصوصی واقعی ذخیره کنید. برای جایگزینی ExecStart، ابتدا مقدار قبلی خالی میشود. متریکها در این روش بدون احراز هویتاند؛ شبکه باید خصوصی و قابل اعتماد یا VPN باشد، وگرنه TLS و احراز هویت exporter را جداگانه تنظیم کنید.
محتوای فایل؛ در فایل نامبرده ذخیره کنید، نه در خط فرمان.
[Service]
ExecStart=
ExecStart=/usr/local/bin/node_exporter --web.listen-address=10.20.30.41:9100
override فقط IP خصوصی را انتخاب میکند.