如何使用Prometheus-Operator自动采集Keycloak的Realm指标
方案1:单端点聚合全Realm指标(优先推荐,改动最小)
你当前使用的keycloak-metrics-spi 2.0及以上版本已原生支持全局指标输出,无需按Realm分别采集:
- 开启全局指标开关后,所有Realm的指标会统一在
/auth/metrics路径返回,每条指标自动携带realm标签区分所属领域,新增Realm无需任何配置变动,自动包含在指标范围内。 - 仅需要保留1个ServiceMonitor指向这个统一路径即可,完全不需要维护Realm列表。
可以直接通过Helm values添加环境变量开启该功能,无需进入控制台修改配置:
keycloak: extraEnvVars: - name: KC_SPI_METRICS_GLOBAL_METRICS_ENABLED value: "true"
方案2:Prometheus HTTP服务发现自动发现Realm(适合必须按Realm单独采集的场景)
如果你的场景要求必须按Realm拆分采集端点,可以用Prometheus自带的HTTP服务发现能力实现自动发现:
- 开发一个极简HTTP服务(几十行代码即可),调用Keycloak Admin API的
/auth/admin/realms接口拉取当前所有Realm名称 - 服务按照Prometheus HTTP服务发现的规范返回抓取目标列表,每个目标的
__metrics_path__设置为对应Realm的/auth/realms/{realmName}/metrics,同时附加realm标签 - 在Prometheus配置中新增抓取任务,指向这个服务发现接口即可,新增Realm会在服务发现的刷新周期内自动被采集
方案3:CronJob动态生成ServiceMonitor(适合必须用ServiceMonitor管理采集任务的场景)
如果你的监控规范要求所有采集任务必须通过ServiceMonitor管理,可以部署一个定时任务实现自动维护:
- 编写CronJob定时调用Keycloak Admin API拉取全量Realm列表
- 复用到你现有的ServiceMonitor模板逻辑,自动生成/更新所有Realm对应的ServiceMonitor资源
- 无需手动维护values.yaml中的Realm列表,新增Realm会在定时任务触发时自动创建对应的采集规则
优化建议
你提到的SPI指标暴露在公网http端口的问题,无需依赖反向代理拦截:可以直接在Keycloak的Ingress规则中添加配置,禁止集群外IP访问所有匹配/*/metrics的路径,仅允许Prometheus所在的监控网段访问即可,安全性更高。
内容的提问来源于stack exchange,提问作者Max N.
相关产品推荐
相关产品推荐

