Analyse de journaux en temps réel avec Fluentd et BigQuery

Les journaux constituent depuis longtemps un outil puissant pour visualiser les performances des systèmes et des applications à grande échelle. Cependant, à mesure que la portée et la complexité de ces systèmes augmentent, gérer plusieurs journaux distribués sur un parc d'infrastructures devient un défi.

Fluentd, un collecteur de journaux Open Source utilisé par plus de 2 000 entreprises dans le monde, vise à unifier la collecte de journaux sur un éventail de systèmes et de sources de données, afin de définir une seule et même couche de journalisation. Comme il est difficile de savoir à l'avance quelles données pourraient s'avérer utiles pour une analyse ultérieure, un cas d'utilisation courant consiste à enregistrer tous les journaux et à les trier ultérieurement. Cependant, la collecte et le stockage de toutes ces données peuvent devenir une charge qui, de surcroît, ralentit et rend plus difficile l'obtention des réponses que vous recherchez.

C'est ici que les atouts en matière de journalisation de BigQuery, le service de requêtes parallèles entièrement géré et hautement évolutif de Google, deviennent extrêmement utiles. Contrairement à une tâche MapReduce lourde, qui peut prendre plusieurs minutes voire plusieurs heures, BigQuery est capable d'effectuer des requêtes sur des téraoctets de journaux en quelques dizaines de secondes, ce qui vous permet d'obtenir rapidement les réponses dont vous avez besoin pour réparer ou améliorer vos systèmes.

Par défaut, vous pouvez insérer 10 000 lignes de données de journal par seconde dans chaque table BigQuery. Vous pouvez également augmenter cette limite à 100 000 lignes/seconde sur demande. En partageant le flux de données entre plusieurs tables BigQuery et en utilisant un plug-in Fluentd-to-BigQuery, vous pouvez directement charger dans BigQuery des journaux provenant de milliers de serveurs à une vitesse de plus d'un million de lignes par seconde, quasiment en temps réel. Vous pouvez ensuite facilement visualiser ces données en créant un tableau de bord mis à jour toutes les minutes ou toutes les heures dans une feuille de calcul Google Sheets.

Objectifs

  • Exécuter un serveur Web nginx sur une instance Google Compute Engine
  • Enregistrer le trafic Web vers ce serveur à l'aide de Fluentd
  • Interroger les données enregistrées à l'aide de l'interface utilisateur Web de BigQuery et d'un script Google Apps exécuté depuis une feuille de calcul Google Sheets
  • Visualiser les résultats de la requête dans un graphique actualisé automatiquement au sein de la feuille de calcul Google Sheets

Prérequis

Cloner l'exemple de code

Pour cloner le dépôt GitHub sur votre ordinateur, exécutez la commande suivante :

git clone https://github.com/GoogleCloudPlatform/bigquery-fluentd-docker-sample

Créer un ensemble de données et une table BigQuery

Créez un ensemble de données appelé bq_test en exécutant la commande suivante :

bq mk bq_test

Accédez au répertoire dans lequel vous avez cloné le dépôt GitHub :

cd bigquery-fluentd-docker-sample

Exécutez la commande suivante pour créer la table access_log avec les noms et types de données définis par le fichier de schéma schema.json fourni :

bq mk -t bq_test.access_log ./schema.json

Ouvrez l'interface utilisateur Web de BigQuery, sélectionnez le nom de votre projet, cliquez sur l'ensemble de données bq_test et sélectionnez la table access_log. Confirmez que la table a bien été créée avec le schéma spécifié.

Créer une instance Google Compute Engine

Exécutez la commande suivante pour créer une instance Google Compute Engine nommée bq-test-instance :

gcloud compute instances create "bq-test-instance" \
  --zone "us-central1-a"  \
  --machine-type "n1-standard-1"  \
  --scopes storage-ro,bigquery \
  --image-family=cos-stable \
  --image-project=cos-cloud

Exécuter nginx et Fluentd dans un conteneur Docker

Connectez-vous à l'instance Compute Engine que vous venez de créer :

