Zustand und Leistung einer Umgebung anhand wichtiger Messwerte überwachen

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Auf dieser Seite wird beschrieben, wie Sie den allgemeinen Zustand und die Leistung der Cloud Composer-Umgebung anhand wichtiger Messwerte im Monitoring-Dashboard überwachen.

Einleitung

In dieser Anleitung geht es um die wichtigsten Monitoring-Messwerte von Cloud Composer, die einen guten Überblick über den Zustand und die Leistung der Umgebung geben können.

Cloud Composer bietet mehrere Messwerte, die den Gesamtzustand der Umgebung beschreiben. Die Monitoring-Richtlinien in dieser Anleitung basieren auf den Messwerten, die im Monitoring-Dashboard Ihrer Cloud Composer-Umgebung zur Verfügung gestellt werden.

In dieser Anleitung erfahren Sie mehr über die wichtigsten Messwerte, die als primäre Indikatoren für Probleme mit der Leistung und dem Zustand Ihrer Umgebung dienen. Außerdem erfahren Sie, wie Sie die einzelnen Messwerte in Korrekturmaßnahmen interpretieren, um die Umwelt zu schützen. Außerdem richten Sie für jeden Messwert Benachrichtigungsregeln ein, führen den Beispiel-DAG aus und optimieren mithilfe dieser Messwerte und Benachrichtigungen die Leistung Ihrer Umgebung.

Lernziele

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Nach Abschluss dieser Anleitung können Sie weitere Kosten durch Löschen von erstellten Ressourcen vermeiden. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

In diesem Abschnitt werden die Aktionen beschrieben, die vor dem Start der Anleitung erforderlich sind.

Projekt erstellen und konfigurieren

Für diese Anleitung benötigen Sie ein Google Cloud-Projekt. Konfigurieren Sie das Projekt so:

  1. Wählen Sie in der Google Cloud Console ein Projekt aus oder erstellen Sie eines:

    Zur Projektauswahl

  2. Die Abrechnung für Ihr Projekt muss aktiviert sein. Hier erfahren Sie, wie Sie prüfen, ob die Abrechnung für ein Projekt aktiviert ist.

  3. Sorgen Sie dafür, dass Ihr Google Cloud-Projektnutzer die folgenden Rollen hat, um die erforderlichen Ressourcen zu erstellen:

    • Administrator für Umgebung und Storage-Objekte (roles/composer.environmentAndStorageObjectAdmin)
    • Compute-Administrator (roles/compute.admin)
    • Monitoring-Bearbeiter (roles/monitoring.editor)

Die APIs für Ihr Projekt aktivieren

Cloud Composer API aktivieren.

Aktivieren Sie die API

Cloud Composer-Umgebung erstellen

Erstellen Sie eine Cloud Composer 2-Umgebung.

Im Rahmen dieser Vorgehensweise gewähren Sie dem Composer-Dienst-Agent-Konto die Rolle Dienst-Agent-Erweiterung für Cloud Composer v2 API (roles/composer.ServiceAgentV2Ext). Cloud Composer verwendet dieses Konto, um Vorgänge in Ihrem Google Cloud-Projekt auszuführen.

Wichtige Messwerte für Zustand und Leistung der Umgebung entdecken

In dieser Anleitung geht es vorrangig um die wichtigsten Messwerte, die Ihnen einen guten Überblick über den allgemeinen Zustand und die Leistung Ihrer Umgebung geben.

Das Monitoring-Dashboard in der Google Cloud Console enthält eine Vielzahl von Messwerten und Diagrammen, mit denen Sie Trends in Ihrer Umgebung beobachten und Probleme mit Airflow-Komponenten und Cloud Composer-Ressourcen erkennen können.

Jede Cloud Composer-Umgebung hat ein eigenes Monitoring-Dashboard.

