![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Візуалайзація 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), але мені є лінь перевіряти.
no subject
This is precious.