Files
serv_benchmark/DEBUG_NETWORK_BENCH.md
2025-12-14 10:40:54 +01:00

8.0 KiB

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)

# 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

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 :

{
  "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 :

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 "" :

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 :

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

# 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

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

# 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 :

    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