Fehlerbehebung bei Funktions-Flags

In diesem Leitfaden finden Sie Schritte zur Diagnose und Behebung häufiger Probleme mit App Lifecycle Manager-Funktions-Flags.

SDK- und Laufzeitbewertung

Die OpenFeature API ist auf maximale Sicherheit ausgelegt und löst niemals einen Fehler aus, der Ihre Anwendung zum Absturz bringt.

Symptom: Flag gibt sicheren Standardwert zurück

Wenn der Flag-Dienst nicht erreichbar ist, der Anbieter nicht verfügbar ist oder das Flag falsch konfiguriert ist, gibt das SDK den erforderlichen Standardwert zurück, der in Ihrem Code angegeben ist.

Lösung:

  1. Prüfen Sie die Verbindung zwischen Ihrem OpenFeature-Anbieter und dem saasconfig.googleapis.com-Endpunkt.
  2. Auf Authentifizierungsfehler prüfen. Prüfen Sie, ob das Dienstkonto roles/saasconfig.viewer hat.
  3. Prüfen Sie, ob FLAGD_SOURCE_PROVIDER_ID korrekt ist.

Symptom: Unerwartete Bewertungsergebnisse

Wenn ein Flag nicht die erwartete Variante zurückgibt:

Lösung:

  1. Überprüfen Sie die Bedingungen für die CEL und den Kontext der Bewertung.
  2. Wenn während einer Bedingungsprüfung ein erforderliches Attribut im Kontext fehlt, überspringt die Auswertungs-Engine die entsprechende Regel.
  3. Wenn bei einer prozentualen Zuweisung ein Attribut fehlt, wird INVALID_CONTEXT zurückgegeben.

Rollouts überwachen

Beim Monitoring eines Funktions-Flag-Rollouts müssen sowohl der Orchestrierungsstatus (wurde der Rollout abgeschlossen?) als auch die Anwendungsintegrität (hat das Binärprogramm das Flag übernommen?) geprüft werden.

Status der Roll-out-Orchestrierung

Das System überwacht die Erfolgsrate von Vorgängen in Echtzeit.

Automatisches Pausieren

Damit eine „fehlerhafte“ Konfiguration nicht auf alle Geräte übertragen wird, wird die Bereitstellung automatisch pausiert, wenn die Fehlerrate das Fehlerbudget überschreitet (standardmäßig 10% pro Standort).

Zusammenfassende Statistiken ansehen

Mit dem Befehl describe können Sie die Gesamtzahl der Fehler aufrufen und feststellen, ob das Roll-out PAUSED oder FAILED ist.

gcloud beta app-lifecycle-manager rollouts describe ROLLOUT_ID --location=global

Fehlgeschlagene Geräte-Updates filtern

Sobald Sie bestätigt haben, dass Fehler vorliegen, müssen Sie die spezifischen Einheiten finden, bei denen das Update nicht durchgeführt wurde. Mit diesem Filter können Sie nur die fehlgeschlagenen Flag-Aktualisierungen in einer bestimmten Region herausfiltern:

gcloud beta app-lifecycle-manager unit-operations list \
    --location=LOCATION \
    --filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"

Ursache ermitteln

Für jeden fehlgeschlagenen Vorgang können Sie eine detaillierte Fehlermeldung der Ausführungs-Engine abrufen. Lesen Sie das Feld state_message.

gcloud beta app-lifecycle-manager unit-operations describe OPERATION_ID --location=LOCATION

Fehlende Konfigurationen für Einheiten

Einheiten anpinnen

Durch das Anpinnen wird eine Einheit auf dem aktuellen Release eingefroren. Sie wird dann nicht mehr durch automatische oder manuelle Roll-outs aktualisiert. Eine angepinnte Einheit wird explizit von Rollout-Vorgängen ausgeschlossen, bis der Zeitraum für das Anpinnen abläuft oder sie manuell entfernt wird.

Fehlende Konfiguration in angepinnten Einheiten