Machen Sie sich mit den folgenden wichtigen Messwerten vertraut und suchen Sie sie im Monitoring-Dashboard:

  1. Rufen Sie in der Google Cloud Console die Seite Umgebungen auf.

    Zur Seite Umgebungen“

  2. Klicken Sie in der Liste der Umgebungen auf den Namen Ihrer Umgebung. Die Seite Umgebungsdetails wird geöffnet.

  3. Rufen Sie den Tab Monitoring auf.

  4. Wählen Sie den Abschnitt Übersicht aus, suchen Sie auf dem Dashboard das Element Umgebungsübersicht und beobachten Sie den Messwert Umgebungsstatus (Airflow-Monitoring-DAG).

    • Diese Zeitachse zeigt den Status der Cloud Composer-Umgebung. Die grüne Farbe der Leiste zum Status der Umgebung zeigt an, dass die Umgebung gesund ist, während der Umgebungsstatus rot markiert ist.

    • Alle paar Minuten führt Cloud Composer einen Aktivitäts-DAG namens airflow_monitoring aus. Wenn die Ausführung des Aktivitäts-DAG erfolgreich abgeschlossen wurde, lautet der Systemstatus True. Wenn die Ausführung des Aktivitäts-DAG fehlschlägt (z. B. aufgrund einer Pod-Bereinigung, Beendigung eines externen Prozesses oder einer Wartung), lautet der Systemstatus False.

  5. Wählen Sie den Bereich SQL-Datenbank aus, suchen Sie im Dashboard nach dem Element Datenbankzustand und beobachten Sie den Messwert Datenbankzustand.

    • Diese Zeitachse zeigt den Status der Verbindung zur Cloud SQL-Instanz Ihrer Umgebung. Die grüne Leiste mit dem Datenbankstatus zeigt die Verbindung an, während Verbindungsfehler rot angezeigt werden.

    • Der Airflow-Monitoring-Pod pingt die Datenbank regelmäßig an und meldet den Systemstatus als True, wenn eine Verbindung hergestellt werden kann, oder als False, wenn nicht.

  6. Beobachten Sie im Element Datenbankzustand die Messwerte CPU-Nutzung der Datenbank und Arbeitsspeichernutzung der Datenbank.

    • Im Diagramm zur CPU-Nutzung der Datenbank wird die Nutzung von CPU-Kernen durch die Cloud SQL-Datenbankinstanzen Ihrer Umgebung im Vergleich zum gesamten verfügbaren CPU-Limit der Datenbank angezeigt.

    • Im Diagramm zur Arbeitsspeichernutzung der Datenbank wird die Arbeitsspeichernutzung durch die Cloud SQL-Datenbankinstanzen Ihrer Umgebung im Verhältnis zum insgesamt verfügbaren Arbeitsspeicherlimit der Datenbank angezeigt.

  7. Wählen Sie den Abschnitt Schedulers (Planer) aus, suchen Sie im Dashboard nach Scheduler Heartbeat und beobachten Sie den Messwert Scheduler Heartbeat.

    • Diese Zeitachse zeigt den Zustand des Airflow-Planers. Suchen Sie nach roten Bereichen, um Probleme mit Airflow-Planern zu identifizieren. Wenn Ihre Umgebung mehr als einen Planer hat, ist der Heartbeat-Status fehlerfrei, solange mindestens einer der Planer antwortet.

    • Der Planer gilt als fehlerhaft, wenn der letzte Herzschlag mehr als 30 Sekunden (Standardwert) vor der aktuellen Zeit empfangen wurde.

  8. Wählen Sie den Abschnitt DAG-Statistiken aus, suchen Sie im Dashboard das Element Zombie Tasks killed und beobachten Sie den Messwert Zombie Tasks killed.

    • Dieses Diagramm zeigt die Anzahl der in einem kurzen Zeitfenster beendeten Zombie-Aufgaben. Zombie-Aufgaben werden häufig durch die externe Beendigung von Airflow-Prozessen verursacht (z. B. wenn der Prozess einer Aufgabe beendet wird).

    • Der Airflow-Planer beendet Zombie-Aufgaben regelmäßig, was in diesem Diagramm dargestellt wird.

  9. Wählen Sie den Abschnitt Workers (Worker) aus, suchen Sie im Dashboard nach dem Element Worker container Neustarts und beobachten Sie den Messwert Neustart von Worker-Containern.

    • Ein Diagramm zeigt die Gesamtzahl der Neustarts für einzelne Worker-Container. Zu viele Containerneustarts können die Verfügbarkeit Ihres Dienstes oder anderer nachgelagerter Dienste beeinträchtigen, die ihn als Abhängigkeit verwenden.

