作为 Keycloak 用户,
-
我希望能够登录,
-
刷新我的令牌,以及
-
注销,
以便我可以使用那些使用 Keycloak 进行身份验证的应用程序。
服务级别指标 (SLI) 和服务级别目标 (SLO) 是在生产环境中监控和维护 Keycloak 性能和可靠性的重要组成部分。
Google 站点可靠性工程书籍对此定义如下:
服务级别指标 (SLI) 是对所提供服务水平的某些方面进行仔细定义的定量度量。
服务级别目标 (SLO) 是由 SLI 测量的服务级别的目标值或值范围。
通过与利益相关者商定并跟踪这些指标,服务所有者可以确保部署与用户的期望相符,并且他们既不会过度交付也不会交付不足他们提供的服务。
需要为 Keycloak 启用指标,并且需要将 http-metrics-slos
选项设置为 latency,以便测量下面定义的 SLO。 请遵循使用指标获取洞察指南了解更多详情。
收集指标的监控系统。 以下段落假设使用 Prometheus 或类似的系统,该系统支持 PromQL 查询语言。
以下服务定义将在后续步骤中使用,以识别合适的 SLI 和 SLO。 它应该捕获用户观察到的行为。
作为 Keycloak 用户,
我希望能够登录,
刷新我的令牌,以及
注销,
以便我可以使用那些使用 Keycloak 进行身份验证的应用程序。
以下基于上述服务描述和 Keycloak 中可用的指标提供了 SLI 和 SLO 的示例。
虽然这些 SLO 独立于系统的实际负载,但这符合预期,因为单个用户并不关心系统负载,如果他们得到缓慢的响应。 同时,如果您与利益相关者签订了服务级别协议 (SLA),那么作为 Keycloak 运行者,您有兴趣定义 Keycloak 接收的流量限制,因为随着系统负载的增加和达到扩展阈值,响应时间将会延长,错误率可能会增加。 |
特征 | 服务级别指标 | 服务级别目标* | 指标来源 |
---|---|---|---|
可用性 |
Keycloak 能够响应请求的时间百分比,由监控系统测量 |
Keycloak 在一个月内应有 99.9% 的时间可用(每月 44 分钟不可用)。 |
使用 Prometheus |
延迟 |
身份验证相关 HTTP 请求的响应时间,由服务器测量 |
95% 的所有身份验证相关请求应在 5 分钟范围内快于 250 毫秒。 |
Keycloak 服务器端指标,用于跟踪特定端点的延迟以及使用 |
错误 |
由于服务器问题导致的身份验证请求失败,由服务器测量 |
由于服务器问题导致的身份验证请求错误率应在 5 分钟范围内低于 0.1%。 |
通过在标签 |
* 这些 SLO 目标值是一个示例,应根据您的用例和部署进行调整。
这些是在 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 | 忽略尽可能多的标签以创建一个总和 |