You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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代码:

  1. 克隆Metrics SPI仓库,切换至适配Keycloak 21.0.2的分支
  2. 在登录事件统计逻辑中,添加基于时间桶的计数器,分别维护1分钟、1小时、1天的统计数据
  3. 使用Micrometer的计数器结合时间窗口功能创建对应指标,示例代码:
    // 创建1分钟窗口的登录成功计数器
    Counter loginsPerMinute = Counter.builder("keycloak_logins_per_minute")
        .tags("realm", realmName, "client_id", clientId)
        .register(meterRegistry);
    // 登录成功事件触发时调用计数
    loginsPerMinute.increment();
    
    需配合StepCounter或自定义定时任务清理过期统计数据,确保指标仅统计对应时间窗口内的次数。
  4. 重新打包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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:57:16