Benchmarks und mögliche Korrekturmaßnahmen für wichtige Messwerte kennenlernen

In der folgenden Liste werden Benchmarkwerte beschrieben, die auf Probleme hinweisen können, sowie Korrekturmaßnahmen, die Sie ergreifen können, um diese Probleme zu beheben.

  • Umgebungszustand (Airflow-Monitoring-DAG)

    • Eine Erfolgsquote von weniger als 90% über einen Zeitraum von 4 Stunden

    • Ausfälle können Pod-Bereinigungen oder Beendigungen von Workern bedeuten, da die Umgebung überlastet ist oder nicht richtig funktioniert. Rote Bereiche auf der Zeitachse für den Umgebungsstatus korrelieren in der Regel mit roten Bereichen in den anderen Statusbalken der einzelnen Umgebungskomponenten. Ermitteln Sie die Ursache, indem Sie andere Messwerte im Monitoring-Dashboard überprüfen.

  • Datenbankstatus

    • Eine Erfolgsquote von weniger als 95% über einen Zeitraum von 4 Stunden

    • Fehler bedeuten, dass es Probleme mit der Verbindung zur Airflow-Datenbank gibt. Diese können auf einen Datenbankabsturz oder eine Ausfallzeit zurückzuführen sein, da die Datenbank überlastet ist (z. B. aufgrund einer hohen CPU- oder Arbeitsspeichernutzung oder einer höheren Latenz beim Herstellen einer Verbindung zur Datenbank). Diese Symptome werden am häufigsten durch suboptimale DAGs verursacht, z. B. wenn DAGs viele global definierte Airflow- oder Umgebungsvariablen verwenden. Ermitteln Sie die Ursache, indem Sie die Messwerte zur Ressourcennutzung der SQL-Datenbank prüfen. Sie können auch die Planerlogs auf Fehler im Zusammenhang mit der Datenbankverbindung prüfen.

  • CPU- und Arbeitsspeichernutzung der Datenbank

    • Mehr als 80% der durchschnittlichen CPU- oder Arbeitsspeichernutzung innerhalb eines 12-Stunden-Fensters

    • Die Datenbank ist möglicherweise überlastet. Analysieren Sie die Korrelation zwischen Ihren DAG-Ausführungen und Spitzen bei der CPU- oder Arbeitsspeichernutzung für Datenbanken.

  • Planer-Heartbeat

    • Eine Erfolgsquote von weniger als 90% über einen Zeitraum von 4 Stunden

    • Weisen Sie dem Planer weitere Ressourcen zu oder erhöhen Sie die Anzahl der Planer von 1 auf 2 (empfohlen).

  • Zombie-Aufgaben gelöscht

    • Mehr als eine Zombie-Aufgabe pro 24 Stunden

    • Der häufigste Grund für Zombie-Aufgaben ist ein Mangel an CPU- oder Arbeitsspeicherressourcen im Cluster Ihrer Umgebung. Sehen Sie sich die Diagramme zur Worker-Ressourcennutzung an und weisen Sie den Workern mehr Ressourcen zu. Sie können auch das Zeitlimit für Zombie-Aufgaben erhöhen, damit der Planer eine Aufgabe länger als Zombie betrachtet.

  • Neustarts von Worker-Containern

    • Mehr als ein Neustart pro 24 Stunden

    • Der häufigste Grund ist ein Mangel an Worker-Arbeitsspeicher oder -Speicher. Prüfen Sie den Verbrauch von Worker-Ressourcen und weisen Sie Ihren Workern mehr Arbeitsspeicher oder Speicherplatz zu. Wenn Ressourcenmangel nicht der Grund sind, lesen Sie die Informationen unter Fehlerbehebung bei Vorfällen beim Neustart von Workern und suchen Sie mithilfe von Logging-Abfragen nach den Gründen für Neustarts von Workern.

Benachrichtigungskanäle erstellen

Folgen Sie der Anleitung unter Benachrichtigungskanal erstellen, um einen E-Mail-Benachrichtigungskanal zu erstellen.

Weitere Informationen zu Benachrichtigungskanälen finden Sie unter Benachrichtigungskanäle verwalten.

Benachrichtigungsrichtlinien erstellen

