监控

Alauda Application Services Identity Management E1 提供与 Prometheus 兼容的内置指标。启用指标后,您可以在可观测性堆栈中监控 Keycloak 的运行状况、性能和使用情况。

启用指标

通过在 Keycloak CR 中设置 metrics-enabled 选项来启用指标:

spec:
  additionalOptions:
    - name: metrics-enabled
      value: "true"

启用后,Keycloak 会在管理端口(默认:9000)上公开指标端点,该端口可通过 spec.httpManagement.port 进行配置:

  • 集群内:http://<keycloak-service-name>.<namespace>:9000/metrics
  • Pod 内:http://localhost:9000/metrics

管理端口与主 HTTP/HTTPS 端口分离。

关键指标

以下类别的指标可用:

类别指标示例描述
JVMjvm_memory_used_bytes、jvm_gc_pause_seconds、jvm_threads_live_threadsJava Virtual Machine 内存、GC 和线程使用情况
HTTPhttp_server_requests_seconds_count、http_server_requests_seconds_sum、http_server_active_requests请求数、累计延迟和活动连接数。使用 _count 和 _sum 计算平均请求延迟。
数据库agroal_active_connections、agroal_awaiting_connections、agroal_max_used_connections数据库连接池使用情况、争用情况和峰值利用率
Keycloak 登录事件keycloak_user_events_total{event="login"}、keycloak_user_events_total{event="login_error"}每个 Realm 的认证成功和失败次数(需要 --event-metrics-user-enabled=true)。使用 login_error 事件标签监控暴力破解或凭证问题。
Keycloak 注册keycloak_user_events_total{event="register"}、keycloak_user_events_total{event="register_error"}每个 Realm 的用户自行注册事件
Keycloak 客户端登录keycloak_user_events_total{event="client_login"}、keycloak_user_events_total{event="client_login_error"}服务账户(客户端凭证)认证事件
Infinispan / 缓存vendor_cache_manager_*、vendor_statistics_*分布式缓存命中率/未命中率和集群状态(启用缓存统计信息时)
原生 Keycloak 26.x 事件指标

Keycloak 26.x 通过单个指标 keycloak_user_events_total 原生公开用户事件指标,该指标带有 event 标签(例如 event="login"、event="register")。将 --event-metrics-user-enabled=true 添加到构建或运行时选项中即可启用。无需使用 aerogear/keycloak-metrics-spi 等第三方 SPI 扩展,且它们采用不同的命名约定。

建议的告警指标

建议从以下指标开始配置告警规则:

指标指标 / 查询告警条件
登录失败率rate(keycloak_user_events_total{event="login_error"}[5m])高于基线的突增表示存在暴力破解或配置问题
HTTP 错误率rate(http_server_requests_seconds_count{status=~"5.."}[5m])超过阈值的 5xx 错误表示服务器存在问题
数据库连接池耗尽agroal_awaiting_connections > 0等待数据库连接的请求表示连接池大小存在问题
JVM 内存压力jvm_memory_used_bytes / jvm_memory_max_bytes > 0.9较高的堆利用率可能表示内存泄漏或容量不足
健康探针失败Kubernetes 探针失败事件存活性或就绪性探针失败表示实例不稳定

配置 Prometheus 抓取

将以下抓取配置添加到 Prometheus 实例,以收集 Keycloak 指标:

scrape_configs:
  - job_name: keycloak
    static_configs:
      - targets:
          - <keycloak-service>:9000
    metrics_path: /metrics

如果使用 Prometheus Operator,请创建一个 ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: keycloak-metrics
  namespace: <namespace>
spec:
  selector:
    matchLabels:
      app: keycloak
  endpoints:
    - port: management
      path: /metrics
      interval: 30s

存活性和就绪性探针

Keycloak Operator 会自动配置存活性和就绪性探针。您可以在 Keycloak CR 中自定义探针参数:

spec:
  livenessProbe:
    periodSeconds: 10
    failureThreshold: 3
  readinessProbe:
    periodSeconds: 10
    failureThreshold: 3

探针使用 http://<pod>:9000/health/live 上的管理端点和 http://<pod>:9000/health/ready。

健康端点

Keycloak 在管理端口上公开健康端点,用于监控和编排:

