Keycloak 服务级别指标

服务级别指标 (SLI) 和服务级别目标 (SLO) 是在生产环境中监控和维护 Keycloak 的性能和可靠性的重要组成部分。

Google 站点可靠性工程书籍将此定义如下:

  • 服务级别指标 (SLI) 是对提供服务水平的某个方面的仔细定义的定量度量。

  • 服务级别目标 (SLO) 是由 SLI 度量的服务水平的目标值或值范围。

通过与利益相关者协商并跟踪这些指标,服务所有者可以确保部署与用户期望一致,并且不会过度或不足地提供其提供的服务。

先决条件

  • 需要为 Keycloak 启用指标,并且需要将 http-metrics-slos 选项设置为延迟,以便为下面定义的 SLO 进行度量。

  • 收集指标的监控系统。以下段落假定使用 Prometheus 或类似系统,该系统支持 PromQL 查询语言。

提供的服务的定义

以下服务定义用于后续步骤中标识适当的 SLI 和 SLO。它应该捕获其用户观察到的行为。

作为一个 Keycloak 用户,

  • 我希望能够登录,

  • 刷新我的令牌,以及

  • 注销,

以便我可以使用使用 Keycloak 进行身份验证的应用程序。

SLI 和 SLO 的定义

以下提供基于上述服务描述和 Keycloak 中可用指标的示例 SLI 和 SLO。

虽然这些 SLO 独立于系统的实际负载,但这应该是预期的,因为单个用户如果获得缓慢的响应,并不关心系统负载。

同时,如果您与利益相关者签订了服务级别协议 (SLA),那么作为运行 Keycloak 的人,您有兴趣定义 Keycloak 收到的流量的限制,因为当系统负载增加且扩展阈值达到时,响应时间会延长,错误率可能会增加。

特征 服务级别指标 服务级别目标* 指标来源

可用性

监控系统衡量的 Keycloak 能够响应请求的时间百分比

Keycloak 应该在每月 99.9% 的时间内可用(每月 44 分钟不可用)。

使用 Prometheus up 指标,该指标指示 Prometheus 服务器是否能够从 Keycloak 实例抓取指标。

延迟

服务器衡量的与身份验证相关的 HTTP 请求的响应时间

在 5 分钟的时间间隔内,95% 的所有与身份验证相关的请求应该快于 250 毫秒。

Keycloak 服务器端指标用于跟踪特定端点的延迟,以及使用 http_server_requests_seconds_buckethttp_server_requests_seconds_count 的响应时间分布。

错误

由于服务器问题导致的身份验证请求失败,由服务器衡量

在 5 分钟的时间间隔内,由于服务器问题导致的身份验证请求的错误率应低于 0.1%。

通过在 outcome 标签上过滤 http_server_requests_seconds_count 指标以获取 SERVER_ERROR 值来识别服务器端错误。

* 这些 SLO 目标值只是一个示例,应根据您的用例和部署进行调整。

PromQL 查询

这些是在 Kubernetes 环境中创建的示例查询,并与 Prometheus 作为监控工具一起使用。它们是作为蓝图提供的,您需要根据不同的运行时或监控环境对其进行调整。

对于生产环境,您可能希望将这些查询或子查询替换为 记录规则,以确保它们不会消耗过多资源(如果您想将其用于警报或实时仪表板)。

可用性

如果 Keycloak 实例可用并响应 Prometheus 抓取请求,则该指标的值将至少为 1,如果服务关闭或无法访问,则值为 0。

然后使用 Grafana 等工具显示 30 天的时间间隔,并让它计算该时间窗口内指标的平均值。

sum(
  up{
    container="keycloak", (1)
    namespace="$namespace"
  }
)
OR
on() vector(0) (2)
1 通过其他标签过滤以识别 Keycloak
2 当所有 Pod 都不可用时,替代值 0

身份验证请求的延迟

此 Prometheus 查询计算了过去 5 分钟内,针对特定 Keycloak 端点,针对特定命名空间和 Pod 的所有身份验证请求中,在 0.25 秒内完成的身份验证请求的百分比。

此示例要求 Keycloak 配置 http-metrics-slos 设置为 250,表示应记录快于和慢于 250 毫秒的请求的存储桶。将 http-metrics-histograms-enabled 设置为 true 将捕获额外的存储桶,这有助于性能故障排除。

sum(
  rate(
    http_server_requests_seconds_bucket{
      uri=~"/realms/{realm}/protocol/{protocol}/.*|/realms/{realm}/login-actions/.*", (1)
      le="0.25", (2)
      container="keycloak", (3)
      namespace="$namespace"}
    [5m] (4)
  )
) without (le,uri,status,outcome,method,pod,instance) (5)
/
sum(
  rate(
    http_server_requests_seconds_count{
      uri=~"/realms/{realm}/protocol/{protocol}/.*|/realms/{realm}/login-actions/.*", (1)
      container="keycloak",
      namespace="$namespace"}
    [5m] (3)
  )
) without (le,uri,status,outcome,method,pod,instance) (5)
1 与登录相关的 URL
2 由 SLO 定义的响应时间
3 通过其他标签过滤以识别正确的容器
4 由 SLO 指定的时间间隔
5 忽略尽可能多的标签以创建单个总和

身份验证请求的错误

此 Prometheus 查询计算了过去 5 分钟内,针对特定命名空间的所有身份验证请求中,返回服务器端错误的身份验证请求的百分比。

sum(
  rate(
    http_server_requests_seconds_count{
      uri=~"/realms/{realm}/protocol/{protocol}/.*|/realms/{realm}/login-actions/.*", (1)
      outcome="SERVER_ERROR", (2)
      container="keycloak", (3)
      namespace="$namespace"}
    [5m] (4)
  )
) without (le,uri,status,outcome,method,pod,instance) (5)
/
sum(
  rate(
    http_server_requests_seconds_count{
      uri=~"/realms/{realm}/protocol/{protocol}/.*|/realms/{realm}/login-actions/.*", (1)
      container="keycloak", (3)
      namespace="$namespace"}
    [5m] (4)
  )
) without (le,uri,status,outcome,method,pod,instance) (5)
1 与登录相关的 URL
2 过滤所有响应服务器错误(HTTP 状态 5xx)的请求
3 过滤 Keycloak 容器
4 由 SLO 指定的时间间隔
5 忽略尽可能多的标签以创建单个总和