Monitoring and Logs FR - Kheopsian/Hydranos GitHub Wiki

🇬🇧 English · 🇫🇷 Français

Supervision et journaux

S'applique à Hydranos 4.4.

Cette page s'adresse à quiconque veut savoir si Hydranos est en bonne santé et ce qu'il raconte. Elle couvre les points de santé et l'écran de démarrage, la page Prometheus, les sorties de journal, les onglets Journaux (Logs), Vue d'ensemble (Overview) et Performances (Benchmark), le test de ligne, la santé des trackers, le rapport d'anomalies et les diagnostics mémoire sous Linux. Pour chacun, elle indique aussi ce qui n'est pas mesuré en 4.4, pour que vous sachiez où votre supervision a des angles morts.

Le démarrage, l'arrêt, les sauvegardes et les mises à jour sont sur Exploiter Hydranos.

Où vont les signaux

flowchart LR
    E["moteurs race, hoard, supplémentaires"] --> T["événements tracing"]
    W["workers, API, annonceur"] --> T
    T --> C["console : docker logs ou journald"]
    T --> F["hydranos.log à côté de default.toml<br/>tourné à 128 Mio, 4 anciens fichiers gardés"]
    T --> R["anneau en mémoire, 2000 lignes"]
    R --> LT["onglet Journaux, GET /api/logs<br/>et /api/logs/stream"]
    S["échantillonneur bench toutes les 5 s<br/>chaque moteur"] --> B["bench.db dans data_dir"]
    I["test de ligne iperf3<br/>Lancer maintenant ou interval_secs"] --> B
    B --> BT["onglet Performances et carte Records"]
    E -->|"compteurs déjà tenus"| M["GET /metrics<br/>débits, pairs, annonces, limites, mémoire"]
    M --> P["Prometheus"]
    E --> H["GET /health<br/>store et listeners"]
    E --> HS["examen de santé toutes les 5 min"]
    HS --> A["GET /api/health/anomalies<br/>et l'outil MCP health"]
Loading

Points de santé

Route Auth Réponse Ce que cela prouve
GET /health aucune JSON status : starting, healthy, degraded (HTTP 200) ou unhealthy (HTTP 503) Le store répond à une requête et les moteurs qui devraient être sur le réseau ont leur listener de pairs.
GET /api/startup aucune {"ready","phase","total","restored","engines":[{"id","restored","total"}],"uptime"} Où en est le chargement du catalogue.
GET /metrics aucune texte Prometheus, voir ci-dessous Compteurs par moteur ; un jeu réduit pendant le démarrage.

États de /health

{"checks":{"engines":[{"blocked":null,"held":false,"id":"race","listening":true,"online":true,"torrents":42}],"store":"ok"},"problems":[],"status":"healthy","uptime":86400.0,"version":"4.x.y"}
status HTTP Quand
starting 200 Le catalogue est encore en cours de chargement. Le corps porte un objet startup (la réponse de /api/startup) au lieu de checks. 200 exprès : sinon, un orchestrateur qui redémarre les conteneurs non sains tuerait chaque démarrage long.
healthy 200 Aucun problème.
degraded 200 Au moins un avertissement dans problems : un moteur sur le réseau sans son listener de pairs (engine X is not listening for peers (port N not bound, or its tunnel is down)), un moteur bloqué par le kill switch, ou un moteur retenu par start_paused (… is held by start_paused: no announce, no dial until released). Les autres moteurs continuent de seeder.
unhealthy 503 Le store ne répond pas (checks.store vaut error), ou aucun moteur qui devrait être sur le réseau n'écoute (no engine is listening for peers).

checks.store peut aussi valoir busy (un autre lecteur tient le store à ce moment) : ce n'est pas un problème. Un moteur tenu hors du réseau exprès (HYDRANOS_ENGINE_NET=0) n'est pas censé écouter. Un moteur bloqué par le kill switch rend l'instance degraded, jamais unhealthy, même quand tous les moteurs sont bloqués : un redémarrage ne change rien tant que la configuration ne change pas (voir WireGuard géré).

En mode de secours, /health répond le texte brut ok, pas du JSON (HTTP 200). Le mode de secours est décrit sur Exploiter Hydranos.

Démarrage : port ouvert tout de suite, l'API répond 503 jusqu'à ce qu'elle soit prête