端点描述
/health聚合健康检查 — 仅当所有子检查(存活性、就绪性)均正常时才返回 UP。可将其用作仪表板和外部健康监控器的单一入口。
/health/live如果 Keycloak 进程正在运行,则返回 UP。供 Kubernetes 存活性探针使用。
/health/ready如果 Keycloak 已准备好处理请求(数据库已连接、缓存已初始化),则返回 UP。供 Kubernetes 就绪性探针使用。
/health/startedKeycloak 完成启动后返回 UP。供 Kubernetes 启动探针使用。

可观测性集成

如需构建完整的可观测性堆栈,请将 Keycloak 的内置功能与集群级工具结合使用:

信号来源工具
指标/metrics 端点(Prometheus 格式)Prometheus、Thanos
健康状态/health/* 端点Kubernetes 探针、正常运行时间监控器
日志容器 stdout/stderr(JSON 或纯文本)Loki、Fluentd、ELK
事件Keycloak 事件系统(数据库 + 监听器)参见下方的事件审计
追踪OpenTelemetry(如果已启用)Tempo、Jaeger
分布式追踪

Keycloak 26.x 支持基于 OpenTelemetry 的分布式追踪。Keycloak Operator 在 Keycloak CR 中提供一流的追踪配置字段:

spec:
  tracing:
    enabled: true
    endpoint: "http://tempo.observability:4317"
    samplerType: traceidratio
    samplerRatio: 0.1

可用的 spec.tracing 字段:

字段描述默认值
enabled启用 OpenTelemetry 追踪false
endpointOTLP collector 端点 URL—
protocolTelemetry 协议(grpc 或 http/protobuf)grpc
samplerType采样器类型(traceidratio、always_on、always_off)traceidratio
samplerRatio采样概率(0.0 到 1.0)—
compressionPayload 压缩(gzip 或 none)disabled
serviceName导出追踪中的服务名称—
resourceAttributes追踪资源的其他键值属性—

对所有标准追踪配置使用 spec.tracing。仅当上述一流字段未涵盖相关追踪选项时,才使用 additionalOptions。

事件审计

Keycloak 提供了内置事件系统,用于记录登录事件和管理员操作。事件可以存储在数据库中,也可以转发到外部监听器。

启用登录事件

  1. 在管理控制台中,转到 Realm Settings > Events 选项卡。
  2. 在 User events settings 部分:
    • 启用 Save events。
    • 设置 Expiration 以控制事件的保留时长(例如,30 天)。
    • 选择要记录的 Event types(留空则记录所有类型)。
  3. 点击 Save。

主要登录事件类型

事件类型描述
LOGIN用户登录成功
LOGIN_ERROR登录尝试失败
LOGOUT用户注销
REGISTER新用户注册
CODE_TO_TOKEN授权码交换为令牌
CODE_TO_TOKEN_ERROR令牌交换失败
REFRESH_TOKEN刷新令牌
CLIENT_LOGIN客户端(服务账户)身份验证
IMPERSONATE管理员模拟用户

启用管理员事件

  1. 在 Admin events settings 部分:
    • 启用 Save events。
    • 启用 Include representation,以记录管理员操作的完整请求正文(有助于建立审计跟踪,但会增加存储使用量)。
  2. 点击 Save。

管理员事件记录通过管理控制台或 Admin REST API 执行的所有操作,包括资源类型、操作类型(CREATE、UPDATE、DELETE)以及执行操作的管理员用户。

查看事件

  • 登录事件:转到 Events > User events 选项卡。可按事件类型、用户、日期范围或客户端进行筛选。
  • 管理员事件:转到 Events > Admin events 选项卡。可按操作类型、资源类型或管理员用户进行筛选。

事件监听器

事件监听器会在事件发生时对其进行处理。Keycloak 包含两个内置监听器:

监听器描述
jboss-logging将事件写入 Keycloak 服务器日志。适用于日志聚合系统(ELK、Loki)。
email在发生特定事件时向用户发送电子邮件通知(例如,从新设备登录)。

在 Realm Settings > Events > Event listeners 中配置监听器。

通过 REST API 查询事件

# Get recent login events
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://<keycloak-host>/admin/realms/<realm>/events?type=LOGIN_ERROR&first=0&max=50"

# Get admin events
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://<keycloak-host>/admin/realms/<realm>/admin-events?first=0&max=50"