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 up 指標,該指標指示 Prometheus 伺服器是否能夠從 Keycloak 執行個體抓取指標。

延遲

伺服器測量的驗證相關 HTTP 請求的回應時間

在 5 分鐘的間隔內,95% 的所有驗證相關請求應快於 250 毫秒。

Keycloak 伺服器端指標使用 http_server_requests_seconds_buckethttp_server_requests_seconds_count 追蹤特定端點的延遲以及回應時間分佈。

錯誤

伺服器測量的因伺服器問題而導致的驗證請求失敗

在 5 分鐘的間隔內,因伺服器問題導致的驗證請求錯誤率應低於 0.1%。

透過在標籤 outcome 上篩選值為 SERVER_ERROR 的指標 http_server_requests_seconds_count 來識別伺服器端錯誤。

* 這些 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 忽略盡可能多的標籤以建立單一總和