gcloud compute ssh bq-test-instance --zone=us-central1-a

Dans cette instance Compute Engine, exécutez la commande suivante en remplaçant <YOUR_PROJECT_ID> par votre ID de projet :

sudo docker run -e GCP_PROJECT="<YOUR_PROJECT_ID>" -p 80:80 -t -i -d google/fluentd-bigquery-sample

Cette commande lance le téléchargement de l'image Docker google/fluentd-bigquery-sample, qui lance et exécute un conteneur Docker préconfiguré avec nginx et Fluentd.

Générez ensuite quelques affichages de pages pour vérifier que Fluentd envoie bien des données à BigQuery :

  1. Dans votre liste d'instances de VM, recherchez bq-test-instance et cliquez sur le lien correspondant dans la colonne "Adresse IP externe". Dans la boîte de dialogue, sélectionnez Autoriser le trafic HTTP, puis cliquez sur Appliquer pour ajouter la règle de pare-feu. Une boîte de dialogue d'activité devrait apparaître dans l'angle inférieur droit de la fenêtre avec le message "Mise à jour des tags de l'instance 'bq-test-instance' en cours". Notez que les tags permettent d'associer des règles de pare-feu à des instances.
  2. Une fois la mise à jour terminée, cliquez à nouveau sur le lien correspondant à l'adresse IP externe pour accéder, depuis votre navigateur, au serveur nginx sur l'instance Compute Engine. Vous devriez accéder à une page Web affichant le message "Welcome to nginx!". Rechargez la page plusieurs fois pour générer des requêtes de navigateur.

Exécuter des requêtes à l'aide de l'interface utilisateur Web de BigQuery

Ouvrez l'interface utilisateur Web de BigQuery, cliquez sur Saisir une requête et exécutez la requête suivante :

 SELECT * FROM [bq_test.access_log] LIMIT 1000

Vous devriez voir apparaître dans la table access_log les requêtes de navigateur que vous venez d'envoyer au serveur Web. Notez que la réception des premières entrées de journal par Fluentd peut prendre quelques minutes.

