17 KiB
title, source, author, published, created, description, tags
| title | source | author | published | created | description | tags | |||
|---|---|---|---|---|---|---|---|---|---|
| 核心目标(你要覆盖的监控面) | shenwei | 2025-11-11 | 按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例 |
|
#prometheus #grafana #monitoring
我给你一套按优先级与场景划分的、能通过 Docker 部署的监控方案,并附带部署建议、关键监控项、告警示例、以及两套可直接拷贝的 docker-compose 验证模板(一个轻量、一个较完整)。我把信息组织成清单和操作步骤,便于你直接在 NAS / Ubuntu Server 上实践。
核心目标(你要覆盖的监控面)
- 主机层:CPU / 内存 / 磁盘 / 网络 / I/O / inode。
- 容器层:容器运行状态、重启次数、资源限制/使用、退出码、镜像版本。
- 服务层(应用):HTTP(S) 可用性、响应码、延迟、错误率、TLS 证书到期、DNS 解析是否异常。
- 日志:应用错误/异常、关键业务日志索引(可选全文搜索)。
- 合规与可视化:集中 time-series 存储 + 仪表盘 + 报警/通知通道(邮件/Slack/电话/Teams)。
推荐工具(均可 Docker 化)
按功能分组,给出用途与为何推荐(并标注官方安装/镜像文档):
观测 + 时序数据 / 查询 / 告警
-
Prometheus(采集 + 告警规则):拉取 exporters(node_exporter、cAdvisor、blackbox_exporter)采集指标,支持 PromQL 命名与告警规则。适合做主观测时序库与告警。(Prometheus)
-
Alertmanager(Prometheus 的告警分发):用于抑制、分组并把告警推到邮件/Slack/Webhook/PagerDuty。
可视化 + 日志聚合
-
Grafana:展示 Prometheus / VictoriaMetrics / Loki 等数据源的仪表盘与告警。支持仪表盘模板与报警通知。(Grafana Labs)
-
Grafana Loki + Promtail(如果你要日志聚合): 轻量级、与 Grafana 原生集成,适合把应用日志索引进来。
主机 / 容器指标(简易采集)
-
node_exporter(主机指标采集,Prometheus exporter)
-
cAdvisor(容器资源/性能指标,Prometheus 可抓取)
-
blackbox_exporter(外网/内网 HTTP/TCP/ICMP/HTTPS 监测/探测,用于合成监测)。
合成 / 可用性 / Uptime 检查(外网/内网访问)
- Uptime Kuma:自托管的“Uptime Robot”式工具,易上手,做外网或内网的合成可用性探针(HTTP/TCP/DNS/TLS),带历史和通知支持。推荐用于合成监测(synthetic checks)。(uptimekuma.org)
轻量单主机快速看板(推荐做 PoC)
- Netdata:开箱即用的详细 realtime 主机/容器监控面板(默认 19999 端口)。适合快速诊断热点,能和 Prometheus 集成做长期存储。(learn.netdata.cloud)
时序数据库替代(可选,用于更大规模)
- VictoriaMetrics / Thanos / Cortex:当数据量大或想要长期存储 + 高效写入时。VictoriaMetrics 配置简单,常见于 single-host 或 small-cluster 场景。
管理/操作视角(容器管理)
- Portainer:可视化管理 Docker 主机/Swarm,带部分监控/日志功能(不替代 Prometheus/Grafana,但便于运维快速操作)。
推荐的架构方案
标准(生产常见,适合多主机)
用途:长期监控、告警、仪表盘。
组件:Prometheus + node_exporter + cAdvisor + blackbox_exporter + Grafana + Alertmanager。可选 Loki(日志)、VictoriaMetrics(长期存储)。Prometheus 抓取所有主机/容器指标,Grafana 做可视化,Alertmanager 负责通知。(Prometheus)
我猜你可能没想过但挺有用的点(主动建议)
-
合成(synthetic)与真实用户监控结合:Uptime Kuma 做外网/内网可用性探针 + Prometheus blackbox_exporter 做更细粒度 HTTP/TLS/DNS 探测(响应码、证书有效期、解析时延)。
-
TLS 证书到期告警:通过 blackbox_exporter 或直接 Prometheus exporter(或在 Uptime Kuma 中)设置证书剩余天数阈值告警。
-
DNS 解析单独监控:外网访问不通常是 DNS 问题,单独做 DNS probe(blackbox_exporter 支持)。
-
短期与长期数据分层:Netdata 做短期高分辨率展示,Prometheus + VictoriaMetrics 做长期汇总(remote_write)。
-
自动化接入新主机:在新主机上用 Ansible / cloud-init 快速部署 node_exporter + cAdvisor + promtail(日志)并注册到 Prometheus。
-
容器标签化 & 报表:保证容器/服务启动时打上
service=xxx、env=prod标签,便于 PromQL 分组和 SLA 报表。
推荐监控项(可直接写为 PromQL/告警条件)
核心指标与告警建议(举例):
-
主机:
node_filesystem_avail_bytes< 10% → 磁盘告警。 -
CPU:5 分钟平均 CPU 使用率 > 85%(或按核数修正)→ 告警。
-
内存:
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.15→ 内存告警。 -
容器:容器重启次数
increase(container_restart_total[1h]) > 0→ 告警(可过滤重启策略更新产生的重启)。 -
HTTP:黑箱探测
probe_success == 0连续 3 次 → 报警;probe_duration_seconds高于阈值 → 性能警告。 -
TLS:证书剩余天数 < 14 → 告警。
(这些可直接放进 Prometheus 的 alert rules,也可在 Grafana 转换为告警)
安全与运维注意(捷径与坑)
-
减少容器权限:尽量不要给 exporters 过高宿主机权限,除非需要(e.g., Netdata 需要
/proc、/sys、Docker socket 才能全面监控)。审慎开启 Docker socket 挂载(风险:容器拿到宿主机 root 等同权限)。(learn.netdata.cloud) -
网络分区:把监控流量/端口放在管理 VLAN 或通过防火墙限定访问。
-
存储:Prometheus 本地磁盘会增长,考虑长期保留要用远端存储或定期 snapshot。
-
备份:Grafana 仪表盘 JSON 导出,Prometheus rule 与配置放在 Git(GitOps)。
-
证书/反向代理:生产建议在反向代理(Caddy/Traefik/Nginx)做 TLS 终端并加 Basic/Auth 或内部 SSO。
快速落地步骤(我会按专家视角把步骤拆成可运行的命令)
-
在一台测试机器上用上面 PoC compose 启动,验证 Netdata 与 Uptime Kuma 可访问(19999 / 3001)。
-
把 Prometheus compose 与
prometheus.yml上线到主要监控节点,配置scrape_configs抓取 node_exporter / cadvisor / blackbox。 -
在每台主机上用 docker-compose 或 Ansible 部署 node_exporter(或使用 host network 模式),并在 Prometheus 中加入目标。
-
在 Grafana 导入几个预置 dashboard(node_exporter、cadvisor、blackbox 面板),并在 Alertmanager 中配置告警路由(Slack/邮件)。
-
把 Uptime Kuma 的探测项(内网域名/公网域名)全部建好,设置通知通道(Mail / Webhook 指向 Alertmanager/Grafana 或直接 Slack)。
参考资源(官网/文档 — 我把主要 URL 放在下面,便于你深入阅读与部署)
-
Prometheus 官方: https://prometheus.io/
-
Prometheus Docker 镜像(Docker Hub): https://hub.docker.com/r/prom/prometheus
-
Grafana Docker 安装文档: https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/
我们来落地选项 A:完整的 docker-compose + prometheus.yml + alert rules。
目标是:
在你家里(NAS/Ubuntu Server)上,用 Docker 一键启动一个完整的监控栈。
功能覆盖:
-
主机与容器指标(
node_exporter,cAdvisor) -
内外网域名健康探测(
blackbox_exporter) -
数据采集与存储(
prometheus) -
可视化(
grafana) -
告警分发(
alertmanager,可选接邮件/Slack)
🧱 一、目录结构建议
请在主机上建一个目录 /opt/monitoring/(可换路径):
/opt/monitoring/
├── docker-compose.yml
├── prometheus/
│ ├── prometheus.yml
│ ├── alerts.yml
│ └── targets/
│ ├── node.yml
│ ├── cadvisor.yml
│ └── blackbox.yml
├── alertmanager/
│ └── config.yml
└── grafana/
🐳 二、docker-compose.yml
这是一个完整可运行的 Compose 文件,覆盖核心组件。
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: always
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./prometheus/alerts.yml:/etc/prometheus/alerts.yml:ro
- ./prometheus/targets:/etc/prometheus/targets:ro
- prometheus-data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
depends_on:
- cadvisor
- node_exporter
- blackbox
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: always
ports:
- "3000:3000"
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
- GF_AUTH_ANONYMOUS_ORG_NAME=Main Org
- GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer
- GF_SECURITY_ALLOW_EMBEDDING=true
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-storage:/var/lib/grafana
depends_on:
- prometheus
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: always
ports:
- "9093:9093"
volumes:
- ./alertmanager/config.yml:/etc/alertmanager/config.yml:ro
command:
- '--config.file=/etc/alertmanager/config.yml'
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
restart: always
network_mode: "host"
pid: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
blackbox:
image: prom/blackbox-exporter:latest
container_name: blackbox
restart: always
ports:
- "9115:9115"
volumes:
prometheus-data:
grafana-storage:
⚙️ 三、Prometheus 配置文件 prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 30s
rule_files:
- "/etc/prometheus/alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus:9090']
- job_name: 'node_exporter'
file_sd_configs:
- files:
- /etc/prometheus/targets/node.yml
- job_name: 'cadvisor'
file_sd_configs:
- files:
- /etc/prometheus/targets/cadvisor.yml
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- files:
- /etc/prometheus/targets/blackbox.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox:9115
- source_labels: [__param_target]
target_label: instance
🗂 四、Targets 文件示例
targets/node.yml
- targets:
- "192.168.3.47:9100"
labels:
env: home
role: server
targets/cadvisor.yml
- targets:
- "cadvisor:8080"
labels:
env: home
role: docker
targets/blackbox.yml
- targets:
- "https://pq2435887bh.vicp.fun"
- "http://shenwei-nas.vip.cpolar.cn"
- "https://transmission.vip.cpolar.cn"
labels:
env: home
type: website
🚨 五、Prometheus 告警规则 alerts.yml
groups:
- name: system-alerts
rules:
- alert: HostHighCPU
expr: avg(rate(node_cpu_seconds_total{mode="user"}[2m])) * 100 > 85
for: 2m
labels:
severity: warning
annotations:
summary: "高 CPU 使用率"
description: "主机 CPU 使用率超过 85%(持续 2 分钟)"
- alert: HostLowDisk
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) < 0.10
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "磁盘剩余空间低于 10%"
- alert: HostLowMemory
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.15
for: 5m
labels:
severity: warning
annotations:
summary: "内存使用率高"
description: "可用内存低于 15%"
- alert: ContainerRestarting
expr: increase(container_last_seen[5m]) == 0
for: 5m
labels:
severity: warning
annotations:
summary: "容器异常退出或未上报"
description: "5 分钟内容器未更新指标,可能异常退出"
- alert: HTTPProbeFailed
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "站点不可达"
description: "HTTP 探测失败:{{ $labels.instance }}"
- alert: TLSCertExpiring
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 14
for: 1h
labels:
severity: warning
annotations:
summary: "TLS 证书即将到期"
description: "证书 {{ $labels.instance }} 剩余不到 14 天"
📧 六、Alertmanager 配置 config.yml
global:
resolve_timeout: 5m
route:
receiver: default
group_wait: 10s
group_interval: 5m
repeat_interval: 3h
receivers:
- name: default
email_configs:
- to: "youremail@example.com"
from: "monitor@example.com"
smarthost: "smtp.example.com:587"
auth_username: "monitor@example.com"
auth_password: "yourpassword"
💡 你也可以改成 Slack、Teams、Telegram 等通知方式,只要换成对应的
*_configs即可。
🧩 七、Grafana 快速导入仪表盘
安装后访问 http://localhost:3000(admin/admin 登录):
-
添加 Prometheus 数据源:
http://prometheus:9090 -
导入官方 Dashboard:
-
Node Exporter Full:
1860 -
cAdvisor Container Metrics:
14282 -
Blackbox Exporter Probe:
7587
-
这些 ID 可直接在 Grafana.com → Dashboards → “Import” 输入。
🚀 八、启动命令
cd /opt/monitoring
docker compose up -d
验证访问:
-
Prometheus: http://192.168.3.47:9090
-
Grafana: http://192.168.3.47:3000
-
Alertmanager: http://192.168.3.47:9093
-
cAdvisor: http://192.168.3.47:8080
-
Blackbox exporter: http://192.168.3.47:9115
-
node_exporter: http://192.168.3.47:9100/metrics
🧠 九、扩展建议(后续可以加)
-
加 Loki + Promtail 做日志收集。
-
加 Uptime Kuma 作为轻量合成探针外层 UI(外观好看)。
-
用 Traefik/Caddy 把上述组件统一暴露并加 HTTPS。
-
加 VictoriaMetrics 作为长时存储(Prometheus remote_write)。
