Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Observabilite de la demo

Les traces et les metriques du serveur dans Grafana, pendant que la demo tourne : --with-otel, compatible avec chaque mode, preset et autre option.

demo/k3s/demo.sh deploy cluster --with-otel --with-s3 --with-proxy
demo/k3s/demo.sh check cluster                # l'etape 9 verifie traces et metriques
demo/k3s/demo.sh annotate cluster "RustFS stopped" chaos   # un repere sur les courbes

Ce qui est monte

grafana/otel-lgtm (ghcr.io/grafana/docker-otel-lgtm:v0.37.0, l’image de Grafana Labs, tiree par k3s au premier usage) dans le namespace du mode, un pod : le collecteur OpenTelemetry, Prometheus, Tempo, Loki et Grafana (demo/k3s/otel.yaml). Il demarre avant le serveur, qui lui envoie ses premiers spans.

Port de l’hoteQuoi
32130 (cluster), 32230 (single), 32330 (ansible)Grafana, un kubectl port-forward vers le Service otel

Le compte admin de Grafana a un mot de passe tire au deploiement, affiche avec les autres et garde dans env.sh (GRAFANA_PASSWORD) ; Grafana n’admet aucun acces anonyme et ne telecharge rien. Mesure ici : LGTM pret en 5 a 15 s, 470 a 640 Mio (limite 1 Gio).

Ce que le mode ajoute

[telemetry]
enabled = true
otlp_endpoint = "http://otel:4317"
protocol = "grpc"
service_name = "craft-file-gate"
metrics = true
metrics_interval_secs = 10    # court, pour la demo

[telemetry] appartient au mode : le config.toml d’un preset la laisse de cote. Chaque pod recoit OTEL_RESOURCE_ATTRIBUTES (service.instance.id et k8s.pod.name : le nom du pod, par l’API descendante) dans extraEnv du chart, ou extra_env du playbook : les series OTLP des pods restent distinctes. Le mode pose aussi service.probes.port: 8082 (probes_port du playbook) : /metrics et les sondes du kubelet sur un port a part, qui ne sert rien d’autre. Les cles : Telemetrie.

SignalCheminDans Prometheus ou Tempo
spansOTLP gRPC vers le collecteur, puis Temposervice.name craft-file-gate, chaque span nomme son pod
metriques pousseesOTLP toutes les 10 sjob="craft-file-gate", instance : le nom du pod
metriques luesPrometheus lit /metrics de chaque pod, port des sondes 8082, toutes les 10 sjob="craftfilegate", instance : l’adresse du pod
span metricsTempo, depuis les spanstraces_spanmetrics_*, avec des exemplaires qui menent a leur trace

Prometheus trouve les pods par le Service sans tete otel-scrape (resolution DNS : ni RBAC, rien hors du namespace) ; il garde les pods non prets, dont un pod retire du service par un detecteur. Les deux sources ont les memes noms de series (Metriques).

Le reseau

La NetworkPolicy du serveur ne filtre que l’entrant : rien ne retient l’envoi OTLP. Celle de LGTM n’admet, parmi les pods, que ceux du serveur, sur 4317 et 4318 ; Grafana, Tempo et Prometheus ne repondent qu’au noeud (port-forward, conteneur d’outils). La NetworkPolicy otel-scrape admet le pod de LGTM (app: otel) sur le port des sondes des pods du serveur, et la seulement ; controlFrom reste celui du mode. Avec --with-proxy, son adresse est parmi les trusted_proxies (les pods du noeud), mais le port des sondes ne lit aucune adresse de client : check verifie que LGTM lit /metrics et n’atteint ni 2222, ni 8080, ni 8081.

Le tableau de bord

CraftFileGate (demo/k3s/otel-dashboard.json, provisionne au demarrage, la page d’accueil de Grafana). La variable Source choisit les metriques poussees ou lues.

RangeePanneaux
Sessions and transferssessions SFTP, requetes de l’API de fichiers, operations SFTP, spans et latence p95 par operation, dernieres traces
Throughputoctets SFTP, octets du stockage par backend
Refusals and bansrefus SFTP (limite, en-tete PROXY), verdicts de ban, jetons JWT refuses, acces temporaires
Password hashing poolplaces prises et places, verifications refusees pool plein
Clusterpairs par statut, detecteurs actifs, retrait du service
Backendsbackend_up, erreurs et appels, duree de la sonde
Startup and readinesspods qui repondent a /metrics, redemarrages, memoire
Telemetryspans termines, exportes, perdus

Les liens d’un panneau (icone en haut a gauche) ouvrent Explore sur Tempo, une requete TraceQL de son sujet, sur la periode affichee ; un exemplaire du panneau de latence (un losange) ouvre sa trace.

Les annotations

demo.sh annotate <mode> <texte> [etiquette...], ou annotate <texte> [etiquette...] apres . demo/k3s/.work/<mode>/env.sh, pose un repere (etiquette cfg-demo, que le tableau de bord affiche) par l’API HTTP de Grafana, le mot de passe dans la configuration de curl, lue sur stdin. deploy, check (debut et resultat) et remove en posent un.

Etape 9 : regarder pendant le scenario

Ouvrez le tableau de bord sur la derniere demi-heure, puis lancez demo/k3s/demo.sh check cluster :

Etape du scenarioSur les courbes
1, 2sessions SFTP et requetes ; un pic de verdicts de ban
5un pod disparait de « Pods answering /metrics », son remplacant apparait
6storage_alone, puis Withdrawn a 1 sur un pod ; backend_up a 0 partout pendant l’arret de RustFS
8refus et ban d’un client, a travers Traefik
9un depot SFTP et une lecture par l’API : leurs traces dans Tempo, le pod dans service.instance.id

L’etape 9 verifie : la trace du depot (sftp_operation) et celle de la lecture (api_operation) dans Tempo, chaque pod dans Prometheus par OTLP et par lecture de /metrics (up a 1), le tableau de bord provisionne et refuse sans identifiants, une annotation posee puis relue.