Surveillez l'état et les performances de l'environnement à l'aide de métriques clés dans le tableau de bord Monitoring

Cloud Composer 1 | Cloud Composer 2

Cette page explique comment surveiller l'état et les performances de l'environnement global Cloud Composer à l'aide de métriques clés dans le tableau de bord Monitoring.

Introduction

Ce tutoriel se concentre sur les principales métriques de surveillance de Cloud Composer qui peuvent fournir un bon aperçu de l'état et des performances au niveau de l'environnement.

Cloud Composer propose plusieurs métriques décrivant l'état général de l'environnement. Les consignes de surveillance de ce tutoriel sont basées sur les métriques exposées dans le tableau de bord Monitoring de votre environnement Cloud Composer.

Dans ce tutoriel, vous découvrirez les métriques clés servant de principaux indicateurs de problèmes de performances et de santé de votre environnement, ainsi que les consignes pour interpréter chaque métrique en actions correctives permettant de maintenir un environnement sain. Vous allez également définir des règles d'alerte pour chaque métrique, exécuter l'exemple de DAG, et utiliser ces métriques et alertes pour optimiser les performances de votre environnement.

Objectifs

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez Effectuer un nettoyage.

Avant de commencer

Cette section décrit les actions requises avant de commencer le tutoriel.

Créer et configurer un projet

Pour ce tutoriel, vous avez besoin d'un projet Google Cloud. Configurez le projet comme suit:

  1. Dans la console Google Cloud, sélectionnez ou créez un projet:

    Accéder au sélecteur de projet

  2. Assurez-vous que la facturation est activée pour votre projet. Découvrez comment vérifier si la facturation est activée sur un projet.

  3. Assurez-vous que l'utilisateur de votre projet Google Cloud dispose des rôles suivants pour créer les ressources nécessaires:

    • Administrateur de l'environnement et des objets Storage (roles/composer.environmentAndStorageObjectAdmin)
    • Administrateur de Compute (roles/compute.admin)
    • Éditeur Monitoring (roles/monitoring.editor)

Activer les API pour votre projet.

Activez l'API Cloud Composer

Activer l'API

Créer votre environnement Cloud Composer

Créez un environnement Cloud Composer 2.

Dans le cadre de cette procédure, vous attribuez le rôle Extension d'agent de service de l'API Cloud Composer v2 (roles/composer.ServiceAgentV2Ext) au compte d'agent de service Composer. Cloud Composer utilise ce compte pour effectuer des opérations dans votre projet Google Cloud.

Explorer les métriques clés pour l'état et les performances au niveau de l'environnement

Ce tutoriel porte sur les métriques clés qui peuvent vous donner un bon aperçu de l'état général et des performances de votre environnement.

Le tableau de bord Monitoring de la console Google Cloud contient une variété de métriques et de graphiques qui permettent de surveiller les tendances dans votre environnement et d'identifier les problèmes liés aux composants Airflow et aux ressources Cloud Composer.

Chaque environnement Cloud Composer possède son propre tableau de bord Monitoring.