Erstellen Sie Benachrichtigungsrichtlinien auf der Grundlage der Benchmarks, die in den vorherigen Abschnitten dieser Anleitung bereitgestellt wurden, um die Werte von Messwerten kontinuierlich zu überwachen und Benachrichtigungen zu erhalten, wenn diese Messwerte gegen eine Bedingung verstoßen.

Console

Sie können Benachrichtigungen für jeden Messwert einrichten, der im Monitoring-Dashboard angezeigt wird. Klicken Sie dazu auf das Glockensymbol in der Ecke des entsprechenden Elements:

Benachrichtigung für einen Messwert erstellen, der im Monitoring-Dashboard angezeigt wird
Abbildung 1. Benachrichtigung für einen Messwert erstellen, der auf dem Monitoring-Dashboard angezeigt wird (zum Vergrößern klicken)
  1. Suchen Sie im Monitoring-Dashboard nach jedem Messwert, den Sie beobachten möchten, und klicken Sie in der Ecke des Messwertelements auf das Glockensymbol. Die Seite Benachrichtigungsrichtlinie erstellen wird geöffnet.

  2. Im Abschnitt Daten transformieren:

    1. Konfigurieren Sie den Abschnitt Innerhalb jeder Zeitreihe wie in der Konfiguration der Benachrichtigungsrichtlinien für den Messwert beschrieben.

    2. Klicken Sie auf Weiter und konfigurieren Sie den Abschnitt Trigger für Benachrichtigungen konfigurieren wie in der Konfiguration der Benachrichtigungsrichtlinien für den Messwert beschrieben.

  3. Klicken Sie auf Weiter.

  4. Konfigurieren Sie die Benachrichtigungen. Maximieren Sie das Menü Benachrichtigungskanäle und wählen Sie die Benachrichtigungskanäle aus, die Sie im vorherigen Schritt erstellt haben.

  5. Klicken Sie auf OK.

  6. Füllen Sie im Abschnitt Benachrichtigungsrichtlinie benennen das Feld Name der Benachrichtigungsrichtlinie aus. Verwenden Sie für jeden Messwert einen aussagekräftigen Namen. Verwenden Sie den Wert „Benachrichtigungsrichtlinie benennen“, wie in der Konfiguration der Benachrichtigungsrichtlinien für den Messwert beschrieben.

  7. Klicken Sie auf Weiter.

  8. Überprüfen Sie die Benachrichtigungsrichtlinie und klicken Sie auf Richtlinie erstellen.

Messwert für den Umgebungsstatus (Airflow-Monitoring-DAG) – Konfigurationen der Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – fehlerfrei
  • API: composer.googleapis.com/environment/healthy
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Fenster: Benutzerdefiniert
    • Benutzerdefinierter Wert: 4
    • Benutzerdefinierte Einheiten: Stunde(n)
    • Funktion des rollierenden Fensters: Bruchteil wahr
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: unter Grenzwert
    • Grenzwert: 90
    • Bedingungsname: Bedingung des Umgebungszustands
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie „Airflow Environment Health“.

Messwert zum Datenbankzustand – Konfigurationen von Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – Datenbank fehlerfrei
  • API: composer.googleapis.com/environment/database_health
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Fenster: Benutzerdefiniert
    • Benutzerdefinierter Wert: 4
    • Benutzerdefinierte Einheiten: Stunde(n)
    • Funktion des rollierenden Fensters: Bruchteil wahr
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: unter Grenzwert
    • Grenzwert: 95
    • Bedingungsname: Zustand der Datenbank
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: Airflow-Datenbankzustand

Messwert zur CPU-Nutzung der Datenbank – Konfigurationen der Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – CPU-Auslastung der Datenbank
  • API: composer.googleapis.com/environment/database/cpu/utilization
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Fenster: Benutzerdefiniert
    • Benutzerdefinierter Wert: 12
    • Benutzerdefinierte Einheiten: Stunde(n)
    • Funktion des rollierenden Fensters: Mittelwert
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: über Grenzwert
    • Grenzwert: 80
    • Bedingungsname: CPU-Nutzungsbedingung der Datenbank
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: CPU-Nutzung der Airflow-Datenbank

