Prometheus 监控实战 05:Grafana 接入与 Flink 看板配置


上一篇已经把 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 权限

请把 替换为自己的强密码,不要保留占位符,也不要使用示例密码或弱密码。如果不配置 admin_user/admin_password,Grafana 默认初始账号通常是 admin/admin,首次登录后会要求修改密码。

匿名 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:。命令中的 要替换为真实密码;多人共享服务器上,命令历史可能记录密码,生产环境建议使用 Grafana API Token 或更安全的方式。如果数据源已经存在,再次执行可能返回 name already exists 或创建重复数据源,可以先在页面里确认现有数据源,或者调用 API 查询后再决定是否创建。

这里的 access: proxy 表示浏览器不直接访问 Prometheus,而是由 Grafana 后端去访问 Prometheus。proxy 模式下 Grafana 后端必须能访问 Prometheus URL,浏览器能不能访问 Prometheus 不重要。这个 JSON 是最小配置,适合当前无认证的 Prometheus;如果 Prometheus 前面加了认证或网关,需要补充对应认证配置。

配置看板前,先确认 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 网络内存配置有关,不同环境不一定相同。

这里只先做一个最小可用的 Flink 看板,目的是验证 Grafana -> Prometheus -> Flink 指标链路,不是生产完整模板。创建面板的最小步骤是:

  1. 进入 Dashboards -> New -> New dashboard。
  2. 点击 Add visualization。
  3. 选择 Prometheus 数据源。
  4. 填写 PromQL。
  5. 根据指标选择 Stat 或 Time series 面板类型。
  6. 保存 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 是否有对应时间段的数据。

看板为空时,可以按这个顺序排查:

  1. 先在 Prometheus UI 查询同一条 PromQL。
  2. 再检查 Grafana 数据源是否 Save & test 成功。
  3. 再检查 Dashboard 时间范围和时区。
  4. 再检查变量是否过滤掉了数据。
  5. 最后检查 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 告警规则。


文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
  目录