Le port 8199 (api_port) s'ouvre dans la première seconde, avant le chargement du catalogue ; la ligne de journal est hydra API listening (starting) (avec addr=). Un port déjà pris échoue donc tout de suite. Jusqu'à la fin du chargement, seules ces routes répondent :

  • / et /static/* : l'interface web affiche un écran de démarrage (HYDRANOS, une ligne de phase telle que Restauration de l'état… (Restoring state…), Connexion au réseau… (Connecting to the network…), Ouverture de la base… (Opening the database…) ou Démarrage… (Starting…), une barre et <restored> / <total> torrents), interroge /api/startup toutes les 500 ms et laisse place en fondu à l'interface normale quand ready passe à true ;
  • /health (starting), /metrics (jeu réduit), /api/startup et GET /api/setup.

Tout le reste — le reste de l'API, la connexion, le shim qBittorrent /api/v2/*, /mcp — répond 503 avec Retry-After: 5 et {"error":"Hydranos is starting (<phase>): <restored> of <total> torrents restored","startup":{…}}. La création du premier compte (POST /api/setup) est refusée aussi : le routeur de démarrage n'achemine que GET /api/setup jusqu'à la fin du chargement. Quand le chargement se termine, le journal indique hydra API ready.

phase passe par loading → connecting → opening_store → starting_workers → ready (ou rescue). total ne compte que les moteurs qui ont commencé à lire leurs enregistrements, donc la barre peut reculer une fois par moteur. Une fois prête, /api/startup continue de répondre ready: true, phase: "ready" et les torrents désormais chargés, par moteur.

Une sonde qui veut « prêt » lit le mot status de /health ou ready de /api/startup. Une sonde de vie qui ne doit pas tuer un démarrage long accepte starting.

Un health check Docker

L'image n'a pas de HEALTHCHECK ni de curl ; celui-ci utilise bash. Faites correspondre le mot d'état entier : grep -q healthy correspond aussi à "unhealthy", il laisserait donc passer un 503.

    healthcheck:
      test:
        - CMD
        - bash
        - -c
        - exec 3<>/dev/tcp/127.0.0.1/8199 && printf 'GET /health HTTP/1.0\r\n\r\n' >&3 && grep -qE '"status":"(healthy|degraded|starting)"' <&3
      interval: 60s
      timeout: 10s
      retries: 3

Il passe sur starting, healthy et degraded, et échoue sur unhealthy, le mode de secours (ok) et l'absence de réponse. Retirez degraded pour signaler un listener manquant, un blocage par le kill switch ou une retenue par start_paused. Docker marque seulement le conteneur comme non sain ; il ne le redémarre pas. Voir aussi Docker.

Vérification rapide depuis un shell :

curl -s http://localhost:8199/health | jq '{status, problems}'

Prometheus

GET /metrics ne demande pas de clé API et renvoie du texte Prometheus (text/plain; version=0.0.4, avec # HELP et # TYPE) : 32 familles, par moteur (moteurs supplémentaires compris) : débits, octets, pairs, torrents par état, annonces (par hôte de tracker aussi), plafonds de débit, choker, état du listener et de start_paused, pièces en vol, et mémoire jemalloc (Linux/Unix). Une collecte ne parcourt jamais le catalogue. Pendant le démarrage d'Hydranos, la page sert un jeu réduit (hydra_up, hydra_uptime_seconds, hydra_starting, hydra_startup_restored, hydra_startup_records).

La table complète des métriques, une configuration de collecte et des règles d'alerte prêtes à l'emploi sont sur Métriques Prometheus.

La page est publique : quiconque peut joindre le port 8199 peut la lire, y compris les noms d'hôte des trackers (label tracker) et vos volumes. Voir Sécurité & accès.

Supervision plus riche : les points JSON

Tout ce qu'affichent les onglets Vue d'ensemble, Performances et Trackers vient de routes JSON qui demandent la clé API. Leurs champs sont listés sous Supervision sur API REST :

Route Ce que vous obtenez
GET /api/status les blocs race et hoard de la Vue d'ensemble, les octets cumulés et les chiffres de Stockage
GET /api/engines chaque moteur avec un objet stats (les chiffres que publie /metrics, moteurs supplémentaires compris)
GET /api/benchmark/current le dernier échantillon bench (débits, IOWait, ARC ZFS) et un tableau engines avec chaque moteur
GET /api/benchmark/trackers/current par moteur et par hôte de tracker : torrents, pairs, débits, octets cumulés, taille seedée
GET /api/announce/health par moteur (tous) : announces_ok / announces_failed, classes d'erreur et severity par hôte, le compteur late et le retard du planificateur (schedule), et badges.trackers_red / trackers_amber

Sans Prometheus, un petit contrôle depuis cron suffit. Celui-ci sort avec un code non nul quand quelque chose mérite un coup d'œil ; branchez-le sur ce qui vous notifie (mail de cron, service de type healthchecks, votre propre script) :

#!/usr/bin/env bash
# hydranos-check.sh: run every 5 minutes from cron
HY=http://localhost:8199
KEY=YOUR_API_KEY

h=$(curl -s --max-time 10 "$HY/health") || { echo "Hydranos does not answer"; exit 2; }
st=$(jq -r '.status' <<<"$h" 2>/dev/null)
case "$st" in
  healthy|starting) ;;
  degraded) jq -r '.problems[].detail' <<<"$h"; exit 1 ;;
  *) echo "health: ${st:-not JSON (rescue mode?)}"; jq -r '.problems[]?.detail' <<<"$h" 2>/dev/null; exit 2 ;;
esac

red=$(curl -sf --max-time 60 -H "X-Api-Key: $KEY" "$HY/api/announce/health" | jq '.badges.trackers_red')
[ "${red:-0}" -gt 0 ] && { echo "$red tracker(s) red: passkey refused or missing from a peer list"; exit 1; }
exit 0

/api/announce/health parcourt chaque hôte de tracker de chaque moteur à partir des caches d'annonce en mémoire ; son coût croît avec le nombre de trackers, pas de torrents. Sous Windows, lancez les mêmes requêtes avec curl.exe depuis une tâche planifiée, ou Invoke-RestMethod dans PowerShell.

Journaux

Chaque événement de journal part à trois endroits à la fois, tous filtrés par le même niveau :

Sortie Où Limite de taille
Console docker logs hydranos sous Docker, journalctl -u hydranos sous systemd, la fenêtre de console sous Windows (quand il y en a une) Docker : le bloc logging: de votre fichier compose (celui fourni le plafonne à 128 Mio × 5) ; systemd : les limites propres à journald
Fichier de journal hydranos.log dans le dossier du fichier de configuration : /config/hydranos.log dans le conteneur, /etc/hydranos/hydranos.log avec l'unité systemd fournie, à côté de hydranos.exe sous Windows (la configuration par défaut y est default.toml ; une installation que la 4.3 a mise en place à \config\default.toml continue d'utiliser celle-ci ; avec --config, le journal suit la configuration). Sans codes couleur. tourné à 128 Mio, 4 anciens fichiers gardés (voir ci-dessous)
Tampon circulaire mémoire du processus, lue par l'onglet Journaux 2000 dernières lignes

Si le fichier ne peut pas être ouvert, Hydranos affiche hydranos: no log file at <path> (<error>); console only et continue de tourner.

Les horodatages de /api/logs sont en UTC au format RFC 3339, terminés par Z. L'onglet Journaux affiche la même heure UTC sans le T ni le Z et tronquée à la milliseconde, donc rien à l'écran n'indique que c'est de l'UTC : ce n'est pas votre heure locale.

Rotation du fichier de journal

Hydranos fait tourner hydranos.log lui-même, sur toutes les plateformes. Quand la ligne suivante ferait dépasser 128 Mio au fichier, il renomme hydranos.log en hydranos.log.1 (les fichiers plus anciens montent en .2, .3, .4 ; l'ancien .4 est supprimé) et commence un nouveau hydranos.log. Il existe au plus cinq fichiers, environ 640 Mio au total. Les fichiers tournés ne sont pas compressés. Le décompte de taille reprend depuis le fichier existant au démarrage, donc un redémarrage ne le remet pas à zéro.

Il n'y a rien à configurer et aucune règle logrotate n'est nécessaire. Chaque connexion entrante d'un pair écrit encore une ligne INFO ([peer] incoming … from …), donc sur une instance chargée les 640 Mio couvrent moins de temps que vous ne le pensez ; pour garder plus d'historique, baissez le niveau avec RUST_LOG (ci-dessous) ou collectez la console avec votre système de journaux.

Désactiver le fichier : HYDRANOS_LOG_STDOUT

Si HYDRANOS_LOG_STDOUT est définie avec n'importe quelle valeur (y compris 0, false ou une chaîne vide), aucun fichier n'est écrit et seuls la console et l'anneau restent. La sortie console est la même que la variable soit définie ou non.

Sous Docker, c'est généralement ce que vous voulez : docker logs conserve déjà la console, plafonnée par le bloc logging: du compose. Sans console (un lancement par double-clic sous Windows, par exemple), le fichier est votre seule trace d'un démarrage raté, alors gardez-le dans ce cas.

Niveau de journal : RUST_LOG

RUST_LOG définit le niveau des trois sorties. Quand elle n'est pas définie ou ne peut pas être analysée, le niveau est info. Elle utilise la syntaxe de filtre standard de tracing : un niveau par défaut, puis des paires target=level.

Valeur Effet
info par défaut
warn avertissements et erreurs seulement ; silencieux, mais vous perdez les jalons de démarrage et d'arrêt
info,typhon_engine::peer=warn tout en info sauf les lignes de connexion par pair
debug très bavard ; pour une investigation courte uniquement

Docker : ajoutez RUST_LOG: "info,typhon_engine::peer=warn" sous environment:. systemd : Environment=RUST_LOG=info,typhon_engine::peer=warn dans une surcharge (systemctl edit hydranos). Où chaque variable est lue : Config : environnement, CLI & signaux.

Lignes à connaître

Ligne Niveau Signification
tokio runtime: N worker threads INFO l'une des premières lignes après le début du journal
hydra API listening (starting) (addr=) INFO le port 8199 est ouvert ; l'API répond 503 jusqu'à la fin du chargement
engines up (torrents=) INFO chaque moteur a chargé son catalogue
store open (wal=, read_connection=) INFO le store hydra.db est ouvert
hydra API ready (addr=) INFO l'API complète est servie
announce failed (tracker=, event=, error=) WARN une requête de tracker a échoué ; les URL http:// et https:// dans l'erreur sont remplacées par <url> pour que les passkeys restent hors du journal ; les URL udp:// ne sont pas masquées
store held long WARN le verrou du store a été tenu 200 ms ou plus
jemalloc allocated=… active=… resident=… mapped=… retained=… metadata=… slop=… dirty=…, puis pieces <engine>=<n>/<MiB>MiB … INFO statistiques de l'allocateur toutes les 5 minutes (Linux/Unix seulement), avec les pièces en vol par moteur
seed time synced INFO copie quotidienne du temps de seed dans le store
health scan found something (anomalies=) INFO la passe d'anomalies de 5 minutes a trouvé quelque chose ; voir Rapport d'anomalies ci-dessous
speedtest (ul=, dl=, device=) / periodic speedtest: … INFO / WARN un test de ligne s'est terminé / un test périodique a échoué
the store could not be opened: … -- starting in rescue mode ERROR voir le mode de secours sur Exploiter Hydranos
SIGTERM received, draining the API and flushing resume data (ou SIGINT, tray quit, restart request) WARN un arrêt propre a commencé (Linux). Sous Windows : <which>: draining the API and flushing resume data avec Ctrl+C, Ctrl+Break, console closed, sign-out, system shutdown, tray quit ou restart request
stop requested during startup; flushing and leaving WARN un arrêt est arrivé pendant le chargement du catalogue
connections still open 5 s into the drain (event stream, log tail); flushing without them WARN la vidange HTTP est plafonnée à 5 s
resume data saved (engine=, took_ms=), puis shutdown flush complete INFO l'enregistrement des données de reprise est terminé ; détails sur Exploiter Hydranos
shutdown flush hit HYDRANOS_STOP_TIMEOUT; leaving with what is saved WARN l'enregistrement a été coupé à HYDRANOS_STOP_TIMEOUT (120 s par défaut) : augmentez-le, et le délai d'arrêt de votre superviseur avec
restart requested via API: … / restart requested from settings: …, puis restart: exiting with code 75 for the supervisor INFO un redémarrage depuis l'interface ou l'API : arrêt propre complet, puis code de sortie 75

Il n'y a pas de journal d'accès HTTP : les requêtes à l'API ne sont pas journalisées.

L'onglet Journaux

L'onglet Journaux (Logs) affiche le tampon circulaire : les 2000 dernières lignes depuis le démarrage du processus, filtrées par le serveur. Chaque ligne affiche l'heure (UTC, voir plus haut), le niveau, le module (la zone du code, sans le préfixe hydranos::, par exemple announce::runner) et le message. Les champs structurés affichés dans la console et le fichier (par exemple torrents= ou addr=) sont ajoutés au message sous la forme key=value.

Commande Comportement
Sélecteur de module (Tous les modules (All modules)) rempli à partir des modules présents dans l'anneau ; garde les lignes dont le module contient le choix
Niveau (Tous les niveaux (All levels), Info+, Avert.+ (Warn+), Erreurs seules (Error only)) niveau minimum
Période (Depuis toujours (All time), 5 dernières minutes (Last 5 min), Dernière heure (Last hour), 24 dernières heures (Last 24 h)) seulement les lignes journalisées depuis (parmi les 2000 gardées)
texte recherché… (search text…) texte insensible à la casse dans le message et ses champs ; recharge 300 ms après la fin de la frappe
Rafraîchir (Refresh) recharge avec les filtres en cours
En direct (Live) ajoute les nouvelles lignes correspondantes au fil de leur journalisation (le filtre de période ne s'applique pas à elles) ; le navigateur garde au plus 5000 lignes
Copier (Copy) copie les lignes affichées dans le presse-papiers
Exporter (Export) télécharge les lignes affichées sous hydra-logs.txt
Signaler un problème (Report issue) ouvre un formulaire de nouvelle issue sur github.com/Kheopsian/Hydranos (voir Exploiter Hydranos)

2000 lignes peuvent ne couvrir que quelques minutes sur une instance chargée : pour les lignes plus anciennes, lisez hydranos.log (et ses fichiers tournés) ou la console.

Les mêmes données via l'API (clé API requise) :

curl -s -H "X-Api-Key: YOUR_API_KEY" "http://localhost:8199/api/logs?level=warn&since=1h" \
  | jq -r '.entries[] | "\(.ts) \(.level) \(.module) \(.msg)"'

GET /api/logs renvoie {"entries":[{"ts","source","level","module","msg","seq"}, …],"last_seq":N,"modules":[…]}, du plus ancien au plus récent ; source vaut toujours rust. Paramètres facultatifs : level (minimum : trace, debug, info, warn, error), module (ou source ; sous-chaîne, source=rust ignoré), q (ou contains ; texte insensible à la casse du message et des champs), since (90s, 5m, 1h, 24h, 2d ou secondes Unix), after (un seq) et limit (les N correspondances les plus récentes). Une valeur qu'il ne sait pas lire (since=1week, level=loud) répond 400 {"error":…} au lieu d'être ignorée en silence.

GET /api/logs/stream est un flux server-sent events (clé API dans l'en-tête ou ?apikey=) avec des événements nommés log, chacun portant une entrée et son seq comme identifiant d'événement. Il accepte les mêmes filtres sauf since, commence après after= (ou le Last-Event-ID du navigateur lors d'une reconnexion, sinon à partir de maintenant), et se termine de lui-même quand Hydranos s'arrête.

Onglets Vue d'ensemble et Performances

Les cartes Moteur Race (Race engine) / Moteur Hoard (Hoard engine) (sauf le Ratio de session (Session ratio) de la carte Race, calculé sur les octets de session de tous les moteurs) affichent les moteurs d'identifiant race et hoard. Tout autre moteur (par exemple vpn1) a sa propre carte dans la Vue d'ensemble, ses propres cartes en direct et une courbe d'envoi dans l'onglet Performances, et compte dans les Records (sauf Pic de sources actives (Peak live seeds)), les totaux de l'en-tête, la carte Stockage (Storage), la santé des trackers et /metrics.

Ce qui ne couvre encore que race et hoard : les cartes d'annonce réservées au hoard, Pic de sources actives, la comparaison A / B (ci-dessous), et la chronologie race et ses instantanés (moteur race seulement). Voir Moteurs : race & hoard.

Compteurs de l'en-tête

Libellé Source
UL du jour (UL Day) / DL du jour (DL Day) octets échangés depuis minuit local (fuseau horaire du processus). Gardés en mémoire : un redémarrage les remet à 0.
UL total / DL total compteurs cumulés : le compteur global du store (octets des torrents retirés, ajoutés au moment du retrait, plus toute base importée) + les octets cumulés de chaque torrent actuellement chargé, dans tous les moteurs
Ratio UL total ÷ DL total

Vue d'ensemble

  • Envoi total (All-time upload) : le chiffre UL total en Pio, le ratio cumulé, le total téléchargé, le nombre de torrents (tous les moteurs) et la progression vers le prochain Pio entier. Ses lignes de jalons viennent de bench.db.
  • Cartes Moteur Race / Moteur Hoard : Torrents, Avec des pairs (With peers), Envoi (Upload), Téléchargement (Download), Pairs (Peers), En partage (Seeding) (la taille seedée de ce moteur) et Ratio de session (depuis le démarrage du processus ; sur la carte Race, l'envoi de session de tous les moteurs ÷ la réception de session de tous les moteurs).
  • Cartes Engine {id}, une par moteur supplémentaire (rafraîchies au plus toutes les 3 s) : l'étiquette est le rôle du moteur, ou <role> · n'écoute pas (not listening) ; lignes Torrents, Avec des pairs, Envoi, Téléchargement, Pairs, En partage (- avant la première passe des trackers) et Ratio de session (celui de ce moteur seul).
  • Stockage : compare ce que les trackers créditent avec l'espace que cela occupe.
Ligne Signification Rafraîchie
Seedsize (Seed size) somme des tailles des torrents en seed, comptée par tracker : un cross-seed compte une fois par tracker toutes les 30 s (passe des trackers)
Données sur disque (Data on disk) les fichiers des torrents, chaque fichier en hardlink compté une fois (taille logique, avant compression) scanner de liens, chaque torrent remesuré au plus une fois par jour
Partagé avec d'autres dossiers (Shared with other folders) la part des données également liée hors de Hydranos (médiathèque, sauvegarde) ; elle reste sur le disque si vous retirez les torrents idem
Tenu seulement par les torrents (Held only by torrents) Données sur disque − Partagé avec d'autres dossiers : ce que le seed coûte réellement en espace idem
Fichiers introuvables (Files not found) fichiers que le scanner n'a pas trouvés idem
Compté (Counted) quand le dernier comptage a été publié et combien de torrents il couvrait ; pas encore (not yet) avant le premier idem

Le scanner de liens attend environ 3 minutes après le démarrage, puis parcourt le catalogue par lots. Un premier comptage d'une grosse bibliothèque prend longtemps ; tant qu'il n'est pas arrivé, les lignes affichent -.

  • Records : pics de tous les temps calculés depuis bench.db : Pic d'envoi (Peak upload), Pic de réception (Peak download), Pic de pairs dans l'essaim (Peak swarm peers) (tous les moteurs), Meilleur jour d'envoi (Best upload day), Pic de sources actives (race + hoard seulement) et Meilleur test de ligne (Best line test) (le meilleur envoi mesuré par un test de ligne, en Gbps). Le serveur les recalcule au plus toutes les 30 minutes. Tant que rien n'est enregistré, la carte affiche Aucun record pour l'instant (No records yet).

Performances

L'onglet Performances (Benchmark) lit bench.db dans le dossier de données. Une ligne d'échantillon est écrite toutes les 5 s (avec une ligne de plus par moteur supplémentaire, dans sa propre table) ; les lignes par tracker toutes les 30 s. Les lignes de tracker de plus de 48 heures sont regroupées en tranches de 5 minutes. Les tables d'échantillons ne sont jamais purgées, donc bench.db grossit d'environ 17 000 lignes d'échantillon par jour (plus autant par moteur supplémentaire) tant qu'il existe. Si bench.db ne peut pas être ouvert, Hydranos journalise no bench database: … et l'onglet reste vide.

  • Cartes en direct : Envoi Race (Upload Race), Réception Race (Download Race), Envoi Hoard (Upload Hoard), Pairs Race (Peers Race) (pairs connectés), Attente E/S (IOWait), Taux de succès ARC (ARC Hit Rate), Échecs ARC/s (ARC Miss/s), Taille ARC (ARC Size) ; puis, par moteur supplémentaire, Upload {id}, Download {id} et Pairs {id} (Peers {id}) (la rangée est masquée quand il n'y en a pas).
  • Cartes d'annonce pour le moteur hoard seulement : Announces (par seconde sur 5 minutes, comparé à ce qu'exigent les intervalles), Late (échéance dépassée de plus de 5 s), In flight, Refused (429) (part des réponses 429 sur 10 s ; au-delà de 2 % l'annonceur ralentit). Fonctionnement de l'annonceur : Trackers & annonces. Pour les autres moteurs, utilisez hydra_announce_* sur Métriques Prometheus.
  • Graphiques sur 15m, 1h, 6h, 24h, 7d ou 30d : Débit d'envoi (Upload Speed) (une courbe par moteur supplémentaire aussi), Total envoyé (Total Uploaded) (moteurs supplémentaires empilés sous Autres engines (Other engines)), En cours d'envoi (Currently Uploading), Announce Rate, Événements Race (Race Events), Attente E/S % (IOWait %), Échecs ARC / s (ARC Miss / sec).

Attente E/S a besoin de /proc sous Linux ; les chiffres ARC ont besoin de ZFS. Sans eux, ils affichent 0 : cela signifie « non mesuré », pas « aucune pression disque ». Sous Windows, aucun n'est mesuré.

Test de débit (test de ligne)

▶ Lancer maintenant (▶ Run now) (POST /api/vpn-speedtest/run) lance iperf3 contre [vpn_speedtest] iperf3_server : l'envoi d'abord, puis la réception (-R), jamais les deux à la fois, duration_secs chacun. Le bouton affiche ⏳ En cours… (⏳ Running…) et la requête attend la fin (environ deux fois duration_secs). Le test sort par le même chemin que les moteurs : par le bind_interface du moteur dont le rôle est race (ou du premier moteur), tunnel WireGuard géré compris, avec --bind-dev (Linux) ; sans interface, par la route par défaut. Les torrents continuent de tourner ; leur débit est lu à mi-parcours de chaque sens et affiché à côté du résultat.

Carte Affiche
Envoi (test seul) (Upload (test only)) / Réception (test seul) (Download (test only)) ce qu'iperf3 a mesuré (ce qui restait de la ligne)
Lien total ↑ (test + partage) (Total link ↑ (test + seed)) / Lien total ↓ (test + partage) (Total link ↓ (test + seed)) iperf3 + ce que les torrents (tous les moteurs) ont échangé pendant ce temps
Dernier test (Last test) quand ; ou Erreur : (Error: <message>) quand le lancement a été refusé ou a échoué

Le graphique Envoi / réception (Mbps), 7 derniers jours (Upload / Download (Mbps), last 7 days) montre l'historique, gardé dans bench.db (le record Meilleur test de ligne en vient). Erreurs : 400 iperf3_server not configured in [vpn_speedtest] (aussi quand enabled = false) ou the engines go out through a SOCKS5 proxy, which iperf3 cannot use ; 409 a speedtest is already running ; 502 pour un échec d'iperf3, nommé par sens : upload: … et/ou download: … joints par , (par exemple upload: cannot run iperf3: … ou download: iperf3 did not finish in 40s, la limite étant deux fois la durée du test + 20 s). Seule la sortie d'un moteur est mesurée.

iperf3 est fourni dans l'image Docker ; ailleurs, il doit être dans le PATH. Chaque test sature la ligne pendant environ deux fois duration_secs.

[vpn_speedtest]
enabled = true                      # absent = false
iperf3_server = "ping.online.net"   # absent = "" (aucun test)
# iperf3_port = 5201                # absent = 5201
# duration_secs = 10                # secondes par sens, 1-60 ; absent = 10
# interval_secs = 0                 # test automatique toutes les N s (jamais moins de 300) ; 0 ou absent = Lancer maintenant seulement

Les clés sont lues à chaque lancement, donc un changement fait dans Config s'applique au test suivant sans redémarrage. Avec interval_secs au-dessus de 0, le premier test automatique tourne un intervalle après le démarrage, et un échec journalise periodic speedtest: ….

Mise à jour : un fichier de configuration parti du default.toml de la 4.3 (ou repris de la 3.x) peut contenir interval_secs = 3600. En 4.3 la clé était ignorée ; depuis la 4.4 elle est lue, donc un tel fichier lance un test de ligne toutes les heures après la mise à jour. Mettez interval_secs = 0 (ou supprimez-la) pour garder Lancer maintenant seulement.

Comparaison A / B

Comparaison A / B (A / B comparison) compare deux périodes contiguës autour d'un changement : remplissez Début de la période 1 (Start of period 1), Point médian (changement) (Middle point (change)), Fin de la période 2 (End of period 2), puis Comparer (Compare). Le tableau liste, par métrique échantillonnée, P1 moy (P1 avg), P1 max, P2 moy (P2 avg), P2 max et Δ moy (Δ avg) (relatif à P1, en vert ou en rouge selon le sens qui est meilleur), avec P1 : {p1} échantillons, P2 : {p2} échantillons (P1: {p1} samples, P2: {p2} samples). Les métriques sans nom convivial affichent leur nom de colonne (par exemple global_uploaded, open_fds). Aucune donnée sur cette plage. (No data for this range.) signifie qu'un des côtés n'a aucun échantillon.

GET /api/benchmark/compare?start=&mid=&end= (secondes Unix, start < mid < end) renvoie la même chose avec avg, max, p95 et count par côté et delta_avg_pct ; le p95 n'est pas affiché dans l'interface.

Bug connu en 4.4 : race_avg_share et hoard_session_uploaded figurent dans la comparaison mais l'échantillonneur ne les écrit jamais, donc ils valent toujours 0 et Δ 0 % — lisez les autres lignes. Les moteurs supplémentaires n'ont pas de ligne dans la comparaison : comparez leurs courbes sur le graphique Débit d'envoi, ou leurs séries /metrics.

Instantanés race

Toutes les 5 s, pour chaque torrent du moteur d'identifiant race qui n'est pas encore complet, Hydranos enregistre un instantané avec ses dix pairs les plus rapides. La chronologie race les dessine ; GET /api/benchmark/race-snapshots/:info_hash les renvoie seuls (null quand il n'y en a pas). Ils sont supprimés avec les événements race du torrent quand il quitte le moteur. Les moteurs supplémentaires de rôle race n'ont pas d'instantanés.

Accepté mais ignoré en 4.4 : la section [bench] (enabled, retention_days, race_snapshot_retention_days, snapshot_interval_secs, prune_interval_mins, vacuum) ressemble à des réglages d'enregistrement et de rétention — le journal de démarrage avertit config: [bench] is ignored: bench recording and its retention are built in; none of these keys is read. Instead: nothing; delete the section. — pour récupérer de l'espace, arrêtez Hydranos et supprimez ou archivez bench.db ; il est recréé vide au démarrage suivant et vous perdez l'historique, les tests de ligne et les Records.

Santé des trackers

L'onglet Trackers affiche, par hôte de tracker, les erreurs d'annonce des 60 dernières minutes par classe et une sévérité rouge/orange ; le badge de l'onglet compte les trackers rouges et orange. La description complète se trouve sur Trackers & annonces.

Pour les scripts, les mêmes données sont disponibles avec la clé API :

curl -s -H "X-Api-Key: YOUR_API_KEY" http://localhost:8199/api/announce/health
curl -s -H "X-Api-Key: YOUR_API_KEY" "http://localhost:8199/api/announce/errors?host=tracker.example.org"

Les deux couvrent tous les moteurs ; un tracker en échec sur deux moteurs compte une seule fois dans le badge.

Rapport d'anomalies

GET /api/health/anomalies (clé API requise ; c'est aussi l'outil MCP health) sert le dernier résultat d'une passe d'arrière-plan plus des compteurs en direct : l'appel lui-même ne parcourt jamais le catalogue. La passe tourne 2 minutes après le démarrage, puis toutes les 5 minutes, sur chaque moteur ; quand elle trouve quelque chose, elle journalise health scan found something (anomalies=). L'interface web n'appelle pas ce point d'accès.

Contrôle (counts) Signification
files_missing un fichier que le torrent devrait contenir a disparu du disque
ghost un torrent actif dont le chemin de sauvegarde a disparu
fake_seed annoncé comme en seed sans détenir les données
starved un téléchargement dont l'essaim a des seeds, et pourtant aucun pair connecté
redl a téléchargé plus de 1,2 × sa taille et au moins 1 Gio de plus (pièces récupérées à nouveau)
dual_seed le même info hash seedé par deux moteurs
path_collision deux torrents qui nomment un même fichier avec des octets différents, tels que rencontrés à l'ajout ou à la revérification
trackers_failing, announces_late, engines_held, disks_low en direct : hôtes de tracker rouges ou orange selon la règle de l'onglet Trackers, annonces en retard de plus de 5 s, moteurs retenus par start_paused, systèmes de fichiers à court d'espace

Autres champs : scan (pending jusqu'à la première passe, puis done), generated_at, scan_duration_ms, scanned (par moteur, plus scanned_race / scanned_hoard), anomalies (jusqu'à 500 entrées {type, engine, info_hash, name, detail, wasted_bytes}, anomalies_truncated au-delà), wasted_bytes, efficiency (octets utiles ÷ octets téléchargés), redl_historical / redl_historical_bytes (plus de 1,2 × la taille et 50 Mio de plus), trackers ({host, severity, engines}), trackers_red, announces (late, held_engines), disks et engines (torrents et états par moteur).

disks a une ligne par système de fichiers contenant data_dir ou un chemin de sauvegarde vu à la dernière passe : path, free_bytes, total_bytes, free_pct, et low quand il reste moins de 5 Gio ou moins de 2 % de libre.

Diagnostics mémoire (Linux)

Sous Linux et les autres builds Unix, Hydranos utilise l'allocateur jemalloc et réagit à deux signaux. Aucun des deux n'existe sous Windows.

Signal Effet
SIGUSR1 écrit un profil du tas. Ne fonctionne que si MALLOC_CONF active le profilage. L'image Docker le fait par défaut (prof:true,prof_active:true,lg_prof_sample:19,prof_prefix:/config/jeprof), donc des fichiers nommés /config/jeprof.* apparaissent. Sinon, le journal indique jemalloc prof.dump failed.
SIGUSR2 rend immédiatement au système les pages inutilisées de l'allocateur et journalise la mémoire résidente avant et après. La libération accélérée reste en vigueur jusqu'au redémarrage du processus.
docker kill --signal=SIGUSR1 hydranos       # Docker
sudo systemctl kill -s SIGUSR2 hydranos     # systemd

La ligne jemalloc allocated=… resident=… toutes les 5 minutes, et hydra_memory_allocated_bytes / hydra_memory_resident_bytes sur /metrics, vous disent dans quel cas vous êtes : si resident suit allocated, la mémoire est réellement utilisée ; si resident est bien plus grand, SIGUSR2 en rendra la plus grande partie. L'image Docker paie en permanence un petit surcoût d'échantillonnage pour le profilage ; pour le désactiver, mettez MALLOC_CONF à une valeur vide dans le environment: de votre compose.

Voir aussi

⚠️ **GitHub.com Fallback** ⚠️