Familiarisez-vous avec les métriques clés ci-dessous et localisez-les dans le tableau de bord Monitoring:

  1. Dans la console Google Cloud, accédez à la page Environnements.

    Accéder à la page Environnements

  2. Dans la liste des environnements, cliquez sur le nom de votre environnement. La page Détails de l'environnement s'ouvre.

  3. Accédez à l'onglet Surveillance.

  4. Sélectionnez la section Présentation, localisez l'élément Présentation de l'environnement sur le tableau de bord et examinez la métrique État de l'environnement (DAG de surveillance Airflow).

    • Cette chronologie indique l'état de l'environnement Cloud Composer. La couleur verte de la barre d'état de l'environnement indique que celui-ci est sain, tandis que l'état non sain est indiqué en rouge.

    • Toutes les quelques minutes, Cloud Composer exécute un DAG d'activité nommé airflow_monitoring. Si l'exécution du DAG d'activité se termine correctement, l'état de fonctionnement est True. Si l'exécution du DAG d'activité échoue (par exemple, en raison de l'éviction du pod, de l'arrêt d'un processus externe ou de la maintenance), l'état de fonctionnement est False.

  5. Sélectionnez la section Base de données SQL, localisez l'élément État de la base de données sur le tableau de bord et observez la métrique État de la base de données.

    • Cette chronologie indique l'état de la connexion à l'instance Cloud SQL de votre environnement. La barre d'état verte de la base de données indique la connectivité, tandis que les échecs de connexion sont indiqués en rouge.

    • Le pod de surveillance Airflow pingue régulièrement la base de données et indique l'état de fonctionnement True si une connexion peut être établie, ou False dans le cas contraire.

  6. Dans l'élément État de la base de données, observez les métriques Utilisation du processeur de la base de données et Utilisation de la mémoire de la base de données.

    • Le graphique d'utilisation du processeur de la base de données indique l'utilisation des cœurs de processeur par les instances de base de données Cloud SQL de votre environnement par rapport à la limite totale de processeur disponible pour la base de données.

    • Le graphique d'utilisation de la mémoire de la base de données indique l'utilisation de mémoire par les instances de base de données Cloud SQL de votre environnement par rapport à la limite totale de mémoire de la base de données disponible.

  7. Sélectionnez la section Schedulers (Programmeurs), localisez l'élément Scheduler Heartbeat (Périodicité cardiaque du programmeur) sur le tableau de bord et observez la métrique Scheduler heartbeat (Fréquence cardiaque du programmeur).

    • Cette chronologie indique l'état du programmeur Airflow. Recherchez des zones rouges pour identifier les problèmes liés au planificateur Airflow. Si votre environnement comporte plusieurs programmeurs, l'état des pulsations est opérationnel tant qu'au moins l'un des programmeurs répond.

    • Le programmeur est considéré comme non opérationnel si la dernière pulsation a été reçue plus de 30 secondes (valeur par défaut) avant l'heure actuelle.

  8. Sélectionnez la section Statistiques du DAG, recherchez l'élément Tâches zombies tuées sur le tableau de bord et observez la métrique Tâches zombies tuées.

    • Ce graphique indique le nombre de tâches zombies tuées dans un court laps de temps. Les tâches zombies sont souvent causées par l'arrêt externe des processus Airflow (par exemple, lorsque le processus d'une tâche est arrêté).

    • Comme indiqué dans ce graphique, le programmeur Airflow supprime régulièrement des tâches zombies.

  9. Sélectionnez la section Nœuds de calcul, localisez l'élément Redémarrages des conteneurs de nœuds de calcul sur le tableau de bord et observez la métrique Redémarrages des conteneurs de nœuds de calcul.

    • Un graphique indique le nombre total de redémarrages pour les conteneurs de nœuds de calcul individuels. Un trop grand nombre de redémarrages de conteneurs peut affecter la disponibilité de votre service ou d'autres services en aval qui l'utilisent comme dépendance.

Découvrez les benchmarks et les mesures correctives possibles pour les métriques clés.