Messwert zur CPU-Nutzung der Datenbank – Konfigurationen der Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – Auslastung des Datenbankarbeitsspeichers
  • API: composer.googleapis.com/environment/database/memory/utilization
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Fenster: Benutzerdefiniert
    • Benutzerdefinierter Wert: 12
    • Benutzerdefinierte Einheiten: Stunde(n)
    • Funktion des rollierenden Fensters: Mittelwert
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: über Grenzwert
    • Grenzwert: 80
    • Bedingungsname: Bedingung für die Arbeitsspeichernutzung der Datenbank
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: Arbeitsspeichernutzung der Airflow-Datenbank

Messwert für Planer-Heartbeats – Konfigurationen von Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – Planer-Heartbeats
  • API: composer.googleapis.com/environment/scheduler_heartbeat_count
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Fenster: Benutzerdefiniert
    • Benutzerdefinierter Wert: 4
    • Benutzerdefinierte Einheiten: Stunde(n)
    • Funktion für rollierendes Fenster: Anzahl
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: unter Grenzwert
    • Grenzwert: 216

      1. Sie können diese Zahl ermitteln, indem Sie eine Abfrage ausführen, bei der der Wert _scheduler_heartbeat_count_mean im Metrics Explorer-Abfrageeditor zusammengefasst wird.
    • Bedingungsname: Planer-Heartbeat-Bedingung

  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: Airflow Scheduler Heartbeat

Messwert für beendete Zombie-Aufgaben – Konfigurationen von Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – Beendete Zombie-Aufgaben
  • API: composer.googleapis.com/environment/zombie_task_killed_count
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Zeitfenster: 1 Tag
    • Funktion des rollierenden Fensters: Summe
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: über Grenzwert
    • Grenzwert: 1
    • Bedingungsname: Zombie-Aufgabenbedingung
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: Airflow-Zombie-Tasks

Messwert für Worker-Containerneustarts – Konfigurationen von Benachrichtigungsrichtlinien

  • Messwertname: Cloud Composer-Umgebung – Beendete Zombie-Aufgaben
  • API: composer.googleapis.com/environment/zombie_task_killed_count
  • Filter:

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Daten transformieren > Innerhalb jeder Zeitreihe:

    • Rollierendes Zeitfenster: 1 Tag
    • Funktion des rollierenden Fensters: Summe
  • Konfigurieren Sie den Benachrichtigungstrigger:

    • Bedingungstypen: Grenzwert
    • Trigger für Benachrichtigung: „Any timeseries verstößt“
    • Grenzwertposition: über Grenzwert
    • Grenzwert: 1
    • Bedingungsname: Zombie-Aufgabenbedingung
  • Konfigurieren Sie Benachrichtigungen und schließen Sie die Benachrichtigung ab:

    • Benennen Sie die Benachrichtigungsrichtlinie: Airflow-Zombie-Tasks

Terraform

Führen Sie ein Terraform-Skript aus, das einen E-Mail-Benachrichtigungskanal erstellt und Benachrichtigungsrichtlinien für die wichtigsten in dieser Anleitung angegebenen Messwerte anhand ihrer jeweiligen Benchmarks hochlädt:

  1. Speichern Sie die Terraform-Beispieldatei auf Ihrem lokalen Computer.
  2. Ersetzen Sie Folgendes:

    • PROJECT_ID: die Projekt-ID Ihres Projekts. Beispiel: example-project
    • EMAIL_ADDRESS: Die E-Mail-Adresse, die benachrichtigt werden muss, wenn eine Benachrichtigung ausgelöst wird.
    • ENVIRONMENT_NAME: Name Ihrer Cloud Composer-Umgebung. Beispiel: example-composer-environment.
    • CLUSTER_NAME: Name des Umgebungsclusters, der in der Google Cloud Console unter Umgebungskonfiguration > Ressourcen > GKE-Cluster zu finden ist.
resource "google_monitoring_notification_channel" "basic" {
  project      = "PROJECT_ID"
  display_name = "Test Notification Channel"
  type         = "email"
  labels = {
    email_address = "EMAIL_ADDRESS"
  }
  # force_delete = false
}

