本指南提供診斷及解決 App Lifecycle Manager 功能旗標常見問題的步驟。
SDK 和執行階段評估
OpenFeature API 的設計可確保旗標評估呼叫不會擲回未處理的例外狀況,而是在發生評估錯誤時傳回預設值。
症狀:旗標傳回安全預設值
如果無法連上旗標服務、供應商無法使用,或旗標設定錯誤,SDK 會傳回程式碼中提供的必要預設值。
解決方法:
- 確認 OpenFeature 供應商與
saasconfig.googleapis.com端點之間的連線。 - 檢查驗證錯誤。確認應用程式的執行階段服務帳戶具備
roles/saasconfig.viewer角色。 - 確認
FLAGD_SOURCE_PROVIDER_ID正確無誤。
問題:評估結果不如預期
如果旗標未傳回預期的變化版本:
解決方法:
- 請檢查 CEL 條件和評估情境。
- 如果條件檢查期間,內容缺少必要屬性,評估引擎會略過該特定規則。
- 如果依百分比分配時缺少屬性,評估作業會傳回
INVALID_CONTEXT。
排解以應用程式為中心的範本同步和控制台推出問題
如果您使用 Application Design Center 複合範本和 Google Cloud 控制台,開始使用功能旗標,請按照下列步驟解決範本同步和推出問題。
症狀:連結 App Design Center 複合式範本後,未建立單位種類
連結複合範本後,如果 SaaS 產品的「Unit kinds」(單元 kind) 分頁仍空白:
解決方法:
- 將複合範本匯入 SaaS 產品之前,請確認每個內嵌的標準應用程式範本和父項複合應用程式範本,都已新增至 Application Design Center 的目錄。
- 確認 App Lifecycle Manager 服務代理 (
service-PROJECT_NUMBER@gcp-sa-saasservicemgmt.) 在專案中具備roles/saasservicemgmt.serviceAgent角色。 - 請在 Google Cloud 控制台查看 SaaS 產品詳細資料頁面,或執行
gcloud beta app-lifecycle-manager saas describe SAAS_OFFERING_ID --location=global,檢查範本同步狀態。
更改下列內容:
- PROJECT_NUMBER:您的 Google Cloud 專案編號。
- SAAS_OFFERING_ID:SaaS 產品的 ID。
症狀:在控制台推出旗標後,系統未更新依標準範本建立的單位
如果 Google Cloud 控制台已完成旗標推出作業,但透過標準範本建立的單元未收到更新的旗標設定,請按照下列步驟操作:
解決方法:
- 確認單元屬於目標單元 kind、位於推出作業涵蓋的區域,且符合推出作業 kind 設定的任何
unitFilter。 - 確認應用程式中的
FLAGD_SOURCE_PROVIDER_ID與單元的完整功能旗標設定資源路徑 (projects/PROJECT_ID/locations/LOCATION/featureFlagsConfigs/UNIT_ID) 相符。
更改下列內容:
- PROJECT_ID:您的 Google Cloud 專案 ID。
- LOCATION:單位所在區域。
- UNIT_ID:廣告單元 ID。
監控推出作業
監控功能旗標推出作業時,必須驗證自動化調度管理狀態 (推出作業是否完成?) 和應用程式健康狀態 (二進位檔是否擷取旗標?)。
推出自動化調度管理狀態
系統會即時監控作業成功率。
自動暫停
為避免錯誤設定影響整個機群,如果某個位置的失敗率超過推出類型 (errorBudget.allowedCount 或 errorBudget.allowedPercentage,例如每個位置 10% 的門檻) 設定的錯誤預算,系統會自動暫停推出作業。
查看摘要統計資料
使用 describe 指令查看匯總失敗次數,並判斷推出作業是否為 PAUSED 或 FAILED。
gcloud beta app-lifecycle-manager rollouts describe ROLLOUT_ID --location=global
篩選失敗的單元更新
確認失敗後,您必須找出未更新的特定裝置。使用這個篩選器,只找出特定區域中失敗的旗標更新:
gcloud beta app-lifecycle-manager unit-operations list \
--location=LOCATION \
--filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"
診斷根本原因
針對每項失敗作業,您可以在 conditions 欄位 (message 和 reason) 和 errorCategory 中,擷取啟動引擎提供的詳細錯誤訊息 (或檢查推出資源上的 stateMessage)。
gcloud beta app-lifecycle-manager unit-operations describe OPERATION_ID --location=LOCATION
更改下列內容:
- ROLLOUT_ID:推出作業的 ID。
- LOCATION:單元作業的區域。
- OPERATION_ID:單位作業的 ID。
缺少單元設定
本節說明如何避免裝置因固定而無法接收功能旗標設定,以及如何復原裝置。
瞭解單位固定
固定功能會將單元凍結在目前的版本,防止任何自動或手動推出作業更新該單元。在固定期間到期或手動取消固定之前,固定單元會明確排除在推出作業之外。
固定廣告單元缺少設定
在功能旗標推出期間,如果固定單元,就會發生重大問題。固定會封鎖所有更新,也就是說,裝置會略過接收設定所需的 FlagUpdate 作業。
症狀:取消固定單元並升級至需要功能旗標的二進位檔後,應用程式無法初始化或進入無限重試迴圈,導致 readiness 探測失敗,容器持續重新啟動。
根本原因:在單元固定期間,推出作業更新了父項單元種類資源的 defaultFlagRevisions 欄位,但固定單元略過了 FlagUpdate 作業,因此未收到生效中的設定。
診斷指令
使用下列指令,檢查失敗的旗標更新作業和單元狀態。
1. 列出失敗的標記作業
如要找出未更新的單位,請篩選 UNIT_OPERATION_STATE_FAILED 狀態和 flag_update 類型的單位作業。
gcloud beta app-lifecycle-manager unit-operations list \
--location="LOCATION" \
--filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"
2. 篩選失敗的旗標推出作業
如要找出整個機群或特定裝置中失敗的旗標更新,請為 UNIT_OPERATION_STATE_FAILED 狀態新增條件。
gcloud beta app-lifecycle-manager unit-operations list \
--location="LOCATION" \
--filter="unit:UNIT_ID AND state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"
3. 檢查失敗原因
使用 describe 指令檢查 conditions 欄位 (message 和 reason) 和 errorCategory。
gcloud beta app-lifecycle-manager unit-operations describe "OPERATION_ID" --location="LOCATION"
4. 檢查裝置狀況
您也可以直接查看單元的目前狀態。如果旗標推出作業失敗,或上次作業發生錯誤,單元的 conditions 清單會包含 type: TYPE_OPERATION_ERROR 項目。
gcloud beta app-lifecycle-manager units describe "UNIT_ID" --location="LOCATION"
更改下列內容:
- LOCATION:單位或單位作業的區域。
- UNIT_ID:單元 ID。
- OPERATION_ID:單位作業的 ID。
手動緩解
如要復原未更新旗標的固定單元,請套用上層單元 kind 的預設旗標修訂版本。
套用單元 kind 預設旗標修訂版本
如果某個單位因在一或多項推出作業中固定而缺少設定,您可以手動將該單位重設為其單位種類中定義的目前基準,藉此復原該單位。
取消固定單元 (如果已固定):
gcloud beta app-lifecycle-manager units update "UNIT_ID" \ --location="LOCATION" \ --maintenance-pinned-until-time=""從父項單元 kind 擷取預設修訂版本:
gcloud beta app-lifecycle-manager unit-kinds describe "UNIT_KIND_ID" \ --location="LOCATION" \ --format="value(defaultFlagRevisions.join(','))"建立包含這些修訂版本的新
FlagRelease:gcloud beta app-lifecycle-manager flags releases create "recovery-release-1" \ --location="LOCATION" \ --unit-kind="UNIT_KIND_ID" \ --revisions="REVISIONS"手動啟動
FlagUpdate單位作業,套用復原版本:gcloud beta app-lifecycle-manager unit-operations create "recovery-op" \ --unit="UNIT_ID" \ --flag-update="projects/PROJECT_ID/locations/LOCATION/flagReleases/recovery-release-1" \ --location="LOCATION"
更改下列內容:
- UNIT_ID:要復原的單位 ID。
- LOCATION:單位所在的區域。
- UNIT_KIND_ID:父項單位類型的 ID。
- REVISIONS:以半形逗號分隔的清單,列出步驟 2 傳回的預設旗標修訂版本資源名稱。
- PROJECT_ID:您的 Google Cloud 專案 ID。