henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2024-07-10 04:50 pm

Візуалайзація curl

Як хутко довести дівопсу або хмарному провайдеру що завантаження з серверу є повільне? Можна заміряти час загальний, чи копіювати все що curl написав на stderr, або вислати кєно зроблене на телефоні (вертикальне, тремтячою рукою, під кутом > 10°, на відстані > 1м від монітора).

Не пам'ятаю ув якій версії віндюка його іксплорер почав малювати графіка під час копіювання хфайлів (Vista?), але він (віндюк) так і не почав цього робити ані ув класичних своїх бовзерах минулого, ані ув своєму поточному безглуздому різновиді кроума для блінка.

Найнахабнішим повідомленням дівопсу був би svg:

та/чи рядки

00:00:01 1000k
00:00:02 2000k
00:00:03 2500k

ув якості доказу.

2й варяінт є найпростіший; curl, наприклад, друкує

fprintf(tool_stderr,
        "\r"
        "%-3s " /* percent downloaded */
        "%-3s " /* percent uploaded */
        "%s " /* Dled */
        "%s " /* Uled */
        "%5" CURL_FORMAT_CURL_OFF_T " " /* Xfers */
        "%5" CURL_FORMAT_CURL_OFF_T " " /* Live */
        " %s "  /* Total time */
        "%s "  /* Current time */
        "%s "  /* Time left */
        "%s "  /* Speed */
        "%5s" /* final newline */,
        …

кожну секунду, тому лише замінивши \r на \n можна відправляти повного логу:

$ curl http://example.com/1.zip -o 1.zip 2>&1 | tr \\r \\n

та вимагати сатисфакції.

Щоб намалювати графіка з gnuplot, нам потрібні Current time та Speed. Останнє доведеться конвертувати з 1234k чи 4567M ув байти. Спочатку я думав малоелегантно замінювати суфікси:

awk 'function expr(s) {
  h["k"]=2**10; h["M"]=2**20; h["G"]=2**30; h["T"]=2**40; h["P"]=2**50
  for (k in h) sub(k, "*"h[k], s); return s
}
/[0-9.][kMGTP]?$/ { print expr($NF) | "bc"; close("bc") }'

але, виявляється, саме для цього coreutils має ютіліту numfmt(1), про яку я ніколи не чув (додали недавно, лише 12 років тому, не встигаєш слідкувати за всіма ціма новими штуками):

$ echo lol 10M | numfmt --from iec --field 2
lol 10485760

Так, звичайно, зараз не роблять, а кожного разу ретельно пишуть нудні, багатослівні простирадла на пáйфоні. Те що має фітнутися ув 5 рядків шелових макс + 6 рядків скрипта gnuplot'у, потрібно ретельно розмазувати на 70+, ніби працюєш на ойбіем ув році 1984 і тобі платять за кількість рядків коду.

Повна версія іграшкового візуалайзатора пускається як

$ ./curlbench http://example.com/1.zip | gnuplot --persist

де gnuplot дозволяє зберегти графіка ув потрібному форматі.

$ cat curlbench
#!/usr/bin/env -S stdbuf -o0 bash

set -e -o pipefail
numfmt=`type -p gnumfmt numfmt;:`; test "${numfmt:?}"

cat <<E
set xdata time
set timefmt "%H:%M:%S"
set xlabel "Time"
set format y "%.0s%cB"
set grid
plot "-" using 1:2 with lines title ""
E

curl "$@" -fL -o /dev/null 2>&1 | tr \\r \\n | awk '
/[0-9.][kMGTP]?$/ {
  time = index($10, ":") == 0 ? $11 : $10
  if (time != "--:--:--") print time, $NF
}' | tr k K | $numfmt --from iec --field 2

Має працювати також на fbsd та маку (як були встановлені coreutils), але мені є лінь перевіряти.

juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-07-10 01:56 pm (UTC)(link)

This is precious.

click0: (Default)

[personal profile] click0 2024-07-10 08:10 pm (UTC)(link)

Во FreeBSD sysutils/coreutils отсутствует numfmt, но есть gnumfmt.

$ pkg info -l coreutils | grep numfmt
    /usr/local/bin/gnumfmt
    /usr/local/share/man/man1/gnumfmt.1.gz

$ echo lol 10M | gnumfmt --from iec --field 2
lol 10485760
Edited 2024-07-10 20:19 (UTC)