宝塔面板不原生集成grafana,需在装有宝塔的服务器上独立部署prometheus+grafana;通过配置prometheus抓取宝塔监控api(/api/monitor/metrics)和node exporter(/metrics)指标,再在grafana中添加prometheus数据源(http://localhost:9090)实现可视化。

宝塔面板本身不直接集成 Grafana,也无法原生运行 Grafana 服务;想用 Grafana 展示系统数据,必须绕过宝塔的“面板逻辑”,在服务器上独立部署 Prometheus + Grafana,并让它们从宝塔监控插件或 Node Exporter 拉取指标。
换句话说:不是“在宝塔里配 Grafana”,而是“在装了宝塔的服务器上,另外起一套 Prometheus+Grafana”,再把宝塔能暴露的数据接进去。下面分三步讲清关键动作和坑点。
如何让 Grafana 连上 Prometheus 数据源
Grafana 本身不采集数据,它只负责画图——所以你得先确保 Prometheus 正常运行并已抓到指标,Grafana 才有东西可画。
- 确认 Prometheus 已启动且
targets页面(http://localhost:9090/targets)中状态为UP,否则 Grafana 会报Data source is not available - 在 Grafana 中添加数据源时,URL 填
http://localhost:9090(非127.0.0.1,某些容器网络下localhost解析更稳) - 如果 Prometheus 启用了 Basic Auth,Grafana 数据源配置页需勾选
Basic Auth并填入对应用户名密码;未启用则留空 - 测试连接失败常见原因:防火墙拦了 9090 端口、Prometheus 配置里
web.listen-address绑定到了127.0.0.1:9090(导致 Grafana 容器内访问不到),应改为0.0.0.0:9090
如何把宝塔监控插件的数据喂给 Prometheus
宝塔监控插件(v1.0+)开放了 /api/monitor/metrics 接口,返回的是标准 Prometheus 格式文本,可直接被 Prometheus 抓取——但默认只监听本地,且需 API 密钥校验。
- 登录宝塔面板 → 【监控报表】→ 【设置】→ 开启
启用监控API,并生成密钥(记下 64 位字符串) - 该接口地址形如:
http://你的服务器IP:8888/api/monitor/metrics?api_key=xxx...,注意是GET请求,参数不能丢 - 在
prometheus.yml的scrape_configs下新增 job:
- job_name: 'bt-monitor'
metrics_path: /api/monitor/metrics
params:
api_key: ['your_64bit_api_key_here']
static_configs:
- targets: ['192.168.1.10:8888'] # 改成你服务器的内网IP(非127.0.0.1)
- 别用公网 IP 或域名做 target——Prometheus 默认走 HTTP,若目标是 HTTPS 或带跳转,会抓取失败
- 重启 Prometheus 后检查
/targets,若显示server returned HTTP status 403,大概率是密钥错或没传参
如何用 Node Exporter 补全宝塔没覆盖的底层指标
宝塔监控插件只提供 CPU/内存/磁盘/网络等基础聚合值,缺进程、中断、软硬中断、文件句柄、TCP 连接数等深度指标——这些得靠 node_exporter。
- 直接运行官方镜像最省事:
docker run -d -p 9100:9100 --name node-exporter --restart=always -v "/proc:/proc:ro" -v "/sys:/sys:ro" -v "/:/rootfs:ro" prom/node-exporter - 若不用 Docker,在 Ubuntu 上可下载二进制包解压后用 systemd 托管,关键是挂载
/proc、/sys、/三个路径,否则多数指标为 0 - 在
prometheus.yml中加另一个 job:
- job_name: 'node' static_configs: - targets: ['localhost:9100']
-
node_exporter默认只暴露/metrics,无需密钥,但要注意其端口(9100)是否被宝塔或其他服务占用 - 两个 job(
bt-monitor和node)的指标 label 不一致,比如 CPU 使用率在宝塔里是bt_cpu_percent,在 node_exporter 里是100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100),写 PromQL 时得区分清楚
真正容易被忽略的是:宝塔监控插件的指标更新频率是 10 秒一次,而 Prometheus 默认抓取间隔是 15 秒——这意味着你看到的 CPU 曲线其实是“上一个 10 秒周期”的快照,不是实时流。如果要做秒级告警,得调低 scrape_interval 并确认宝塔 API 能扛住高频请求。











