Aller au contenu

👀 OpenObserve : les logs.

Mire de connexion

👋 Présentation

C'est quoi l'observabilité ?

L'observabilité en informatique, c'est la capacité à comprendre l'état interne d'un système complexe (comme une application ou un serveur) à partir des données qu'il génère. Cela inclut généralement trois types de données :

  • Les logs : Enregistrements d'événements qui se passent dans le système.
  • Les métriques : Données chiffrées qui mesurent des aspects comme la performance ou l'utilisation des ressources.
  • Les traces : Suivi des requêtes ou des transactions à travers les différents composants du système.

L'objectif est de pouvoir détecter, diagnostiquer et résoudre des problèmes rapidement en analysant ces données. Plus un système est observable, plus il est facile de comprendre son comportement et d'intervenir en cas d'anomalie.

Xavki en parle très bien dans ses vidéos : C'est quoi l'OBSERVABILITE ??? logs, tracing et monitoring

OpenObserve est une plateforme d'observabilité open source. Elle peut être utilisée à travers la version cloud de la plateforme ou en l'hébergeant soi-même. Dans cet article, je vais déployer OpenObserve avec Docker, puis envoyer des données vers OpenObserve en utilisant OpenTelemetry. Je déploierai OpenObserve en version autonome (avec SQLite comme stockage des métadonnées et un stockage persistant pour le stockage des données).

Un des avantages très intéressant d'OpenObserve c'est sa faible consommation des ressources notamment de la RAM mais aussi de l'espace disque. Un de ses points faibles est le manque de retour d'usage mais aussi sa documentation que je trouve un peu légère.

🎯 Objectif

Ayant plusieurs reverse-proxy Traefik, je souhaite commencer par quelque chose de basique : récupérer les logs de ces derniers afin de voir les pays d'origine des requêtes.

🧰 Installation

L'installation a été réalisée sur mon serveur à la maison qui n'a pas beaucoup de ressources. J'ai mis en place un conteneur LXC basé sur Debian sur Proxmox VE avec Docker installé dessus.

compose.yaml
---
services:
  openobserve:
    image: public.ecr.aws/zinclabs/openobserve:latest
    restart: always
    container_name: openobserve
    environment:
      ZO_ROOT_USER_EMAIL: "VOTRE_EMAIL"
      ZO_ROOT_USER_PASSWORD: "VOTRE_MOT_DE_PASSE"
      ZO_TCP_PORT: 5514
      ZO_UDP_PORT: 5514
      # Cette ligne est important si vous souhaitez utiliser l'option geoIP
      ZO_MMDB_DISABLE_DOWNLOAD: false
    ports:
    - protocol: udp
      published: 5514
      target: 5514
    - protocol: tcp
      published: 5514
      target: 5514
    - protocol: tcp
      published: 5080
      target: 5080
    - protocol: tcp
      published: 5081
      target: 5081
    volumes:
      - ./data:/data

Une fois le conteneur lancé, il suffit de se rendre sur https://ip_openobserve:5080 puis de se connecter avec les credentials renseignés dans le compose.yaml.

Mire de connexion

🧾 Envoi des logs avec OpenTelemetry avec Traefik

OpenTelemetry

OpenTelemetry est un ensemble d'outils et de normes open source qui permet de collecter, traiter et exporter des données de télémétrie (comme les logs, les métriques et les traces) provenant d'applications et de systèmes. L'idée est d'avoir une manière uniforme et standardisée de mesurer et de suivre le comportement d'une application ou d'un service à travers différents environnements (cloud, serveurs, etc.).

OpenTelemetry permet de surveiller et de tracer tout ce qui se passe dans ton application pour mieux comprendre son fonctionnement et repérer rapidement les problèmes.

Sur OpenObserve, rendez-vous sur "Sources de données" > "Personnalisé" > "Logs" > "OTEL Collector"

OO

Copiez le token, puis éditez le fichier de configuration de Traefik :