La liste suivante décrit les valeurs d'analyse comparative pouvant indiquer des problèmes et propose des mesures correctives à prendre pour les résoudre.

  • État de l'environnement (DAG de surveillance Airflow)

    • Taux de réussite inférieur à 90% sur une période de quatre heures

    • Les défaillances peuvent entraîner l'éviction de pods ou l'arrêt des nœuds de calcul, car l'environnement est surchargé ou présente des dysfonctionnements. Les zones rouges sur la chronologie de l'état de l'environnement sont généralement corrélées aux zones rouges dans les autres barres d'état des composants individuels de l'environnement. Identifiez l'origine du problème en consultant d'autres métriques dans le tableau de bord Monitoring.

  • État de la base de données

    • Taux de réussite inférieur à 95% sur une période de quatre heures

    • Les échecs indiquent des problèmes de connectivité à la base de données Airflow, qui peuvent être dus à un plantage ou à un temps d'arrêt de la base de données, car celle-ci est surchargée (par exemple, en raison d'une utilisation élevée du processeur ou de la mémoire, ou d'une latence plus élevée lors de la connexion à la base de données). Ces symptômes sont le plus souvent causés par des DAG sous-optimaux, par exemple lorsque les DAG utilisent de nombreuses variables Airflow ou d'environnement définies globalement. Identifiez l'origine du problème en consultant les métriques d'utilisation des ressources de la base de données SQL. Vous pouvez également inspecter les journaux du programmeur à la recherche d'erreurs liées à la connectivité de la base de données.

  • Utilisation du processeur et de la mémoire de la base de données

    • Plus de 80% d'utilisation moyenne du processeur ou de la mémoire sur une période de 12 heures

    • La base de données est peut-être surchargée. Analysez la corrélation entre les exécutions de votre DAG et les pics d'utilisation du processeur ou de la mémoire de la base de données.

      • Vous pouvez réduire la charge de la base de données grâce à des DAG plus efficaces avec des requêtes et connexions optimisées pour l'exécution des requêtes, ou en répartissant la charge de manière plus uniforme au fil du temps.

      • Vous pouvez également allouer plus de processeurs ou de mémoire à la base de données. Les ressources de base de données sont contrôlées par la propriété de taille de l'environnement de votre environnement, et l'environnement doit être agrandi.

  • Pulsation du programmeur

    • Taux de réussite inférieur à 90% sur une période de quatre heures

    • Attribuez davantage de ressources au planificateur ou faites passer le nombre de planificateurs de 1 à 2 (recommandé).

  • Tâches zombie supprimées

    • Plus d'une tâche zombie toutes les 24 heures

    • La raison la plus courante des tâches zombies est le manque de ressources de processeur ou de mémoire dans le cluster de votre environnement. Examinez les graphiques d'utilisation des ressources des nœuds de calcul et attribuez-leur davantage de ressources, ou augmentez le délai avant expiration des tâches zombies de sorte que le planificateur attende plus longtemps avant de considérer une tâche comme un zombie.

  • Redémarrages de conteneurs de nœuds de calcul

    • Plusieurs redémarrages toutes les 24 heures

    • La cause la plus courante est un manque de mémoire ou de stockage des nœuds de calcul. Examinez la consommation des ressources des nœuds de calcul et allouez-leur davantage de mémoire ou d'espace de stockage. Si le manque de ressources n'est pas la raison, consultez la section Résoudre les problèmes de redémarrage des nœuds de calcul et utilisez les requêtes Logging pour découvrir les raisons de ces redémarrages.

Créer des canaux de notification

Suivez les instructions décrites dans la section Créer un canal de notification pour créer un canal de notification par e-mail.

Pour en savoir plus sur les canaux de notification, consultez Gérer les canaux de notification.

Créer des règles d'alerte

Créez des règles d'alerte basées sur les benchmarks fournis dans les sections précédentes de ce tutoriel pour surveiller en continu les valeurs des métriques et recevoir des notifications lorsque ces métriques ne respectent pas une condition.

Console

Vous pouvez configurer des alertes pour chaque métrique présentée dans le tableau de bord Monitoring en cliquant sur l'icône en forme de cloche dans le coin de l'élément correspondant:

Créer une alerte pour une métrique affichée dans le tableau de bord de surveillance
Figure 1 : Créer une alerte pour une métrique affichée sur le tableau de bord de surveillance (cliquez pour agrandir)
  1. Recherchez chaque métrique que vous souhaitez surveiller dans le tableau de bord Monitoring, puis cliquez sur l'icône en forme de cloche située dans le coin de l'élément de métrique. La page Créer une règle d'alerte s'ouvre.

  2. Dans la section Transform data (Transformer les données) :

    1. Configurez la section Dans chaque série temporelle comme décrit dans la section sur la configuration des règles d'alerte pour la métrique.

    2. Cliquez sur Suivant, puis configurez la section Configurer le déclencheur d'alerte comme décrit dans la configuration des règles d'alerte pour la métrique.

  3. Cliquez sur Suivant.

  4. Configurez les notifications. Développez le menu Canaux de notification et sélectionnez le ou les canaux de notification que vous avez créés à l'étape précédente.

  5. Cliquez sur OK.

  6. Dans la section Nom de la règle d'alerte, renseignez le champ Nom de la règle d'alerte. Attribuez un nom descriptif à chacune des métriques. Utilisez la valeur "Nom de la règle d'alerte" comme décrit dans la configuration des règles d'alerte pour la métrique.

  7. Cliquez sur Suivant.

  8. Examinez la règle d'alerte, puis cliquez sur Créer une règle.

