上一篇已经把 Flink 的 JobManager 和 TaskManager 指标暴露给了 Prometheus。到这一步,指标已经能被采集,但是直接在 Prometheus 里写 PromQL 更适合排查问题,不适合长期观察。
监控体系里一般会把 Prometheus 当成指标采集和查询服务,把 Grafana 当成可视化入口。Prometheus 负责把时序数据存下来,Grafana 负责把这些指标组织成看板,这样才能比较直观地看到 Flink 当前的运行状态。
这篇继续在同一台服务器上部署 Grafana,并接入前面已经配置好的 Prometheus,再整理一个最小可用的 Flink 监控看板。
1. 环境说明
当前仍然使用前几篇文章中的服务器,Prometheus 和 Flink 都已经启动:
hostname
date '+%Y-%m-%d %H:%M:%S'
curl -s http://localhost:9090/-/ready
curl -s http://localhost:8081/overview
输出如下:
lavm-bzoq5mwl1h
2025-05-17 11:13:13
Prometheus Server is Ready.
{"taskmanagers":1,"slots-total":1,"slots-available":1,"jobs-running":0,"jobs-finished":0,"jobs-cancelled":0,"jobs-failed":0,"flink-version":"1.20.1","flink-commit":"cb1e7b5"}
当前几个服务端口如下:
| 端口 | 组件 | 说明 |
|---|---|---|
| 3000 | Grafana | Web UI |
| 9090 | Prometheus | 指标查询和 HTTP API |
| 8081 | Flink Web Dashboard | Flink Web UI |
| 9249 | Flink JobManager Reporter | JobManager 指标 |
| 9250 | Flink TaskManager Reporter | TaskManager 指标 |
这些端口在实验环境里可以临时开放访问,但生产环境不要直接把 Grafana、Prometheus、Flink Web Dashboard、Flink Reporter 暴露到公网。对外访问建议通过 VPN、内网、安全组、防火墙、Nginx Basic Auth、统一网关或 SSO 控制。
本文计划使用 Grafana 11.6.1,部署启动后再通过 /api/health 检查实际版本。
2. 部署 Grafana
先准备目录:
mkdir -p /opt/software /opt/module
cd /opt/software
下载并解压 Grafana:
curl -L -o grafana-11.6.1.linux-amd64.tar.gz \
https://dl.grafana.com/oss/release/grafana-11.6.1.linux-amd64.tar.gz
tar -zxf grafana-11.6.1.linux-amd64.tar.gz
mv grafana-v11.6.1 /opt/module/grafana-v11.6.1
本文以 Grafana 11.6.1 为例,阅读时如果已有新版本,可以到 Grafana 官方下载页选择最新 OSS 稳定版。包名里的 linux-amd64 对应 x86_64 服务器,如果是 ARM64 服务器,需要选择 linux-arm64 包。如果下载较慢,可以先在本地下载后上传到服务器,或选择合适的镜像源。
如果 /opt/module/grafana-v11.6.1 已经存在,先备份旧目录,确认不需要后再删除,避免覆盖已有看板、数据源或插件文件。
进入 Grafana 目录:
cd /opt/module/grafana-v11.6.1
Grafana 的默认配置文件是:
conf/defaults.ini
一般不直接改这个文件,而是在 conf/custom.ini 里覆盖需要调整的配置:
cp conf/sample.ini conf/custom.ini
vim conf/custom.ini
[server]
http_addr = 0.0.0.0
http_port = 3000
[security]
admin_user = admin
admin_password = <your_password>
[auth.anonymous]
enabled = true
org_role = Viewer
这里配置了三类信息。
| 配置 | 说明 |
|---|---|
| http_addr | 实验环境监听所有网卡,生产环境建议绑定内网地址或配合反向代理访问控制 |
| http_port | Grafana Web 端口 |
| admin_user / admin_password | 管理员账号 |
| auth.anonymous.enabled | 允许只读访问,方便看板展示 |
| org_role | 匿名用户只给 Viewer 权限 |
请把
匿名 Viewer 只能查看,添加数据源和编辑看板仍需要管理员权限。生产环境一般不建议开启匿名访问,即使只是 Viewer,也可能暴露业务指标、机器信息、作业名称、集群结构等敏感信息。生产环境不仅不建议直接暴露 3000,也不建议直接暴露 Prometheus 9090、Flink Web UI 8081、Reporter 9249/9250。这里是为了验证监控链路,所以只做最小配置。
二进制方式运行 Grafana 时,需要关注 data、logs、plugins 等目录,重装或删除目录可能导致看板和数据源配置丢失。
启动 Grafana:
cd /opt/module/grafana-v11.6.1
mkdir -p logs
nohup bin/grafana server \
--homepath=/opt/module/grafana-v11.6.1 \
--config=/opt/module/grafana-v11.6.1/conf/custom.ini \
> logs/grafana.log 2>&1 &
查看端口:
ss -lntp | grep 3000
可以看到 Grafana 已经监听 3000:
LISTEN 0 4096 *:3000 *:* users:(("grafana",pid=950441,fd=9))
这里的 *:3000 表示 Grafana 监听所有网卡。如果云服务器安全组开放 3000,外部也可以访问 Grafana。
再通过接口确认服务状态:
curl -s http://localhost:3000/api/health
返回结果:
{
"database": "ok",
"version": "11.6.1",
"commit": "ae23ead4d959aa73a5a0ffada60e4147d679523c"
}
只要返回 database: ok,就说明 Grafana 本身已经正常起来了。实验环境停止 Grafana 可以用:
pkill -f '/opt/module/grafana-v11.6.1/bin/grafana'
长期运行建议使用 systemd 管理 Grafana,便于开机自启、失败重启和统一日志管理。
3. 添加 Prometheus 数据源
Grafana 本身不负责采集指标,它需要通过数据源去查询外部系统。这里要接入的就是前面部署好的 Prometheus。
登录 Grafana 后,进入:
Connections -> Data sources -> Add data source -> Prometheus
Prometheus Server URL 填写:
http://localhost:9090
因为 Grafana 和 Prometheus 在同一台服务器上,所以这里直接写 localhost:9090。这里的 localhost 是从 Grafana 后端视角访问 Prometheus,不是从浏览器视角访问。如果 Grafana 和 Prometheus 不在同一台机器,就要填写 Prometheus 对 Grafana 后端可访问的地址。
保存数据源后,可以看到 Prometheus 已经被添加为默认数据源:
数据源添加成功后,可以先进入 Explore,选择 Prometheus,输入 up{job=~”flink_.*”} 验证查询。
如果不想在页面上手动点,也可以用 HTTP API 创建数据源:
curl -u admin:<your_password> \
-H 'Content-Type: application/json' \
-X POST http://localhost:3000/api/datasources \
-d '{
"name": "Prometheus",
"type": "prometheus",
"url": "http://localhost:9090",
"access": "proxy",
"isDefault": true
}'
创建数据源需要管理员权限,所以 API 示例使用 admin:
这里的 access: proxy 表示浏览器不直接访问 Prometheus,而是由 Grafana 后端去访问 Prometheus。proxy 模式下 Grafana 后端必须能访问 Prometheus URL,浏览器能不能访问 Prometheus 不重要。这个 JSON 是最小配置,适合当前无认证的 Prometheus;如果 Prometheus 前面加了认证或网关,需要补充对应认证配置。
4. 确认 Prometheus 里有 Flink 指标
配置看板前,先确认 Prometheus 已经采集到了 Flink 的指标。
curl -G -s 'http://localhost:9090/api/v1/query' \
--data-urlencode 'query=up{job=~"flink_.*"}' | jq
如果没有安装 jq,可以先去掉 | jq,或者按当前系统包管理器安装。返回结果中可以看到 Flink 的两个采集任务;下面只截取 result 数组中的关键部分,不是完整 JSON:
{
"metric": {
"__name__": "up",
"instance": "localhost:9249",
"job": "flink_jobmanager"
},
"value": [
1747451593.503,
"1"
]
}
{
"metric": {
"__name__": "up",
"instance": "localhost:9250",
"job": "flink_taskmanager"
},
"value": [
1747451593.503,
"1"
]
}
up 为 1 说明 Prometheus 可以正常拉取 Flink Reporter 暴露的 /metrics。如果 up=0,说明 Prometheus 当前无法正常抓取该 target;如果 Prometheus 中根本没有这个 target,则需要检查 scrape_configs 是否配置正确。
再看几个后面会放到看板里的指标:
curl -s 'http://localhost:9090/api/v1/query?query=flink_jobmanager_numRunningJobs' | jq
curl -s 'http://localhost:9090/api/v1/query?query=flink_taskmanager_Status_Shuffle_Netty_AvailableMemorySegments' | jq
当前环境没有提交 Flink 作业,所以 flink_jobmanager_numRunningJobs 为 0。TaskManager 的 Shuffle 可用内存段为 4096,说明 TaskManager 指标也已经正常进入 Prometheus。
flink_taskmanager_Status_Shuffle_Netty_AvailableMemorySegments 这个指标名比较具体,不同 Flink 版本、配置或运行状态下可能不完全一致。如果查不到,可以先在 Prometheus UI 中输入 flink_taskmanager 前缀,或者 curl Reporter /metrics 确认实际指标名。这里的 4096 和 Flink 网络内存配置有关,不同环境不一定相同。
5. 配置 Flink 监控看板
这里只先做一个最小可用的 Flink 看板,目的是验证 Grafana -> Prometheus -> Flink 指标链路,不是生产完整模板。创建面板的最小步骤是:
- 进入 Dashboards -> New -> New dashboard。
- 点击 Add visualization。
- 选择 Prometheus 数据源。
- 填写 PromQL。
- 根据指标选择 Stat 或 Time series 面板类型。
- 保存 Dashboard。
重点关注三个层面。
第一类是集群运行状态:
| 面板 | 面板类型 | PromQL | 说明 |
|---|---|---|---|
| Flink Targets Up | Stat | up{job=~”flink_.*”} | Reporter 是否可抓取 |
| Running Jobs | Stat | flink_jobmanager_numRunningJobs | 当前正在运行的作业数 |
| Registered TaskManagers | Stat | flink_jobmanager_numRegisteredTaskManagers | 已注册 TaskManager 数量 |
| Total Task Slots | Stat | flink_jobmanager_taskSlotsTotal | 总 Slot 数 |
第二类是 TaskManager 资源状态:
| 面板 | 面板类型 | PromQL | 说明 |
|---|---|---|---|
| TaskManager Shuffle Segments | Time series / Stat | flink_taskmanager_Status_Shuffle_Netty_AvailableMemorySegments | Shuffle 可用内存段 |
| TaskManager JVM Heap Used | Time series | flink_taskmanager_Status_JVM_Memory_Heap_Used / 1024 / 1024 | TaskManager JVM 堆内存使用,单位 MB |
| TaskManager JVM Heap Usage | Time series | flink_taskmanager_Status_JVM_Memory_Heap_Used / flink_taskmanager_Status_JVM_Memory_Heap_Max * 100 | TaskManager JVM 堆内存使用率 |
第三类是 JobManager 资源状态:
| 面板 | 面板类型 | PromQL | 说明 |
|---|---|---|---|
| JobManager JVM Heap Used | Time series | flink_jobmanager_Status_JVM_Memory_Heap_Used / 1024 / 1024 | JobManager JVM 堆内存使用,单位 MB |
| JobManager JVM Heap Usage | Time series | flink_jobmanager_Status_JVM_Memory_Heap_Used / flink_jobmanager_Status_JVM_Memory_Heap_Max * 100 | JobManager JVM 堆内存使用率 |
配置完成后的看板如下:
从图里可以看到,当前 Flink 集群有 1 个 TaskManager、1 个 Slot,没有正在运行的作业。这和 Flink Web Dashboard 里看到的状态是一致的。
这个看板还比较基础,但已经能覆盖最常见的几个问题:
| 现象 | 优先看的指标 |
|---|---|
| 作业没有起来 | flink_jobmanager_numRunningJobs |
| TaskManager 掉线 | flink_jobmanager_numRegisteredTaskManagers、up{job=”flink_taskmanager”} |
| Slot 不够 | flink_jobmanager_taskSlotsTotal |
| Shuffle 压力异常 | flink_taskmanager_Status_Shuffle_Netty_AvailableMemorySegments |
| JVM 内存持续上升 | JVM Heap Used 相关指标 |
flink_jobmanager_numRunningJobs 只能判断是否有运行作业,具体失败原因仍需结合 Flink Web UI、日志、作业级指标或告警规则排查。Slot 是否够用也不应该只看总数,更完整的判断要同时看 total / available / used slot。Shuffle 可用内存段持续下降或接近 0 时,需要关注 Shuffle 和网络内存压力。
多 TaskManager 环境可以使用 sum by(instance, tm_id)(…) 或按实例维度展示 TaskManager JVM 指标。多集群或 HA 环境下,不建议直接展示裸指标,应按 cluster、instance 等标签过滤或聚合。
如果是生产环境,还需要继续补充作业级别、算子级别、Checkpoint、反压、GC、异常重启等指标。当前没有提交 Flink 作业,所以本文暂时看不到完整的 job/operator/checkpoint/backpressure 指标。这里只先把 Grafana 到 Prometheus,再到 Flink 指标的链路打通。
Dashboard 配好后,可以通过 Dashboard -> Share -> Export 导出 JSON,后续迁移或版本管理会方便很多。
6. 看板配置的一点注意事项
Grafana 查询 Prometheus 时,本质上还是执行 PromQL,所以 PromQL 写得是否稳定,会直接影响看板质量。
例如单机环境可以直接写:
flink_jobmanager_numRunningJobs
如果后面有多个 Flink 集群,就应该给 Prometheus 的采集任务补充更明确的标签,例如:
scrape_configs:
- job_name: flink_jobmanager
static_configs:
- targets: ["localhost:9249"]
labels:
cluster: flink-standalone
- job_name: flink_taskmanager
static_configs:
- targets: ["localhost:9250"]
labels:
cluster: flink-standalone
这样 Grafana 里就可以按 cluster 做变量筛选:
flink_jobmanager_numRunningJobs{cluster="$cluster"}
这里的 $cluster 是 Grafana Dashboard Variable,需要先在 Dashboard settings -> Variables 中创建:
| 配置 | 值 |
|---|---|
| Name | cluster |
| Type | Query |
| Data source | Prometheus |
| Query | label_values(up{job=~”flink_.*”}, cluster) |
如果同一套 Prometheus 中还有环境、服务或区域差异,也可以继续增加 env、service、region 等标签。否则多个集群的指标混在一起,看板上的数值很容易误导判断。
另外,Grafana 的面板时间范围要和 Prometheus 中真实存在的数据时间对应。如果 Prometheus 只在某个时间段采集过数据,而 Grafana 页面选择了最近 6 小时,就可能出现看板为空的情况。也要确认 Grafana 右上角时间范围、时区设置,以及 Prometheus 是否有对应时间段的数据。
看板为空时,可以按这个顺序排查:
- 先在 Prometheus UI 查询同一条 PromQL。
- 再检查 Grafana 数据源是否 Save & test 成功。
- 再检查 Dashboard 时间范围和时区。
- 再检查变量是否过滤掉了数据。
- 最后检查 Prometheus target 是否为 UP。
Stat 面板适合展示当前值,Time series 面板适合展示趋势。同一条 PromQL 在不同面板类型中展示效果会不一样。如果所有 Flink 面板为空,先用 Explore 查询 up{job=~”flink_.*”}。
7. 小结
这一篇完成了 Grafana 的二进制部署,并把 Grafana 接入到 Prometheus。Prometheus 负责采集 Flink 指标,Grafana 负责把这些指标组织成看板。
目前这个看板只放了最基础的 JobManager、TaskManager 和 JVM 指标,主要目的是确认整条链路可用。进入告警规则之前,建议先保证 Dashboard 中的核心指标能稳定查询出来。下一篇继续往告警方向走,整理 Flink 任务失败、TaskManager 掉线和服务不可用时的 Prometheus 告警规则。