extrait de traefik.yaml
---
api:
  dashboard: true

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    directory: /dyn_traefik/
    watch: true

entryPoints:
  web:
    address: ":80"

(...)

accessLog:
  filePath: "/var/log/access.log"
  format: json
  fields:
    names:
      StartUTC: drop
  # Configuration pour envoyer les logs à OpenObserve
  otlp:
    http:
      endpoint: http://IP_OPENOBSERVE:5080/api/default/v1/logs
      headers:
        Authorization: "Basic VOTRE_TOKEN"
        # Le nom du stream qui nous permettra de lire les logs sur OpenObserve
        stream-name: traefik_logs
      tls:
        insecureSkipVerify: true

experimental:
  # Activation d'OTEL
  otlpLogs: true

Relancez le conteneur Traefik puis rendez-vous sur OpenObserve.

👨🏻‍💻 Consulter les logs sur OpenObserve

Sur OpenObserve, rendez-vous sur "Logs", puis sélectionnez votre stream

OO

Pour voir le détail d'une connexion, il suffit de cliquer sur la ligne en question. On peut également créer des filtres en cliquant sur une ou plusieurs valeurs des champs voire masquer des champs également.

Maintenant je vais mettre en place l'enrichissement des logs afin d'y préciser la géolocalisation.

📝 Enrichissement des logs

Par défaut, OpenObserve ne fournit pas l'origine des IP. Pour cela, il faut définir une fonction permettant d'enrichir les logs avec ces informations puis appliquer celle-ci dans un pipeline.

Pour cela, rendez-vous sur "Canalisations" puis Fonctions et cliquez sur "Créer une nouvelle fonction"

OO
  1. Renseignez le nom de votre fonction (ce que vous voulez)
  2. Renseignez la fonction elle-même (celle-ci se base sur le langage VRL)
    .geo_city = get_enrichment_table_record!("maxmind_city", {"ip": .clienthost })
    .geo_asn = get_enrichment_table_record!("maxmind_asn", {"ip": .clienthost })
    .
    
  3. Sauvegardez votre fonction

Les tables d'enrichissement dans OpenObserve vous permettent d'ajouter un contexte significatif à vos données en les joignant avec des données de référence externes. Ces tables sont téléchargées sous forme de fichiers CSV et peuvent être utilisées lors de l'ingestion ou au moment de la requête pour ajouter ou modifier des champs. Ici on récupère la table d'enrichissement automatiquement par le biais de la variable d'environnement renseignée dans le fichier compose.yaml.

Il faut maintenant créer le pipeline.

Rendez-vous sur "Canalisations" puis Canalisations fluviaux (oui traduit en français c'est bizarre) et cliquez sur "Ajouter un pipeline".

Voici celle que j'ai testé :

OO
  1. La source provient de mon stream.
  2. J'applique une condition enlevant des IP locales ou utilisées par des applications de monitoring externes à mon réseau comme Uptime Kuma.
  3. J'applique ensuite la fonction de geolocalisation des IP.
  4. Je renvoie le tout vers un autre stream mais on peut envoyer cela vers le stream d'origine.

Rendez-vous maintenant sur "Logs" et vous verrez alors les logs enrichis avec les données de géolocalisation.

OO

Nous pouvons maintenant créer un dashboard avec une map.

🌍 Création du dashbord

Rendez-vous sur "Tableaux de bord" puis cliquez sur "Nouveau tableau de bord".

OO

Une fois votre dashboard créé, cliquez sur "Ajouter un panneau".

OO
  1. Sélectionnez votre stream
  2. Cliquez sur l'icône Maps
OO

Ensuite placez la souris sur le champs "geo_city_country_name" et cliquez sur "+N" et "+V"

OO

Sélectionnez la dernière heure, puis cliquez sur "Appliquer" :

OO

Renseignez le nom du panel puis sauvegardez.

Et voilà un premier dashboard avec les pays ayant consulté vos ressources en ligne.

OO

🚀 Et les ressources ?

ressources
ressources