Métrique sur l'état de l'environnement (DAG de surveillance Airflow) - Configurations des règles d'alerte

  • Nom de la métrique: Cloud Composer Environment - Healthy
  • API: composer.googleapis.com/environment/healthy
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Fenêtre glissante: personnalisée
    • Valeur personnalisée: 4
    • Unités personnalisées: heure(s)
    • Fenêtrage glissant: fraction true
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: en dessous du seuil
    • Valeur du seuil: 90
    • Nom de la condition: condition de l'environnement
  • Configurer les notifications et finaliser l'alerte:

    • Nommez la règle d'alerte: État de l'environnement Airflow

Métrique d'état de la base de données : configurations des règles d'alerte

  • Nom de la métrique: Cloud Composer Environment - Database Healthy
  • API: composer.googleapis.com/environment/database_health
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Fenêtre glissante: personnalisée
    • Valeur personnalisée: 4
    • Unités personnalisées: heure(s)
    • Fenêtrage glissant: fraction true
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: en dessous du seuil
    • Valeur du seuil: 95
    • Nom de la condition: condition d'état de la base de données
  • Configurer les notifications et finaliser l'alerte:

    • Nommer la règle d'alerte: État de la base de données Airflow

Métrique d'utilisation du processeur de la base de données : configurations des règles d'alerte

  • Nom de la métrique: Environment Cloud Composer Environment - Database CPU Utilization
  • API: composer.googleapis.com/environment/database/cpu/utilization
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Fenêtre glissante: personnalisée
    • Valeur personnalisée: 12
    • Unités personnalisées: heure(s)
    • Fenêtrage glissant: moyenne
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: au-dessus du seuil
    • Valeur du seuil: 80
    • Nom de la condition: condition d'utilisation du processeur de la base de données
  • Configurer les notifications et finaliser l'alerte:

    • Nommer la règle d'alerte: Utilisation du processeur de la base de données Airflow

Métrique d'utilisation du processeur de la base de données : configurations des règles d'alerte

  • Nom de la métrique: Environnement Cloud Composer – Utilisation de la mémoire de base de données
  • API: composer.googleapis.com/environment/database/memory/utilization
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Fenêtre glissante: personnalisée
    • Valeur personnalisée: 12
    • Unités personnalisées: heure(s)
    • Fenêtrage glissant: moyenne
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: au-dessus du seuil
    • Valeur du seuil: 80
    • Nom de la condition: condition d'utilisation de la mémoire de la base de données
  • Configurer les notifications et finaliser l'alerte:

    • Nommez la règle d'alerte: Utilisation de la mémoire de la base de données Airflow

Métrique de pulsations du programmeur - Configurations des règles d'alerte

  • Nom de la métrique: environnement Cloud Composer – Pulsations du programmeur
  • API: composer.googleapis.com/environment/scheduler_heartbeat_count
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Fenêtre glissante: personnalisée
    • Valeur personnalisée: 4
    • Unités personnalisées: heure(s)
    • Fenêtrage glissant: nombre
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: en dessous du seuil
    • Valeur du seuil: 216

      1. Pour obtenir ce nombre, exécutez une requête qui agrège la valeur _scheduler_heartbeat_count_mean dans l'éditeur de requête de l'explorateur de métriques.
    • Nom de la condition: condition de pulsation du programmeur

  • Configurer les notifications et finaliser l'alerte:

    • Nommer la règle d'alerte: Pulsation du programmeur Airflow

Métrique "Tâches zombies supprimées" – Configurations des règles d'alerte

  • Nom de la métrique: Cloud Composer Environment - Zombie Tasks Killed (Environnement Cloud Composer – Tâches zombies supprimées)
  • API: composer.googleapis.com/environment/zombie_task_killed_count
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Période glissante: 1 jour
    • Fenêtrage glissant: somme
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: au-dessus du seuil
    • Valeur du seuil: 1
    • Nom de la condition: condition des tâches zombies
  • Configurer les notifications et finaliser l'alerte:

    • Nommer la règle d'alerte: Tâches zombies Airflow

