На сервере 1gb Docker Engine использует containerd-снапшоттер (driver-type: io.containerd.snapshotter.v1), а не классический overlay2. cAdvisor (проверено на v0.49.2 и свежей v0.52.1, с --docker_only и через --containerd/--containerd-namespace=moby) не может определить read-write layer контейнеров — падает с «failed to identify the read-write layer ID», метрики только по корневому cgroup, без разбивки по контейнерам. Открытая проблема совместимости, флагами не решается. Убран сервис cadvisor, job в prometheus.yml, панели «топ контейнеров» в host.json (Prometheus иначе резолвит cadvisor:8080 в никуда — Grafana показывала бы «No data» вечно). node-exporter метрики хоста (CPU/RAM/ диск/сеть) при этом покрывает полностью, без изменений. Правка конфигурации мониторинга, без изменения пользовательского поведения — версия не бампается.
206 lines
8.9 KiB
JSON
206 lines
8.9 KiB
JSON
{
|
||
"title": "Хост и контейнеры",
|
||
"description": "CPU/RAM/диск/сеть хоста (node-exporter) — профиль compose monitoring. Пороги на панелях согласованы с deploy/monitoring/alerts.yml (группа vidconf-host). Разбивки по контейнерам нет: cAdvisor несовместим с containerd-снапшоттером Docker Engine на сервере 1gb (см. комментарий у сервиса cadvisor в deploy/docker-compose.yml и .forcc/JOURNAL.md) — вручную смотреть `docker stats`.",
|
||
"uid": "vidconf-host",
|
||
"editable": false,
|
||
"timezone": "browser",
|
||
"schemaVersion": 39,
|
||
"version": 1,
|
||
"time": { "from": "now-6h", "to": "now" },
|
||
"refresh": "30s",
|
||
"tags": ["vidconf", "host"],
|
||
"panels": [
|
||
{
|
||
"id": 1,
|
||
"title": "Загрузка CPU",
|
||
"description": "100 - idle, усреднено по всем ядрам. Порог алерта HostCpuHigh — 90% дольше 15 минут, см. alerts.yml.",
|
||
"type": "timeseries",
|
||
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": { "unit": "percent", "max": 100, "min": 0, "custom": { "drawStyle": "line", "fillOpacity": 10 } },
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
|
||
"legendFormat": "CPU busy",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 2,
|
||
"title": "Load average",
|
||
"description": "node_load1/5/15 — на 4-ядерном сервере устойчивое значение выше ~4 означает очередь на CPU.",
|
||
"type": "timeseries",
|
||
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 0 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": { "custom": { "drawStyle": "line", "fillOpacity": 5 } },
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{ "datasource": { "type": "prometheus", "uid": "prometheus" }, "expr": "node_load1", "legendFormat": "1 мин", "refId": "A" },
|
||
{ "datasource": { "type": "prometheus", "uid": "prometheus" }, "expr": "node_load5", "legendFormat": "5 мин", "refId": "B" },
|
||
{ "datasource": { "type": "prometheus", "uid": "prometheus" }, "expr": "node_load15", "legendFormat": "15 мин", "refId": "C" }
|
||
]
|
||
},
|
||
{
|
||
"id": 3,
|
||
"title": "Использование RAM",
|
||
"description": "(1 - MemAvailable/MemTotal) — MemAvailable уже учитывает легко освобождаемый page cache/buffers. Порог алерта HostMemoryLow — доступно <10% дольше 10 минут, см. alerts.yml.",
|
||
"type": "timeseries",
|
||
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": { "unit": "percent", "max": 100, "min": 0, "custom": { "drawStyle": "line", "fillOpacity": 10 } },
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100",
|
||
"legendFormat": "RAM used",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 4,
|
||
"title": "Своп (использовано)",
|
||
"description": "SwapTotal - SwapFree. На этом сервере swap не заведён под мониторинг отдельным алертом — рост от нуля сам по себе сигнал, что памяти уже не хватает (см. HostMemoryLow).",
|
||
"type": "timeseries",
|
||
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": { "unit": "decbytes", "custom": { "drawStyle": "line", "fillOpacity": 10 } },
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes",
|
||
"legendFormat": "swap used",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 5,
|
||
"title": "Свободно на диске (/)",
|
||
"description": "node_filesystem_avail_bytes для корня. Порог алерта HostDiskLow — <10% (≈5 ГБ из 50 ГБ) дольше 15 минут.",
|
||
"type": "stat",
|
||
"gridPos": { "h": 4, "w": 6, "x": 0, "y": 16 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": {
|
||
"unit": "decbytes",
|
||
"thresholds": { "mode": "absolute", "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 5368709120 }] }
|
||
},
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "node_filesystem_avail_bytes{mountpoint=\"/\",fstype!=\"tmpfs\"}",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 6,
|
||
"title": "RAM сейчас, %",
|
||
"description": "Текущий снимок панели «Использование RAM». Порог совпадает с HostMemoryLow (used > 90%).",
|
||
"type": "stat",
|
||
"gridPos": { "h": 4, "w": 6, "x": 6, "y": 16 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": {
|
||
"unit": "percent",
|
||
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 90 }] }
|
||
},
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 7,
|
||
"title": "Диск сейчас, %",
|
||
"description": "Текущий снимок использования корневого раздела. Порог совпадает с HostDiskLow (used > 90%).",
|
||
"type": "stat",
|
||
"gridPos": { "h": 4, "w": 6, "x": 12, "y": 16 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": {
|
||
"unit": "percent",
|
||
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 90 }] }
|
||
},
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "(1 - node_filesystem_avail_bytes{mountpoint=\"/\",fstype!=\"tmpfs\"} / node_filesystem_size_bytes{mountpoint=\"/\",fstype!=\"tmpfs\"}) * 100",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 8,
|
||
"title": "CPU сейчас, %",
|
||
"description": "Текущий снимок загрузки CPU. Порог совпадает с HostCpuHigh (>90%).",
|
||
"type": "stat",
|
||
"gridPos": { "h": 4, "w": 6, "x": 18, "y": 16 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": {
|
||
"unit": "percent",
|
||
"thresholds": { "mode": "absolute", "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 90 }] }
|
||
},
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
|
||
"refId": "A"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": 9,
|
||
"title": "Сетевой трафик",
|
||
"description": "rx/tx по физическим интерфейсам хоста (исключены lo/veth/docker/br — это внутренние интерфейсы контейнеров, а не реальный сетевой трафик сервера).",
|
||
"type": "timeseries",
|
||
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 20 },
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"fieldConfig": {
|
||
"defaults": { "unit": "Bps", "custom": { "drawStyle": "line", "fillOpacity": 5 } },
|
||
"overrides": []
|
||
},
|
||
"targets": [
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "rate(node_network_receive_bytes_total{device!~\"lo|veth.*|docker.*|br-.*\"}[5m])",
|
||
"legendFormat": "rx {{device}}",
|
||
"refId": "A"
|
||
},
|
||
{
|
||
"datasource": { "type": "prometheus", "uid": "prometheus" },
|
||
"expr": "rate(node_network_transmit_bytes_total{device!~\"lo|veth.*|docker.*|br-.*\"}[5m])",
|
||
"legendFormat": "tx {{device}}",
|
||
"refId": "B"
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|