使用服务级别指标监控性能

使用服务级别指标 (SLI) 和服务级别目标 (SLO) 跟踪用户感知的性能和可靠性。

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

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

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

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

通过与利益相关者商定并跟踪这些指标,服务所有者可以确保部署与用户的期望相符,并且他们既不会过度交付也不会交付不足他们提供的服务。

先决条件

  • 需要为 Keycloak 启用指标,并且需要将 http-metrics-slos 选项设置为 latency,以便测量下面定义的 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 请求的响应时间,由服务器测量

95% 的所有身份验证相关请求应在 5 分钟范围内快于 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 一起用作监控工具。 它们作为蓝图提供,您需要针对不同的运行时或监控环境进行调整。

对于生产环境,您可能希望使用 recording rule 替换这些查询或子查询,以确保如果您想将它们用于警报或实时仪表板,它们不会使用过多资源。

可用性

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

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

count_over_time(
  sum (up{
    container="keycloak", (1)
    namespace="$namespace"
  } > 0)[30d:15s]
) (2)
/
count_over_time(vector(1)[30d:15s]) (3)
1 按其他标签过滤以识别 Keycloak 节点
2 计算给定范围和间隔内至少一个 Keycloak 节点可用的所有数据点
3 除以相同范围和间隔内所有数据点的数量
在 Grafana 中,您可以将值 30d:15s 替换为 $__range:$__interval,以计算仪表板所选时间范围内的可用性 SLI。

身份验证请求的延迟

此 Prometheus 查询计算了在过去 5 分钟内,对于特定命名空间和 pod 的特定 Keycloak 端点,在所有身份验证请求中,在 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 按其他标签过滤以识别 Keycloak 节点
4 由 SLO 指定的时间范围
5 忽略尽可能多的标签以创建一个总和
在 Grafana 中,您可以将值 5m 替换为 $__range,以计算仪表板所选时间范围内的延迟 SLI。

身份验证请求的错误

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

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 忽略尽可能多的标签以创建一个总和
在此页