resource "google_monitoring_alert_policy" "environment_health_metric" {
  project      = "PROJECT_ID"
  display_name = "Airflow Environment Health"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Environment health condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/healthy\" AND resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_LT"
      threshold_value = 0.9
      aggregations {
        alignment_period   = "14400s"
        per_series_aligner = "ALIGN_FRACTION_TRUE"
      }
    }
  }

}

resource "google_monitoring_alert_policy" "database_health_metric" {
  project      = "PROJECT_ID"
  display_name = "Airflow Database Health"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Database health condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/database_health\" AND resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_LT"
      threshold_value = 0.95
      aggregations {
        alignment_period   = "14400s"
        per_series_aligner = "ALIGN_FRACTION_TRUE"
      }
    }
  }
}

resource "google_monitoring_alert_policy" "alert_database_cpu_usage" {
  project      = "PROJECT_ID"
  display_name = "Airflow Database CPU Usage"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Database CPU usage condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/database/cpu/utilization\" AND resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_GT"
      threshold_value = 80
      aggregations {
        alignment_period   = "43200s"
        per_series_aligner = "ALIGN_MEAN"
      }
    }
  }
}

resource "google_monitoring_alert_policy" "alert_database_memory_usage" {
  project      = "PROJECT_ID"
  display_name = "Airflow Database Memory Usage"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Database memory usage condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/database/memory/utilization\" AND resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_GT"
      threshold_value = 80
      aggregations {
        alignment_period   = "43200s"
        per_series_aligner = "ALIGN_MEAN"
      }
    }
  }
}

resource "google_monitoring_alert_policy" "alert_scheduler_heartbeat" {
  project      = "PROJECT_ID"
  display_name = "Airflow Scheduler Heartbeat"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Scheduler heartbeat condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/scheduler_heartbeat_count\" AND resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_LT"
      threshold_value = 216 // Threshold is 90% of the average for composer.googleapis.com/environment/scheduler_heartbeat_count metric in an idle environment
      aggregations {
        alignment_period   = "14400s"
        per_series_aligner = "ALIGN_COUNT"
      }
    }
  }
}

resource "google_monitoring_alert_policy" "alert_zombie_task" {
  project      = "PROJECT_ID"
  display_name = "Airflow Zombie Tasks"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Zombie tasks condition"
    condition_threshold {
      filter     = "resource.type = \"cloud_composer_environment\" AND metric.type=\"composer.googleapis.com/environment/zombie_task_killed_count\" AND  resource.label.environment_name=\"ENVIRONMENT_NAME\""
      duration   = "60s"
      comparison = "COMPARISON_GT"
      threshold_value = 1
      aggregations {
        alignment_period   = "86400s"
        per_series_aligner = "ALIGN_SUM"
      }
    }
  }
}

resource "google_monitoring_alert_policy" "alert_worker_restarts" {
  project      = "PROJECT_ID"
  display_name = "Airflow Worker Restarts"
  combiner     = "OR"
  notification_channels = [google_monitoring_notification_channel.basic.name] // To manually add a notification channel add it with the syntax "projects/[PROJECT_ID]/notificationChannels/[CHANNEL_ID]"
  conditions {
    display_name = "Worker container restarts condition"
    condition_threshold {
      filter     = "resource.type = \"k8s_container\" AND (resource.labels.cluster_name = \"CLUSTER_NAME\" AND resource.labels.container_name = monitoring.regex.full_match(\"airflow-worker|base\") AND resource.labels.pod_name = monitoring.regex.full_match(\"airflow-worker-.*|airflow-k8s-worker-.*\")) AND metric.type = \"kubernetes.io/container/restart_count\""

      duration   = "60s"
      comparison = "COMPARISON_GT"
      threshold_value = 1
      aggregations {
        alignment_period   = "86400s"
        per_series_aligner = "ALIGN_RATE"
      }
    }
  }
}

Benachrichtigungsrichtlinien testen

In diesem Abschnitt wird beschrieben, wie Sie die erstellten Benachrichtigungsrichtlinien testen und die Ergebnisse interpretieren.

Beispiel-DAG hochladen

Der in dieser Anleitung angegebene Beispiel-DAG memory_consumption_dag.py imitiert die intensive Worker-Arbeitsspeicherauslastung. Der DAG enthält 4 Aufgaben, die jeweils Daten in einen Beispielstring schreiben und 380 MB Arbeitsspeicher belegen. Der Beispiel-DAG wird alle zwei Minuten ausgeführt und beginnt automatisch, sobald Sie ihn in Ihre Composer-Umgebung hochladen.

