Keycloak 服務等級指標
服務等級指標 (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 |
延遲 |
伺服器測量的驗證相關 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 分鐘內,針對特定命名空間和 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 | 按其他標籤篩選以識別正確的容器 |
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 | 忽略盡可能多的標籤以建立單一總和 |