Et voilà ! Vous venez de confirmer que les événements du journal des accès de nginx sont collectés par Fluentd, importés dans BigQuery et visibles dans l'interface utilisateur Web. Dans la section suivante, vous utiliserez l'outil Apache Bench pour envoyer davantage de trafic vers la page Web, et voir comment Fluentd et BigQuery peuvent gérer des journaux à volume élevé (jusqu'à 10 000 lignes/s par défaut) en temps réel.

Exécuter des requêtes depuis Google Sheets

En plus d'exécuter des requêtes dans l'interface utilisateur Web de BigQuery, vous pouvez également envoyer des instructions SQL à BigQuery depuis une feuille de calcul Google Sheets à l'aide d'une copie de la feuille de calcul fournie dans ce tutoriel. Celle-ci contient un script Apps Script qui exécute les requêtes BigQuery, enregistre les résultats et les visualise dans un graphique intégré. Vous pouvez configurer le script et les graphiques correspondants pour qu'ils soient automatiquement actualisés à un intervalle spécifié, par exemple toutes les minutes, toutes les heures ou tous les jours.

Activer l'API BigQuery dans Google Sheets

Pour activer l'exécution d'instructions SQL sur BigQuery à partir de Google Sheets, procédez comme suit :

  1. Ouvrez le document Example of BigQuery and Google Spreadsheet Integration (exemple d'intégration BigQuery et Google Feuille de calcul) et sélectionnez Fichier > Créer une copie.
  2. Dans votre copie de la feuille de calcul, sélectionnez Outils > Éditeur de scripts.
  3. Dans l'éditeur de scripts, ouvrez bq_query.gs : il s'agit d'un script qui exécute les requêtes BigQuery, enregistre les résultats de la requête dans une feuille de calcul et génère des graphiques permettant de visualiser les résultats de la requête.
  4. Remplacez le texte fictif <<PUT YOUR SPREADSHEET URL HERE>> par l'URL de votre copie de la feuille de calcul.
  5. Remplacez le texte fictif <<PUT YOUR PROJECT ID HERE>> par votre ID de projet. Sélectionnez Fichier > Enregistrer.
  6. Dans le menu de l'éditeur de scripts, sélectionnez Ressources > Services avancés Google. Vérifiez que l'API BigQuery est activée.
  7. Au bas de la boîte de dialogue "Services avancés Google", cliquez sur le lien vers la console Google Cloud Platform. Vous devriez voir une invite vous demandant de créer un nouvel ID de projet qui sera associé à la feuille de calcul.
  8. Parcourez la liste des API pour identifier l'API BigQuery, et passez-la de l'état "Désactivée" à "Activée". Vous devez maintenant voir apparaître l'API BigQuery en haut dans la liste des API activées.
  9. Fermez la console et cliquez sur OK dans la boîte de dialogue "Services avancés Google".

Effectuer des requêtes sur un ensemble de données public

Essayez maintenant d'exécuter un exemple de requête BigQuery depuis votre feuille de calcul :

  1. Dans votre copie de la feuille de calcul, ouvrez la feuille BQ Queries (Requêtes BQ), qui contient une requête BigQuery nommée "gsod_temperature_LINE". Cette requête agrège les données annuelles de température provenant de la base de données climatique GSOD.

  2. Lignes d'une feuille de calcul définissant une requête
  3. Sélectionnez Dashboard (Tableau de bord) > Run All BQ Queries (Exécuter toutes les requêtes BQ). Une boîte de dialogue contenant le message "Authorization Required" (Autorisation requise) apparaît la première fois que vous exécutez BigQuery. Cliquez sur Continue (Continuer) et Accept (Accepter).
  4. Une fois l'exécution de la requête terminée, une nouvelle feuille nommée gsod_temperature apparaît. Ouvrez cette feuille et vérifiez qu'elle contient les résultats de la requête.
  5. Ouvrez la feuille de visualisation des résultats BigQuery Results Visualization et vérifiez qu'elle contient le graphique en courbes incorporé illustré ci-dessous, qui représente les données de température renvoyées par la requête :

  6. Graphique en courbes des données globales de température moyenne, minimale et maximale

Interroger les données Fluentd

Au cours de l'étape précédente, vous avez exécuté un exemple de requête sur un ensemble de données public. Dans cette section, vous allez interroger les données collectées par Fluentd pour connaître le nombre de requêtes par seconde (RPS) adressées par des navigateurs à votre instance Compute Engine.

Ouvrez la feuille des requêtes BQ Queries. Dans la première ligne vide disponible, créez une requête nommée "access_log_LINE" pour laquelle vous renseignez un intervalle de 1, puis saisissez ce qui suit dans la cellule de requête :

SELECT
  STRFTIME_UTC_USEC(time * 1000000, "%Y-%m-%d %H:%M:%S") as tstamp,
  count(*) as rps
FROM bq_test.access_log
GROUP BY tstamp ORDER BY tstamp DESC;

Sélectionnez Dashboard (Tableau de bord) > Run All BQ Queries (Exécuter toutes les requêtes BQ), ce qui enregistre les résultats de la requête dans une nouvelle feuille appelée access_log. Ouvrez la feuille access_log pour afficher les données de journal correspondant à la requête, puis ouvrez la feuille de visualisation des résultats BigQuery Results Visualization pour afficher le graphique en courbes correspondant. Si vous ne voyez pas le graphique en courbes, vérifiez que le nom de la requête dans la feuille BQ Queries inclut bien le suffixe "_LINE"). Étant donné que votre instance Compute Engine n'a pas encore reçu beaucoup de visiteurs, ce graphique ne contient pas beaucoup de données. Dans la section suivante, vous allez simuler une charge de trafic Web beaucoup plus importante.

Simuler la charge

Ouvrez un terminal local et exécutez la commande suivante pour simuler du trafic en direction du serveur nginx à l'aide de l'outil Apache Bench. Remplacez <YOUR_EXTERNAL_IP> par l'adresse IP externe de votre instance Compute Engine.

ab -c 100 -n 1000000 http://<YOUR_EXTERNAL_IP>/

Sélectionnez à nouveau Dashboard (Tableau de bord) > Run All BQ Queries (Exécuter toutes les requêtes BQ). Ouvrez la feuille access_log et vous verrez que les résultats de la requête incluent désormais un pic de trafic correspondant à la simulation. Ce pic de trafic apparaît dans le graphique en courbes dans la feuille de visualisation des résultats BigQuery Results Visualization.

Configurer l'exécution automatique des requêtes

Pour exécuter ces requêtes automatiquement et actualiser le graphique à intervalles réguliers :

  1. Accédez à Outils > Éditeur de scripts et sélectionnez Ressources > Déclencheurs du projet actuel. Vous verrez qu'aucun déclencheur n'a encore été configuré.
  2. Cliquez sur le lien pour ajouter un déclencheur.
  3. Sélectionnez "runQueries" dans le menu "Exécuter" et, pour les événements, sélectionnez Déclencheur horaire, Intervalle en minutes et Toutes les minutes. Cliquez sur Enregistrer. Cela déclenche l'exécution du script bq_query.gs chaque minute.
  4. Revenez à la feuille de visualisation des résultats BigQuery Results Visualization et vous verrez le graphe "access_log" s'actualiser toutes les minutes.

Graphique en courbes du nombre de requêtes de navigateur par seconde

Vous venez de terminer la procédure de configuration d'une feuille de calcul Google Sheets afin d'exécuter automatiquement des requêtes BigQuery sur un ensemble de données collecté par Fluentd et de visualiser les résultats en temps réel.

Étapes suivantes

Voici quelques notes d'utilisation si vous souhaitez ajouter davantage de requêtes à la feuille de calcul :

  • Pour plus d'informations sur l'utilisation de l'API BigQuery dans des scripts Apps Script, reportez-vous à la documentation du service BigQuery.
  • Si vous ajoutez une requête à la feuille BQ Queries, ajoutez-la dans la première ligne vide disponible. Ne laissez pas de lignes vides entre les requêtes.
  • Lorsque la feuille de calcul exécute une requête portant un nouveau nom, elle enregistre les résultats de la requête dans une nouvelle feuille nommée d'après l'intitulé de la requête.
  • Ajoutez l'un des suffixes _AREA, _BAR, _COLUMN, _LINE, _SCATTER ou _TABLE au nom de la requête pour générer un graphique du type spécifié dans la feuille de visualisation des résultats BigQuery Results Visualization.
    • Utilisez l'un des suffixes _AREA_STACKED, _BAR_STACKED ou _COLUMN_STACKED pour créer un graphique empilé.
  • La feuille de calcul stocke un maximum de cinq lignes de résultats pour les requêtes de type BAR et COLUMN, et un maximum de 100 lignes pour tout autre type. Vous pouvez limiter explicitement le nombre de lignes de résultats renvoyées en ajoutant une clause LIMIT à la fin d'une requête, par exemple LIMIT 20.
  • Pour générer un graphique chronologique, définissez le premier champ de la requête sur une valeur d'horodatage ou de date.

Pour en savoir plus sur la diffusion de données en flux continu dans BigQuery :

Effectuer un nettoyage

  1. Désactivez l'outil Apache Bench en émettant une commande Ctrl+C dans votre terminal local.

  2. Désactivez l'exécution automatique du script bq_query.gs en sélectionnant Ressources > Déclencheurs du projet actuel dans l'éditeur de scripts, puis en supprimant le déclencheur "runQueries".

  3. Supprimez l'ensemble de données : dans l'interface utilisateur Web de BigQuery, passez la souris sur l'ensemble de données "bq_test", sous le nom de votre projet et choisissez Supprimer l'ensemble de données dans le menu déroulant.

  4. Supprimez l'instance Google Compute Engine :

    gcloud compute instances delete bq-test-instance --zone=us-central1-a
    
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…