Laden Sie den folgenden Beispiel-DAG in die Umgebung hoch, die Sie in den vorherigen Schritten erstellt haben:

from datetime import datetime
import sys
import time

from airflow import DAG
from airflow.operators.python import PythonOperator


def ram_function():
    data = ""
    start = time.time()
    for i in range(38):
        data += "a" * 10 * 1000**2
        time.sleep(0.2)
        print(f"{i}, {round(time.time() - start, 4)}, {sys.getsizeof(data) / (1000 ** 3)}")
    print(f"Size={sys.getsizeof(data) / (1000 ** 3)}GB")
    time.sleep(30 - (time.time() - start))
    print(f"Complete in {round(time.time() - start, 2)} seconds!")


with DAG(
    dag_id="memory_consumption_dag",
    start_date=datetime(2023, 1, 1, 1, 1, 1),
    schedule="1/2 * * * *",
    catchup=False,
) as dag:
    for i in range(4):
        PythonOperator(
            task_id=f"task_{i+1}",
            python_callable=ram_function,
            retries=0,
            dag=dag,
        )

Benachrichtigungen und Messwerte in Monitoring interpretieren

Warten Sie nach Beginn der Ausführung des Beispiel-DAG etwa 10 Minuten und werten Sie die Testergebnisse aus:

  1. Sehen Sie in Ihrem E-Mail-Postfach nach, ob Sie eine Benachrichtigung von Google Cloud-Benachrichtigungen mit dem Betreff [ALERT] erhalten haben. Der Inhalt dieser Nachricht enthält die Details zum Vorfall in der Benachrichtigungsrichtlinie.

  2. Klicken Sie in der E-Mail-Benachrichtigung auf die Schaltfläche Vorfall ansehen. Sie werden zum Metrics Explorer weitergeleitet. Überprüfen Sie die Details des Benachrichtigungsvorfalls:

    Details zum Benachrichtigungsvorfall
    Abbildung 2. Details zum Benachrichtigungsvorfall (zum Vergrößern klicken)

    Das Diagramm mit den Vorfallsmesswerten zeigt an, dass die von Ihnen erstellten Messwerte den Grenzwert von 1 überschritten haben, was bedeutet, dass Airflow mehr als 1 Zombieaufgabe erkannt und beendet hat.

  3. Wechseln Sie in Ihrer Cloud Composer-Umgebung zum Tab Monitoring, öffnen Sie den Abschnitt DAG-Statistiken und suchen Sie die Grafik Zombie-Aufgaben beendet:

    Grafik zu Zombie-Aufgaben
    Abbildung 3. Grafik zu Zombie-Aufgaben (zum Vergrößern klicken)

    Das Diagramm zeigt, dass Airflow nur innerhalb der ersten 10 Minuten nach Ausführung des Beispiel-DAG etwa 20 Zombie-Aufgaben beendet hat.

  4. Laut Benchmarks und Korrekturmaßnahmen ist der häufigste Grund für Zombie-Aufgaben ein Mangel an Worker-Arbeitsspeicher oder CPU-Leistung. Analysieren Sie die Auslastung Ihrer Worker-Ressourcen, um die Ursache von Zombie-Aufgaben zu ermitteln.

    Öffnen Sie in Ihrem Monitoring-Dashboard den Abschnitt "Worker" (Worker) und überprüfen Sie die Messwerte für die CPU- und Arbeitsspeichernutzung der Worker:

    Worker-Messwerte zur CPU- und Arbeitsspeichernutzung
    Abbildung 4: Messwerte zur Worker-CPU- und Arbeitsspeichernutzung (zum Vergrößern klicken)

    Das Diagramm zur gesamten CPU-Nutzung der Worker zeigt an, dass die CPU-Auslastung durch die Worker jederzeit unter 50% des gesamten verfügbaren Limits lag. Daher ist die verfügbare CPU ausreichend. Das Diagramm zur Arbeitsspeichernutzung der Worker insgesamt zeigt, dass beim Ausführen des Beispiel-DAG das Limit für den zuweisbaren Arbeitsspeicher erreicht wurde, das fast 75% des in der Grafik angezeigten Gesamtarbeitsspeichers entspricht. GKE reserviert 25% der ersten 4 GiB Arbeitsspeicher und zusätzliche 100 MiB Arbeitsspeicher auf jedem Knoten, um die Pod-Bereinigung durchzuführen.

    Sie können daraus schließen, dass die Worker nicht über die erforderlichen Arbeitsspeicherressourcen verfügen, um den Beispiel-DAG erfolgreich auszuführen.

