如何通过Keycloak Metrics SPI按不同时间间隔统计登录请求数
实现Keycloak分时段登录/登录尝试指标统计(1分钟/1小时/1天)
你当前使用Keycloak 21.0.2和Metrics SPI,默认的totalLogins是累计指标,要实现分1分钟、1小时、1天的登录/登录尝试统计,有两种可行方案:
方案一:通过Prometheus查询直接计算(无需修改代码)
Metrics SPI已暴露keycloak_login_attempts(登录尝试累计数)和keycloak_logins(成功登录累计数)两个计数器指标,可在Prometheus中用increase()函数按时间窗口计算:
对应查询语句
- 1分钟登录尝试次数:
increase(keycloak_login_attempts[1m]) - 1小时登录尝试次数:
increase(keycloak_login_attempts[1h]) - 1天登录尝试次数:
increase(keycloak_login_attempts[1d]) - 1分钟成功登录次数:
increase(keycloak_logins[1m]) - 1小时成功登录次数:
increase(keycloak_logins[1h]) - 1天成功登录次数:
increase(keycloak_logins[1d])
若需将查询结果作为持久化指标暴露,可配置Prometheus的recording_rules生成目标格式:
groups: - name: keycloak_time_window_metrics rules: - record: keycloak_login_attempts_per_minute expr: increase(keycloak_login_attempts[1m]) - record: keycloak_login_attempts_per_hour expr: increase(keycloak_login_attempts[1h]) - record: keycloak_login_attempts_per_day expr: increase(keycloak_login_attempts[1d]) - record: keycloak_logins_per_minute expr: increase(keycloak_logins[1m]) - record: keycloak_logins_per_hour expr: increase(keycloak_logins[1h]) - record: keycloak_logins_per_day expr: increase(keycloak_logins[1d])
配置完成后,Prometheus会自动生成带realm、client_id等标签的目标指标。
方案二:修改Metrics SPI源码自定义指标(直接暴露指标)
若需让Keycloak直接暴露分时段指标,需修改Metrics SPI代码:
- 克隆Metrics SPI仓库,切换至适配Keycloak 21.0.2的分支
- 在登录事件统计逻辑中,添加基于时间桶的计数器,分别维护1分钟、1小时、1天的统计数据
- 使用Micrometer的计数器结合时间窗口功能创建对应指标,示例代码:
需配合// 创建1分钟窗口的登录成功计数器 Counter loginsPerMinute = Counter.builder("keycloak_logins_per_minute") .tags("realm", realmName, "client_id", clientId) .register(meterRegistry); // 登录成功事件触发时调用计数 loginsPerMinute.increment();StepCounter或自定义定时任务清理过期统计数据,确保指标仅统计对应时间窗口内的次数。 - 重新打包Metrics SPI,部署至Keycloak的
providers目录,重启Keycloak生效。
最终预期指标格式
keycloak_login_attempts_per_minute{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0 keycloak_login_attempts_per_hour{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0 keycloak_login_attempts_per_day{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0 keycloak_logins_per_minute{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0 keycloak_logins_per_hour{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0 keycloak_logins_per_day{realm="myrealm",provider="keycloak",client_id="myclient",} 2.0
内容的提问来源于stack exchange,提问作者Toami
相关产品推荐
相关产品推荐

