WIUNIX ACADEMY
آموزش مانیتورینگ با Prometheus، Grafana و Docker Compose
صفحهٔ 3 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
قدم بعدی
تنظیم جمعآوری متریک را باز کنید
فایل بعدی را بسازید؛ نام سرویسها در شبکهٔ Compose resolve میشود.
سرور اختصاصی لینوکس؛ پوستهٔ Bash
sudo nano '/srv/academy-monitor/config/prometheus.yml'
آمادهٔ ذخیرهٔ تنظیم بعدی است.
جمعآوری متریک بدون Docker API
پرومتئوس از خودش و فهرست تارگتهای داخل یک پوشه متریک میگیرد. جایگزینی اتمیک فایل در پوشهٔ bindشده دیده میشود؛ bind کردن تکفایل میتواند بعد از جایگزینی به inode قبلی متصل بماند. برای یک نمونه از هر سرویس، DNS داخلی کافی است. Swarm یا چند replica به طراحی کشف و relabel جدا نیاز دارد. محدودیت نمونه و label از رشد ناخواسته میکاهد، اما جای بودجهبندی تعداد سریها را نمیگیرد.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["prometheus:9090"]
- job_name: compose-services
sample_limit: 20000
label_limit: 40
label_value_length_limit: 256
file_sd_configs:
- files: ["/etc/prometheus/targets/*.json"]
refresh_interval: 30s
قدم بعدی
تارگت file discovery را بسازید
فهرست تارگت هیچ رمز و توکنی ندارد. endpoint متریک در این سناریو basic auth جدا ندارد و در دسترس همسایههای قابل اعتماد شبکه و مدیر میزبان است. ورود گرافانا از داشبورد محافظت میکند، نه endpoint داخلی متریک. برای exporter بیرون از این شبکه، دسترسی، TLS، احراز هویت و محدودیت label را جداگانه طراحی کنید؛ localhost میزبان را داخل پرومتئوس قرار ندهید.
سرور اختصاصی لینوکس؛ پوستهٔ Bash
sudo tee '/srv/academy-monitor/config/targets/services.json' >/dev/null <<'JSON'
[{"targets":["grafana:3000"],"labels":{"service":"grafana","stack":"academy-monitor"}}]
JSON
JSON معتبر با یک تارگت گرافانا ساخته شد.
قدم بعدی
دیتاسورس پرومتئوس را از فایل بسازید
URL دیتاسورس از داخل کانتینر گرافانا resolve میشود و نباید آدرس تونل مرورگر باشد. UID ثابت، داشبورد را به همین منبع وصل میکند. تنظیم فایل در شروع سرویس اعمال میشود؛ تغییر موقت در UI جای اصلاح منبع را نمیگیرد. در این آزمایشگاه محدود، endpoint خصوصی پرومتئوس رمز جدا ندارد.
سرور اختصاصی لینوکس؛ پوستهٔ Bash
sudo tee '/srv/academy-monitor/config/datasources/prometheus.yaml' >/dev/null <<'YAML'
apiVersion: 1
datasources:
- name: Academy Prometheus
uid: academy-prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: false
jsonData:
httpMethod: POST
timeInterval: 15s
YAML
فایل دیتاسورس با UID ثابت و URL داخلی موجود است.
قدم بعدی
پوشهٔ داشبورد را معرفی کنید
داشبورد از فایل نگهداری میشود. ذخیره از UI غیرفعال است تا ویرایش ظاهراً موفق با restart از بین نرود. پوشهٔ فقطخواندنی داشبورد از محل دیتابیس قابل نوشتن جداست.
سرور اختصاصی لینوکس؛ پوستهٔ Bash
sudo tee '/srv/academy-monitor/config/dashboards/academy.yaml' >/dev/null <<'YAML'
apiVersion: 1
providers:
- name: academy
orgId: 1
folder: Academy
type: file
disableDeletion: true
allowUiUpdates: false
updateIntervalSeconds: 30
options:
path: /var/lib/grafana/dashboards
YAML
provider به پوشهٔ mountشدهٔ داشبورد اشاره میکند.
قدم بعدی
داشبورد کوچک و قابل بررسی را بسازید
این فایل دو پنل کاربردی دارد و پلاگین یا داشبورد ناشناخته از بازار وارد نمیکند. مقدار up=1 یعنی scrape موفق بوده و سلامت کسبوکار را ثابت نمیکند؛ حافظهٔ فرایند هم کل RAM میزبان یا کانتینر نیست. cgroup، فایلسیستم میزبان، بررسی از بیرون و ارسال هشدار به ابزاربندی جدا احتیاج دارند. داشبورد node_exporter را وارد نکنید و وجود متریک میزبان را فرض نگیرید.
سرور اختصاصی لینوکس؛ پوستهٔ Bash
sudo tee '/srv/academy-monitor/dashboards/compose.json' >/dev/null <<'JSON'
{
"uid": "academy-compose",
"title": "Compose service health",
"schemaVersion": 39,
"version": 1,
"editable": false,
"timezone": "browser",
"refresh": "15s",
"time": {
"from": "now-30m",
"to": "now"
},
"panels": [
{
"id": 1,
"type": "timeseries",
"title": "Scrape health (1 up / 0 failed)",
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 0
},
"datasource": {
"type": "prometheus",
"uid": "academy-prometheus"
},
"targets": [
{
"refId": "A",
"expr": "up",
"legendFormat": "{{job}} / {{instance}}"
}
],
"fieldConfig": {
"defaults": {
"min": 0,
"max": 1
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
}
}
},
{
"id": 2,
"type": "timeseries",
"title": "Process resident memory \u2014 not host RAM",
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 8
},
"datasource": {
"type": "prometheus",
"uid": "academy-prometheus"
},
"targets": [
{
"refId": "A",
"expr": "process_resident_memory_bytes",
"legendFormat": "{{job}} / {{instance}}"
}
],
"fieldConfig": {
"defaults": {
"unit": "bytes"
},
"overrides": []
},
"options": {
"legend": {
"displayMode": "list",
"placement": "bottom"
}
}
}
]
}
JSON
داشبورد به academy-prometheus و کوئریهای up و حافظهٔ فرایند متصل است.