From b6bb67efbdc1c196e687d9424f5ea5505f21e7c9 Mon Sep 17 00:00:00 2001 From: Jay Caines-Gooby Date: Thu, 11 Apr 2019 23:06:24 +0100 Subject: [PATCH] asciicast and gif --- LICENSE | 21 ------- README.md | 169 ------------------------------------------------------ demo.cast | 18 ++++++ demo.gif | Bin 0 -> 22940 bytes 4 files changed, 18 insertions(+), 190 deletions(-) delete mode 100644 LICENSE delete mode 100644 README.md create mode 100644 demo.cast create mode 100644 demo.gif diff --git a/LICENSE b/LICENSE deleted file mode 100644 index fdbe470..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Jay Caines-Gooby - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index cd28817..0000000 --- a/README.md +++ /dev/null @@ -1,169 +0,0 @@ -# Introduction - -Measures [time-to-first-byte](https://en.wikipedia.org/wiki/Time_to_first_byte) for single or multiple URLs. Can show you quickest, slowest & median TTFB values plus optionally log all response headers. - -``` -Usage: ttfb [options] url [url...] - -d debug - -l (infers -d) log response headers. Defaults to ./curl.log - -n of times to test time to first byte - -v verbose output. Show response breakdown (DNS lookup, TLS handshake etc) -``` - -Implicitly follows a redirection chain using curl's `-L` option. - -Can log all response headers (the default log file is `./curl.log`) by calling with `-d`. - -Override the default log file by specifying `-l /some/file`. - -Get quickest, slowest and median TTFB values by specifying the number of times to call a URL; use `-n2` for 2 tests, `-n5` for 5 and so on. - -Uses the calculation `%{time_starttransfer¹} - %{time_appconnect²}` which doesn't include any connection overhead, to better approximate [devtool’s TTFB figure](https://developers.google.com/web/tools/chrome-devtools/network/understanding-resource-timing#slow_time_to_first_byte). - -¹ [`time_starttransfer`](https://github.com/curl/curl/blob/e431daf013ea04cb1a988a2009d820224ef5fb79/docs/cmdline-opts/write-out.d#L141-L144) -> The time, in seconds, it took from the start until the first byte was just about to be transferred. This includes time_pretransfer and also the time the server needed to calculate the result. - -² [`time_appconnect`](https://github.com/curl/curl/blob/e431daf013ea04cb1a988a2009d820224ef5fb79/docs/cmdline-opts/write-out.d#L118-L120) ->The time, in seconds, it took from the start until the SSL/SSH/etc -connect/handshake to the remote host was completed. - -# Genesis -Based on a [gist](https://gist.github.com/sandeepraju/1f5fbdbdd89551ba7925abe2645f92b5) -by https://github.com/sandeepraju - -Modified by jay@gooby.org, [@jaygooby](https://twitter.com/jaygooby) - -# Usage - -``` -Usage: ttfb [options] url [url...] - -d debug - -l (infers -d) log response headers. Defaults to ./curl.log - -n of times to test time to first byte - -v verbose output. Show response breakdown (DNS lookup, TLS handshake etc) -``` - -## Examples - -Basic usage: - -``` -$ ttfb example.com -.227436 -``` - -Basic usage with verbose response breakdown: - -``` -$ ttfb -v https://example.com -DNS lookup: 0.005152 TLS handshake: 0.000000 TTFB including connection: 0.200831 TTFB: .200831 Total time: 0.201132 -``` - -Test multiple times: - -``` -$ ttfb -n 5 example.com/example/url -..... -fastest .177263 slowest .214302 median .179957 -``` - -Test multiple URLs: - -``` -$ ttfb bbc.co.uk news.bbc.co.uk -bbc.co.uk .049985 -news.bbc.co.uk .054122 -``` - -Test multiple URLs, multiple times: - -``` -$ ttfb -n 5 bbc.co.uk news.bbc.co.uk -..... -..... -bbc.co.uk fastest .030936 slowest .057755 median .034663 -news.bbc.co.uk fastest .031413 slowest .182791 median .035001 -``` - -Verbose response breakdown when multiple tests specified: - -``` -$ ttfb -v -n 5 bbc.co.uk -DNS lookup: 0.005335 TLS handshake: 0.102314 TTFB including connection: 0.148328 TTFB: .046014 Total time: 0.646115 -DNS lookup: 0.005322 TLS handshake: 0.102609 TTFB including connection: 0.150693 TTFB: .048084 Total time: 0.644611 -DNS lookup: 0.004277 TLS handshake: 0.102066 TTFB including connection: 0.172199 TTFB: .070133 Total time: 1.196256 -DNS lookup: 0.004444 TLS handshake: 0.107375 TTFB including connection: 0.160771 TTFB: .053396 Total time: 0.637290 -DNS lookup: 0.005352 TLS handshake: 0.118882 TTFB including connection: 0.168772 TTFB: .049890 Total time: 0.653761 - -fastest .046014 slowest .070133 median .049890 -``` - -Log all the response headers for multiple tests to multiple URLs: - -``` -ttfb -d -n 2 bbc.co.uk https://www.bbc.co.uk/weather -.. -.. -bbc.co.uk fastest .027550 slowest .055215 median .041382 -https://www.bbc.co.uk/weather fastest .101020 slowest .297923 median .199471 - -$ ls *.log -bbc_co_uk-curl.log https___www_bbc_co_uk_weather-curl.log - -$ cat https___www_bbc_co_uk_weather-curl.log -HTTP/2 200 -server: openresty -x-cache-action: MISS -vary: Accept-Encoding,X-BBC-Edge-Cache,X-BBC-Edge-Scheme,X-CDN -x-cache-age: 0 -cache-control: private, stale-while-revalidate=10, max-age=0, must-revalidate -content-type: text/html;charset=utf-8 -x-mrid: w1 -date: Thu, 11 Apr 2019 17:08:07 GMT -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -x-lb-nocache: true -x-msig: 24e37f81323984e4e45b8048f9e3c94a -x-frame-options: SAMEORIGIN -content-length: 1077454 - -HTTP/2 200 -server: openresty -x-cache-action: MISS -vary: Accept-Encoding,X-BBC-Edge-Cache,X-BBC-Edge-Scheme,X-CDN -x-cache-age: 0 -cache-control: private, stale-while-revalidate=10, max-age=0, must-revalidate -content-type: text/html;charset=utf-8 -x-mrid: w1 -date: Thu, 11 Apr 2019 17:08:08 GMT -x-xss-protection: 1; mode=block -x-content-type-options: nosniff -x-lb-nocache: true -x-msig: 24e37f81323984e4e45b8048f9e3c94a -x-frame-options: SAMEORIGIN -content-length: 1077454 -``` - -# More detail on time-to-first-byte - -See https://blog.cloudflare.com/a-question-of-timing/ -and https://curl.haxx.se/docs/manpage.html for an explanation -of how the curl variables relate to the various stages of -the transfer. - -![Diagram showing what each of the curl variable timings refer to against a typical HTTP over TLS 1.2 connection](https://blog.cloudflare.com/content/images/2018/10/Screen-Shot-2018-10-16-at-14.51.29-1.png) - -To get a better approximation of devtool's TTFB, we consider -the time without the connection overhead: -`%{time_starttransfer} - %{time_appconnect}` - -Uses a dirty `eval` to do the ttfb arithmetic. Depends -on `bc` and `column` commands. - -# TODO - - * [x] Show progress when more than one request (`-n 2` etc) option is set - - * [ ] Sort output by fastest TTFB when multiple URLs are supplied - - * [ ] Colour code the `TTFB:` figure in the standard response, according to the speed of the response. diff --git a/demo.cast b/demo.cast new file mode 100644 index 0000000..2b81ff7 --- /dev/null +++ b/demo.cast @@ -0,0 +1,18 @@ +{"version": 2, "width": 204, "height": 56, "timestamp": 1555020136, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} +[0.706225, "o", "$ "] +[1.48203, "o", "ttfb -n"] +[1.482541, "o", "3 news.bbc.co.uk https://en.w"] +[1.482668, "o", "ikipedia"] +[1.482914, "o", ".org/wiki/Time_to"] +[1.48303, "o", "_first_by"] +[1.483113, "o", "te"] +[3.722443, "o", "\r\n"] +[4.641905, "o", "."] +[5.978201, "o", "."] +[6.739551, "o", "."] +[6.739693, "o", "\r\n"] +[7.040632, "o", "."] +[7.338501, "o", "."] +[7.623244, "o", ".\r\n"] +[7.631003, "o", "news.bbc.co.uk \u001b[32mfastest \u001b[39m.039445 \u001b[91mslowest \u001b[39m.653135 \u001b[95mmedian \u001b[39m.040998\u001b[39m\r\nhttps://en.wikipedia.org/wiki/Time_to_first_byte \u001b[32mfastest \u001b[39m.049489 \u001b[91mslowest \u001b[39m.050681 \u001b[95mmedian \u001b[39m.049572\u001b[39m\r\n"] +[7.706225, "o", "$ "] diff --git a/demo.gif b/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..deff230885cfa36f192f531c58407eb868cbbb38 GIT binary patch literal 22940 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 SNo(pQ24CKOTm8L~IQT!v(<##c literal 0 HcmV?d00001