Umgebung optimieren und Leistung bewerten

Basierend auf der Analyse der Worker-Ressourcennutzung müssen Sie Ihren Workern mehr Arbeitsspeicher zuweisen, damit alle Aufgaben in Ihrem DAG erfolgreich sind.

  1. Öffnen Sie in Ihrer Composer-Umgebung den Tab DAGs, klicken Sie auf den Namen des Beispiel-DAG (memory_consumption_dag) und dann auf DAG pausieren.

  2. Zusätzlichen Worker-Arbeitsspeicher zuweisen:

    1. Suchen Sie auf dem Tab „Umgebungskonfiguration“ die Konfiguration Ressourcen > Arbeitslasten und klicken Sie auf Bearbeiten.

    2. Erhöhen Sie im Element Worker das Arbeitsspeicherlimit. Verwenden Sie in dieser Anleitung 3,25 GB.

    3. Speichern Sie die Änderungen und warten Sie einige Minuten, bis der Worker neu gestartet wird.

  3. Öffnen Sie den Tab „DAGs“, klicken Sie auf den Namen des Beispiel-DAG (memory_consumption_dag) und dann auf Pausieren des DAG aufheben.

Rufen Sie Monitoring auf und prüfen Sie, ob nach der Aktualisierung der Worker-Ressourcenlimits keine neuen Zombie-Aufgaben angezeigt wurden:

Grafik zu Zombie-Aufgaben nach Änderung des Arbeitsspeicherlimits
Abbildung 5. Grafik der Zombie-Aufgaben nach Änderung des Arbeitsspeicherlimits (zum Vergrößern klicken)

Zusammenfassung

In dieser Anleitung haben Sie die wichtigsten Zustands- und Leistungsmesswerte auf Umgebungsebene kennengelernt, Benachrichtigungsrichtlinien für jeden Messwert eingerichtet und jeden Messwert als Korrekturmaßnahmen interpretiert. Anschließend haben Sie einen Beispiel-DAG ausgeführt, die Ursache von Umgebungsproblemen mithilfe von Benachrichtigungen und Monitoring-Diagrammen identifiziert und Ihre Umgebung optimiert, indem Sie Ihren Workern mehr Arbeitsspeicher zugewiesen haben. Es wird jedoch empfohlen, Ihre DAGs zu optimieren, um den Verbrauch der Worker-Ressourcen von vornherein zu reduzieren, da es nicht möglich ist, die Ressourcen über einen bestimmten Schwellenwert hinaus zu erhöhen.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt bei und löschen Sie die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Einzelne Ressourcen löschen

Wenn Sie mehrere Anleitungen und Kurzanleitungen durcharbeiten möchten, können Sie die Überschreitung von Projektkontingenten verhindern, indem Sie Projekte wiederverwenden.

Console

  1. Löschen Sie die Cloud Composer-Umgebung. Während dieses Vorgangs löschen Sie auch den Bucket der Umgebung.
  2. Löschen Sie alle Benachrichtigungsrichtlinien, die Sie in Cloud Monitoring erstellt haben.

Terraform

  1. Achten Sie darauf, dass Ihr Terraform-Skript keine Einträge für Ressourcen enthält, die noch für Ihr Projekt benötigt werden. Beispielsweise können Sie einige APIs aktiviert lassen und IAM-Berechtigungen zugewiesen lassen (wenn Sie solche Definitionen zu Ihrem Terraform-Skript hinzugefügt haben).
  2. Führen Sie terraform destroy aus.
  3. Löschen Sie den Bucket der Umgebung manuell. Cloud Composer löscht ihn nicht automatisch. Sie können dies über die Google Cloud Console oder die Google Cloud CLI tun.

Nächste Schritte