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 |
延迟 |
服务器衡量的与身份验证相关的 HTTP 请求的响应时间 |
在 5 分钟的时间间隔内,95% 的所有与身份验证相关的请求应该快于 250 毫秒。 |
Keycloak 服务器端指标用于跟踪特定端点的延迟,以及使用 |
错误 |
由于服务器问题导致的身份验证请求失败,由服务器衡量 |
在 5 分钟的时间间隔内,由于服务器问题导致的身份验证请求的错误率应低于 0.1%。 |
通过在 |
* 这些 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 | 忽略尽可能多的标签以创建单个总和 |