# Debug - Benchmark Réseau (erreur jq) Date : 13 décembre 2025 Version : 1.2.4 (debug) ## 🐛 Problème à Déboguer ### Symptômes Erreur persistante dans le benchmark réseau : ``` ✓ Benchmark Réseau en cours (vers 10.0.1.97)... jq: invalid JSON text passed to --argjson Use jq --help for help with command-line options, or see the jq manpage, or online docs at https://jqlang.github.io/jq ``` ### Contexte - Le benchmark mémoire fonctionne maintenant correctement (8667.08 MiB/s) - Les scores CPU et Disque sont élevés mais acceptés (validation à 10000) - L'erreur jq se produit lors de la construction du JSON réseau ### Hypothèses 1. Une des valeurs `upload_mbps`, `download_mbps`, `ping_ms` ou `net_score` est invalide 2. La valeur peut contenir des caractères non numériques 3. La valeur peut être vide `""` au lieu de `"0"` ou `"null"` 4. `safe_bc()` peut retourner une valeur non numérique dans certains cas --- ## 🔍 Debug Ajouté ### Code Debug (lignes 785-820) ```bash # Extraction upload local upload_bps=$(echo "$upload_result" | jq '.end.sum_sent.bits_per_second // 0') echo " [DEBUG] upload_bps extrait de iperf3='$upload_bps'" >&2 upload_mbps=$(safe_bc "scale=2; $upload_bps / 1000000") echo " [DEBUG] upload_mbps après conversion='$upload_mbps'" >&2 # Extraction download local download_bps=$(echo "$download_result" | jq '.end.sum_received.bits_per_second // 0') echo " [DEBUG] download_bps extrait de iperf3='$download_bps'" >&2 download_mbps=$(safe_bc "scale=2; $download_bps / 1000000") echo " [DEBUG] download_mbps après conversion='$download_mbps'" >&2 # Extraction ping local ping_output=$(ping -c 5 "$target" 2>/dev/null | grep 'avg' || echo "") echo " [DEBUG] ping_output='$ping_output'" >&2 if [[ -n "$ping_output" ]]; then ping_ms=$(echo "$ping_output" | awk -F'/' '{print $5}') echo " [DEBUG] ping_ms extrait='$ping_ms'" >&2 fi # Calcul score local net_score=$(safe_bc "scale=2; ($upload_mbps + $download_mbps) / 20") # Validation avant jq [[ -z "$ping_ms" || "$ping_ms" == "null" ]] && ping_ms="0" # DEBUG: Afficher les valeurs avant jq echo " [DEBUG] upload_mbps='$upload_mbps' download_mbps='$download_mbps' ping_ms='$ping_ms' net_score='$net_score'" >&2 # Appel jq avec capture d'erreur net_bench=$(jq -n \ --argjson upload "$upload_mbps" \ --argjson download "$download_mbps" \ --argjson ping "$ping_ms" \ --argjson score "$net_score" \ '{upload_mbps: $upload, download_mbps: $download, ping_ms: $ping, score: $score}' 2>&1) local jq_exit_code=$? if [[ $jq_exit_code -ne 0 ]]; then log_error "Erreur jq lors de la construction du JSON réseau" echo " [DEBUG] Sortie jq: $net_bench" >&2 echo " [DEBUG] Valeurs: upload='$upload_mbps' download='$download_mbps' ping='$ping_ms' score='$net_score'" >&2 net_bench="null" fi ``` ### Fichiers Modifiés | Fichier | Lignes | Type | Description | |---------|--------|------|-------------| | `scripts/bench.sh` | 785-787 | Debug | Upload bps extraction et conversion | | `scripts/bench.sh` | 793-795 | Debug | Download bps extraction et conversion | | `scripts/bench.sh` | 800-803 | Debug | Ping extraction | | `scripts/bench.sh` | 807 | Debug | Valeurs finales avant jq | | `scripts/bench.sh` | 814-822 | Debug | Capture erreur jq et affichage détaillé | --- ## 🧪 Test avec Debug ### Commande ```bash sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log ``` ### Sortie Attendue Si tout fonctionne correctement : ``` ✓ Benchmark Réseau en cours (vers 10.0.1.97)... [DEBUG] upload_bps extrait de iperf3='945230000' [DEBUG] upload_mbps après conversion='945.23' [DEBUG] download_bps extrait de iperf3='943120000' [DEBUG] download_mbps après conversion='943.12' [DEBUG] ping_output='rtt min/avg/max/mdev = 0.280/0.342/0.450/0.062 ms' [DEBUG] ping_ms extrait='0.342' [DEBUG] upload_mbps='945.23' download_mbps='943.12' ping_ms='0.342' net_score='94.41' ✓ Réseau: ↑945.23Mbps ↓943.12Mbps (ping: 0.342ms, score: 94.41) ``` Si erreur : ``` ✓ Benchmark Réseau en cours (vers 10.0.1.97)... [DEBUG] upload_bps extrait de iperf3='945230000' [DEBUG] upload_mbps après conversion='945.23' [DEBUG] download_bps extrait de iperf3='[VALEUR_PROBLEMATIQUE]' [DEBUG] download_mbps après conversion='[VALEUR_PROBLEMATIQUE]' [DEBUG] ping_output='...' [DEBUG] ping_ms extrait='...' [DEBUG] upload_mbps='945.23' download_mbps='[VALEUR_PROBLEMATIQUE]' ping_ms='...' net_score='...' ✗ Erreur jq lors de la construction du JSON réseau [DEBUG] Sortie jq: jq: invalid JSON text passed to --argjson [DEBUG] Valeurs: upload='945.23' download='[VALEUR_PROBLEMATIQUE]' ping='...' score='...' ``` --- ## 📊 Cas à Tester ### Cas 1 : iperf3 retourne null Si iperf3 retourne un JSON sans les champs attendus : ```json { "end": {} } ``` Alors `jq '.end.sum_sent.bits_per_second // 0'` devrait retourner `0`. **Vérification** : `upload_bps` devrait être `0` ### Cas 2 : iperf3 retourne une chaîne Si pour une raison quelconque, jq retourne `"null"` (string) au lieu de `null` : ```bash upload_bps="null" # String, pas JSON null ``` Alors `safe_bc "scale=2; null / 1000000"` peut échouer ou retourner une valeur bizarre. **Vérification** : `upload_mbps` devrait être `0` grâce à safe_bc ### Cas 3 : safe_bc retourne une valeur vide Si `safe_bc` échoue silencieusement et retourne `""` : ```bash upload_mbps="" ``` Alors `--argjson upload ""` causera l'erreur jq. **Vérification** : Le debug montrera `upload_mbps=''` ### Cas 4 : Ping retourne une valeur avec espace ou caractère spécial Si le ping contient des caractères non numériques : ```bash ping_ms="0.342 " # Espace en fin ping_ms=" 0.342" # Espace en début ping_ms="0,342" # Virgule au lieu de point ``` Alors jq rejettera la valeur. **Vérification** : Le debug montrera les espaces ou caractères --- ## 🔧 Corrections Potentielles ### Fix 1 : Valider toutes les valeurs numériques avant jq ```bash # Valider upload_mbps [[ -z "$upload_mbps" || ! "$upload_mbps" =~ ^[0-9.]+$ ]] && upload_mbps="0" # Valider download_mbps [[ -z "$download_mbps" || ! "$download_mbps" =~ ^[0-9.]+$ ]] && download_mbps="0" # Valider ping_ms [[ -z "$ping_ms" || ! "$ping_ms" =~ ^[0-9.]+$ ]] && ping_ms="0" # Valider net_score [[ -z "$net_score" || ! "$net_score" =~ ^[0-9.]+$ ]] && net_score="0" ``` ### Fix 2 : Améliorer safe_bc pour toujours retourner un nombre ```bash safe_bc() { local expr="$1" local out out=$(echo "$expr" | bc 2>/dev/null) || out="0" # Si out est vide ou non numérique, forcer à 0 [[ -z "$out" || ! "$out" =~ ^-?[0-9.]+$ ]] && out="0" echo "$out" } ``` ### Fix 3 : Nettoyer ping_ms des espaces ```bash # Nettoyer les espaces dans ping_ms ping_ms=$(echo "$ping_ms" | tr -d ' \t\n\r') ``` --- ## ✅ Prochaines Étapes 1. **Exécuter le benchmark avec debug** : ```bash sudo bash scripts/bench.sh 2>&1 | tee /tmp/bench_debug.log ``` 2. **Analyser la sortie debug** : - Identifier quelle valeur cause l'erreur - Noter la valeur exacte (y compris espaces invisibles) 3. **Appliquer le fix approprié** : - Si c'est une valeur vide : validation avant jq - Si c'est une valeur non numérique : améliorer safe_bc - Si c'est un espace/caractère : nettoyage avec `tr` 4. **Retester** : - Vérifier que l'erreur jq a disparu - Vérifier que les valeurs réseau sont correctes - Désactiver le debug une fois corrigé --- ## 📝 Notes - Le debug est affiché sur stderr (`>&2`) pour ne pas polluer stdout - Le code de sortie de jq est capturé avec `$?` - Si jq échoue, `net_bench` est mis à `"null"` pour éviter de planter le script - Tous les messages debug commencent par `[DEBUG]` pour faciliter le grep --- **Status** : ⏳ Debug ajouté, en attente de test **Prochaine action** : Exécuter le benchmark et analyser la sortie debug --- ## 🔗 Fichiers Liés - [HOTFIX_NETWORK_BENCH.md](HOTFIX_NETWORK_BENCH.md) - Fix safe_bc précédent - [HOTFIX_BENCH_IMPROVEMENTS.md](HOTFIX_BENCH_IMPROVEMENTS.md) - Fixes mémoire et ping - [bench.sh](scripts/bench.sh) - Script de benchmark client