Métrique "Redémarrages des conteneurs de nœuds de calcul" - Configurations des règles d'alerte

  • Nom de la métrique: Cloud Composer Environment - Zombie Tasks Killed (Environnement Cloud Composer – Tâches zombies supprimées)
  • API: composer.googleapis.com/environment/zombie_task_killed_count
  • Filtres :

    environment_name = [ENVIRONMENT_NAME]
    location = [CLUSTER_LOCATION]
    
  • Transformer les données > dans chaque série temporelle:

    • Période glissante: 1 jour
    • Fenêtrage glissant: somme
  • Configurez le déclencheur d'alerte:

    • Types de conditions: seuil
    • Déclencheur d'alerte: à chaque infraction de série temporelle
    • Position du seuil: au-dessus du seuil
    • Valeur du seuil: 1
    • Nom de la condition: condition des tâches zombies
  • Configurer les notifications et finaliser l'alerte:

    • Nommer la règle d'alerte: Tâches zombies Airflow

Terraform

Exécutez un script Terraform qui crée un canal de notification par e-mail et importe des règles d'alerte pour les métriques clés fournies dans ce tutoriel en fonction de leurs benchmarks respectifs:

  1. Enregistrez l'exemple de fichier Terraform sur votre ordinateur local.
  2. Remplacez les éléments suivants :

    • PROJECT_ID: ID de projet de votre projet. Exemple :example-project
    • EMAIL_ADDRESS: adresse e-mail à avertir si une alerte est déclenchée.
    • ENVIRONMENT_NAME: nom de votre environnement Cloud Composer. Exemple :example-composer-environment
    • CLUSTER_NAME: nom de votre cluster d'environnement, disponible sous Configuration de l'environnement > Ressources > Cluster GKE dans la console Google Cloud.
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"
      }
    }
  }
}

Tester les règles d'alerte

Cette section explique comment tester les règles d'alerte créées et interpréter les résultats.

Importer un exemple de DAG

L'exemple de DAG memory_consumption_dag.py fourni dans ce tutoriel imite l'utilisation intensive de la mémoire du nœud de calcul. Le DAG contient quatre tâches, chacune d'entre elles écrit des données dans un exemple de chaîne, ce qui consomme 380 Mo de mémoire. L'exemple de DAG est programmé pour s'exécuter toutes les deux minutes. Il commencera à s'exécuter automatiquement une fois que vous l'aurez importé dans votre environnement Composer.

Importez l'exemple de DAG suivant dans l'environnement que vous avez créé aux étapes précédentes:

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,
        )

Interpréter les alertes et les métriques dans Monitoring