Ein kritischer Fall tritt ein, wenn eine Einheit während der Einführung eines Funktions-Flags angepinnt wird. Durch das Anpinnen werden alle Updates blockiert. Das bedeutet, dass das Gerät den FlagUpdate-Vorgang überspringt, der zum Empfangen der Konfiguration erforderlich ist.

Symptom:Nachdem das Gerät entkoppelt und auf eine Binärdatei aktualisiert wurde, für die Feature-Flags erforderlich sind, kann die Anwendung nicht initialisiert werden oder gerät in eine Endlosschleife mit Wiederholungsversuchen. Dies führt zu fehlgeschlagenen Bereitschaftsprüfungen und kontinuierlichen Containerneustarts.

Hauptursache:Die default_flag_revisions von UnitKind wurden nicht aktualisiert, während die Einheit angepinnt war. Daher hat die Einheit keine aktive Konfiguration.

Diagnosebefehle

1. Fehlgeschlagene Meldevorgänge auflisten

Wenn Sie Einheiten finden möchten, die nicht aktualisiert wurden, filtern Sie die Einheitenoperationen nach dem Status UNIT_OPERATION_STATE_FAILED und dem Typ flag_update.

gcloud beta app-lifecycle-manager unit-operations list \
    --location="LOCATION" \
    --filter="state:UNIT_OPERATION_STATE_FAILED AND flag_update:*"

2. Nach fehlgeschlagenen Flag-Roll-outs filtern

Wenn Sie fehlgeschlagene Flag-Updates in Ihrer Flotte oder für eine bestimmte Einheit ermitteln möchten, fügen Sie eine Bedingung für den Status UNIT_OPERATION_STATE_FAILED hinzu.

# Find all failed operations for a specific unit
gcloud beta app-lifecycle-manager unit-operations list \
    --location="LOCATION" \
    --filter="unit:UNIT_ID AND state:UNIT_OPERATION_STATE_FAILED"

3. Grund für den Fehler prüfen

Verwenden Sie den Befehl describe, um state_message zu lesen.

gcloud beta app-lifecycle-manager unit-operations describe "OPERATION_ID" --location="LOCATION"

4. Gerätezustand prüfen

Sie können auch den aktuellen Status einer Einheit direkt prüfen. Wenn ein Flag-Rollout derzeit fehlschlägt oder der letzte Vorgang zu einem Fehler geführt hat, wird dies im Status angezeigt. Bedingungen vom Typ operationError.

gcloud beta app-lifecycle-manager units describe "UNIT_ID" --location="LOCATION"

Manuelle Problembehebung

Standard-Flag-Versionen für UnitKind anwenden

Wenn die Konfiguration einer Einheit fehlt, weil sie während eines oder mehrerer Roll-outs angepinnt wurde, können Sie sie wiederherstellen, indem Sie die Einheit manuell auf die aktuelle Baseline zurücksetzen, die in ihrem UnitKind definiert ist.

  1. Lösen Sie die Einheit los, falls sie angepinnt ist.
  2. Standardrevisionen aus der übergeordneten UnitKind abrufen.
  3. Erstellen Sie einen neuen FlagRelease, der diese Überarbeitungen enthält.
  4. Manuell einen FlagUpdate-Vorgang starten, um die Wiederherstellungsversion anzuwenden.
# 1. Unpin
gcloud beta app-lifecycle-manager units update "UNIT_ID" \
    --location="LOCATION" \
    --maintenance-pinned-until-time=""

# 2. Retrieve default revisions
gcloud beta app-lifecycle-manager unit-kinds describe "UNIT_KIND_ID" \
    --location="global" \
    --format="value(defaultFlagRevisions)"

# 3. Create recovery release
gcloud beta app-lifecycle-manager flags releases create "recovery-release-1" \
    --location="global" \
    --unit-kind="UNIT_KIND_ID" \
    --revisions="REVISIONS"

# 4. Initiate manual update
gcloud beta app-lifecycle-manager unit-operations create "recovery-op" \
    --unit="UNIT_ID" \
    --flag-release="recovery-release-1" \
    --location="global"