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’hote | Quoi |
|---|---|
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.
| Signal | Chemin | Dans Prometheus ou Tempo |
|---|---|---|
| spans | OTLP gRPC vers le collecteur, puis Tempo | service.name craft-file-gate, chaque span nomme son pod |
| metriques poussees | OTLP toutes les 10 s | job="craft-file-gate", instance : le nom du pod |
| metriques lues | Prometheus lit /metrics de chaque pod, port des sondes 8082, toutes les 10 s | job="craftfilegate", instance : l’adresse du pod |
| span metrics | Tempo, depuis les spans | traces_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.
| Rangee | Panneaux |
|---|---|
| Sessions and transfers | sessions SFTP, requetes de l’API de fichiers, operations SFTP, spans et latence p95 par operation, dernieres traces |
| Throughput | octets SFTP, octets du stockage par backend |
| Refusals and bans | refus SFTP (limite, en-tete PROXY), verdicts de ban, jetons JWT refuses, acces temporaires |
| Password hashing pool | places prises et places, verifications refusees pool plein |
| Cluster | pairs par statut, detecteurs actifs, retrait du service |
| Backends | backend_up, erreurs et appels, duree de la sonde |
| Startup and readiness | pods qui repondent a /metrics, redemarrages, memoire |
| Telemetry | spans 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 scenario | Sur les courbes |
|---|---|
| 1, 2 | sessions SFTP et requetes ; un pic de verdicts de ban |
| 5 | un pod disparait de « Pods answering /metrics », son remplacant apparait |
| 6 | storage_alone, puis Withdrawn a 1 sur un pod ; backend_up a 0 partout pendant l’arret de RustFS |
| 8 | refus et ban d’un client, a travers Traefik |
| 9 | un 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.