Attendez environ 10 minutes après le début de l'exécution de l'exemple de DAG et évaluez les résultats du test:

  1. Consultez votre boîte de réception pour vérifier que vous avez bien reçu une notification des alertes Google Cloud dont l'objet commence par [ALERT]. Le contenu de ce message contient les détails de l'incident concernant la règle d'alerte.

  2. Cliquez sur le bouton Afficher l'incident dans la notification par e-mail. Vous êtes redirigé vers l'Explorateur de métriques. Examinez les détails de l'incident d'alerte:

    Détails de l'incident d'alerte
    Figure 2 : Détails de l'incident d'alerte (cliquez pour agrandir)

    Le graphique des métriques d'incident indique que les métriques que vous avez créées ont dépassé le seuil de 1, ce qui signifie qu'Airflow a détecté et supprimé plusieurs tâches zombies.

  3. Dans votre environnement Cloud Composer, accédez à l'onglet Surveillance, ouvrez la section Statistiques du DAG et recherchez le graphique Tâches zombies tuées:

    Graphique des tâches zombies
    Figure 3 : Graphique des tâches zombies (cliquez pour agrandir)

    Le graphique indique qu'Airflow a supprimé environ 20 tâches zombies dans les 10 premières minutes qui ont suivi l'exécution de l'exemple de DAG.

  4. D'après les analyses comparatives et les actions correctives, la cause la plus courante de tâches zombies est le manque de mémoire ou de processeur de nœud de calcul. Identifiez la cause première des tâches zombies en analysant l'utilisation des ressources de vos nœuds de calcul.

    Ouvrez la section "Nœuds de calcul" de votre tableau de bord Monitoring et examinez les métriques d'utilisation du processeur et de la mémoire des nœuds de calcul:

    Métriques d'utilisation du processeur et de la mémoire des nœuds de calcul
    Figure 4 : Métriques d'utilisation du processeur et de la mémoire des nœuds de calcul (cliquez pour agrandir)

    Le graphique d'utilisation totale du processeur par nœud de calcul indique que l'utilisation du processeur par nœud de calcul était inférieure à 50% de la limite totale disponible à tout moment. Le processeur disponible est donc suffisant. Le graphique d'utilisation totale de la mémoire des nœuds de calcul montre que l'exécution de l'exemple de DAG a entraîné l'atteinte de la limite de mémoire pouvant être allouée, qui correspond à près de 75% de la limite de mémoire totale indiquée sur le graphique (GKE réserve 25% des 4 premiers Gio de mémoire et 100 Mio de mémoire supplémentaires sur chaque nœud pour gérer l'éviction des pods).

    Vous pouvez en conclure que les nœuds de calcul ne disposent pas des ressources de mémoire nécessaires pour exécuter l'exemple de DAG.

Optimiser votre environnement et évaluer ses performances

Sur la base de l'analyse de l'utilisation des ressources de nœuds de calcul, vous devez allouer plus de mémoire à vos nœuds de calcul pour que toutes les tâches de votre DAG aboutissent.

  1. Dans votre environnement Composer, ouvrez l'onglet DAG, cliquez sur le nom de l'exemple de DAG (memory_consumption_dag), puis sur Pause DAG (Suspendre le DAG).

  2. Allouez de la mémoire de nœud de calcul supplémentaire:

    1. Dans l'onglet de configuration de l'environnement, accédez à Resources > Workloads configuration (Ressources > Configuration des charges de travail), puis cliquez sur Edit (Modifier).

    2. Dans l'élément Nœud de calcul, augmentez la limite de mémoire. Dans ce tutoriel, utilisez 3,25 Go.

    3. Enregistrez les modifications et patientez quelques minutes, le temps que le nœud de calcul redémarre.

  3. Ouvrez l'onglet des DAG, cliquez sur le nom de l'exemple de DAG (memory_consumption_dag), puis sur Réactiver le DAG.

Accédez à Monitoring et vérifiez qu'aucune nouvelle tâche zombie n'est apparue après la mise à jour des limites de ressources de vos nœuds de calcul:

Graphique des tâches zombies après modification de la limite de mémoire
Figure 5 : Graphique des tâches zombies après modification de la limite de mémoire (cliquez pour agrandir)

Résumé

Dans ce tutoriel, vous avez découvert les principales métriques d'état et de performances au niveau de l'environnement. Vous avez également appris à configurer des règles d'alerte pour chaque métrique et à interpréter chaque métrique en mesures correctives. Vous avez ensuite exécuté un exemple de DAG, identifié la cause première des problèmes liés à l'état de l'environnement à l'aide d'alertes et de graphiques Monitoring, et optimisé votre environnement en allouant plus de mémoire à vos nœuds de calcul. Toutefois, il est recommandé d'optimiser vos DAG pour réduire la consommation des ressources des nœuds de calcul, car il est impossible d'augmenter les ressources au-delà d'un certain seuil.

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer des ressources individuelles

Si vous envisagez d'explorer plusieurs tutoriels et guides de démarrage rapide, réutiliser des projets peut vous aider à ne pas dépasser les limites de quotas des projets.

Console

  1. Supprimez l'environnement Cloud Composer. Vous allez également supprimer le bucket de l'environnement au cours de cette procédure.
  2. Supprimez chacune des règles d'alerte que vous avez créées dans Cloud Monitoring.

Terraform

  1. Assurez-vous que votre script Terraform ne contient pas d'entrées pour les ressources qui sont toujours nécessaires à votre projet. Par exemple, vous pouvez conserver certaines API activées et conserver les autorisations IAM (si vous avez ajouté ces définitions à votre script Terraform).
  2. Exécutez terraform destroy.
  3. Supprimer manuellement le bucket de l'environnement. Cloud Composer ne le supprime pas automatiquement. Vous pouvez le faire depuis la console Google Cloud ou la Google Cloud CLI.

Étapes suivantes