本文目录导读:

这是一个非常经典的运维/监控技术栈组合。Prometheus(普罗米修斯)负责采集和存储指标数据,Grafana(格拉法纳)负责从Prometheus拉取数据并进行可视化展示。
下面我为你梳理从数据采集到图表展示的完整流程、核心概念和常见配置。
核心架构速览
[被监控对象] --暴露指标--> [Prometheus Server] --数据源--> [Grafana] (exporter/应用) (拉取/存储) (查询/展示)
第一步:Prometheus 如何采集指标?
数据来源:Exporters 或 应用本身
Prometheus 通过 HTTP 端点(通常是 /metrics) 拉取数据,数据来源有两种:
- Exporter(导出器):专门用于将第三方系统的指标转换为 Prometheus 格式。
node_exporter:采集 Linux/Windows 服务器指标(CPU、内存、磁盘、网络等)。mysqld_exporter:采集 MySQL 数据库指标。redis_exporter:采集 Redis 指标。cadvisor:采集 Docker 容器指标。
- 应用直接暴露:如果应用是自己开发的,可以用 Prometheus 客户端库(Go/Java/Python等)直接在代码里暴露
/metrics端点。
核心配置文件:prometheus.yml
Prometheus 通过在配置文件中定义 scrape_configs 来知道去哪里拉数据。
# prometheus.yml 示例
global:
scrape_interval: 15s # 全局拉取间隔,默认1分钟
evaluation_interval: 15s # 告警规则评估间隔
scrape_configs:
# 监控Prometheus自身(默认自带的job)
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控一台Linux服务器(假设node_exporter在目标机器上运行)
- job_name: 'linux_server'
scrape_interval: 10s
static_configs:
- targets: ['192.168.1.100:9100'] # node_exporter默认端口
# 监控多个MySQL实例(使用文件服务发现)
- job_name: 'mysql'
file_sd_configs:
- files:
- '/etc/prometheus/targets/mysql_*.json'
启动与验证
# 启动Prometheus(默认读取当前目录下的prometheus.yml) ./prometheus --config.file=prometheus.yml
启动后,访问 http://<prometheus_ip>:9090/targets,可以查看所有配置的拉取目标是否在线(State为UP)。
第二步:Grafana 如何展示?
添加 Prometheus 数据源
- 登录 Grafana(默认
http://<grafana_ip>:3000,账号密码初始为admin/admin)。 - 进入 Configuration(配置) -> Data Sources(数据源)。
- 点击 Add data source,选择 Prometheus。
- 在 URL 中输入 Prometheus 的地址(
http://192.168.1.10:9090)。 - 点击 Save & Test,看到绿色提示“Data source is working”即可。
创建 Dashboard(仪表盘)
- 手动创建:点击左侧 号 -> Dashboard -> Add new panel。
- 使用导入模板(推荐):很多常见监控(如服务器、MySQL、Kubernetes)有现成的Dashboard。
- 访问 Grafana Dashboards 官网。
- 搜索关键词(如
Node Exporter Full,ID 通常为1860)。 - 在Grafana中点击 + -> Import,输入ID,选择Prometheus数据源,即可加载完整的监控面板。
编写 PromQL 查询语句
Grafana 的图表背后是 PromQL(Prometheus Query Language),这是最核心的部分,决定了展示什么数据。
常用 PromQL 例子:
| 监控目标 | PromQL 示例 | 说明 |
|---|---|---|
| CPU使用率 | 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) |
计算每台机器的CPU空闲率,再取反 |
| 内存使用率 | (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 |
可用内存/总内存,取反 |
| 磁盘使用率 | (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100 |
根路径的使用率 |
| HTTP请求速率 | rate(http_requests_total{job="api"}[5m]) |
最近5分钟的每秒请求数 |
| 请求错误率 | sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100 |
5xx错误占总请求的比例 |
在 Grafana 面板中:
- Metrics 输入框:填写上面的PromQL。
- Legend:可以自定义图例(如
{{instance}}显示机器IP)。 - Visualization:选择展示形式(Time series折线图、Stat数字、Bar gauge柱状图、Table表格等)。
第三步:生产环境落地建议
架构扩展
单机 Prometheus 不适合大规模集群,通常会使用:
- Pushgateway:处理短期任务(批处理、CronJob)的指标推送。
- Alertmanager:与Prometheus集成,处理告警(邮件、钉钉、企业微信)。
- Thanos / VictoriaMetrics:对Prometheus进行水平扩展和长期存储。
- Relabeling(重标签):在配置中使用
relabel_configs来过滤、修改或创建标签,实现更灵活的监控。
最佳实践
- 打标签要谨慎:标签基数过大会导致 Prometheus 内存爆炸(如将用户ID、请求IP作为标签)。
- 统一命名规范:指标名用小写+下划线(
http_request_duration_seconds),单位放在后缀。 - 定义Recording Rules:将复杂的PromQL预先计算好存入新指标,加速频繁查询。
- 做好告警:不要只看图表,配置
Alerting Rules让系统在指标异常时主动通知你。
FAQ:常见问题
Q:Grafana 图表显示 No data?
- 检查数据源:Grafana 的 Data Source 能
Save & Test通过吗? - 检查时间范围:Grafana 右上角的时间范围是不是在未来或过于久远?
- 检查指标名:PromQL 里的指标名是否在 Prometheus 的
/targets能找到?去 Prometheus UI 的 Graph 页面执行一下同样的语句看看能否出数据。 - 检查标签:PromQL 里的
job或instance标签是否写对了?
Q:node_exporter 默认端口是多少?
- 通常为
9100。
Q:Prometheus 数据存在哪里?
- 默认存在本地磁盘
data/目录(基于时间序列的TSDB格式),如果容器重启会丢失,建议持久化挂载。
Q:如何在已有 Java 应用里接入 Prometheus?
- 引入
micrometer-registry-prometheus依赖,配置一个/actuator/prometheus端点即可。