夜鶯資深使用者群有人推薦的一個工具,看了一下真挺好的,也推薦給大家。
需求場景
A 服務呼叫 B 服務的 HTTP 介面,發現 B 服務返回超時,不確定是網路的問題還是 B 服務的問題,需要排查。
工具簡介
就類似 curl,httpstat 也可以請求某個後端,而且可以把各個階段的耗時都展示出來,包括 DNS 解析、TCP 連線、TLS 握手、Server 處理並等待響應、完成最終傳輸等,非常直觀。上圖:
看著不錯吧,咱們一起測試一下。這個工具是 go 寫的,作者沒有提供二進位制包,所以需要自己編譯。
安裝 Go 環境
自己編輯就需要有 Go 環境,我這裡給大家簡單演示一下。我的電腦是 Mac,M1 晶片,首先下載 go 安裝包(https://go.dev/dl/):https://go.dev/dl/go1.22.2.darwin-arm64.tar.gz。一般使用 tar.gz 的檔案就好,不用 pkg。
cd /Users/ulric/works/tgz
wget https://go.dev/dl/go1.22.2.darwin-arm64.tar.gz
tar -zxf go1.22.2.darwin-arm64.tar.gz
操作如上,/Users/ulric/works/tgz/go
這個目錄就是 go 的安裝目錄,然後配置環境變數:
export GOROOT=/Users/ulric/works/tgz/go
export GOPATH=/Users/ulric/works/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
GOROOT 是 go 的安裝目錄,GOPATH 是 go 的工作目錄,PATH 是環境變數,這樣配置之後,就可以使用 go 命令了。上面的幾行命令可以儲存在 ~/.bash_profile
或者 ~/.zshrc
裡,這樣每次開啟終端都會自動載入。
驗證 go 環境是否正常安裝:
% go version
go version go1.22.2 darwin/arm64
安裝 httpstat
有了 go 環境了,安裝 httpstat 就很簡單了:
ulric@ulric-flashcat ~ % go install github.com/davecheney/httpstat@latest
go: downloading github.com/davecheney/httpstat v1.1.0
go: downloading golang.org/x/sys v0.0.0-20201223074533-0d417f636930
測試 httpstat
安裝完成之後,就可以使用了,我們看看 httpstat 有哪些引數可用:
ulric@ulric-flashcat ~ % httpstat --help
Usage: httpstat [OPTIONS] URL
OPTIONS:
-4 resolve IPv4 addresses only
-6 resolve IPv6 addresses only
-E string
client cert file for tls config
-H value
set HTTP header; repeatable: -H 'Accept: ...' -H 'Range: ...'
-I don't read body of request
-L follow 30x redirects
-O save body as remote filename
-X string
HTTP method to use (default "GET")
-d string
the body of a POST or PUT request; from file use @filename
-k allow insecure SSL connections
-o string
output file for body
-v print version number
ENVIRONMENT:
HTTP_PROXY proxy for HTTP requests; complete URL or HOST[:PORT]
used for HTTPS requests if HTTPS_PROXY undefined
HTTPS_PROXY proxy for HTTPS requests; complete URL or HOST[:PORT]
NO_PROXY comma-separated list of hosts to exclude from proxy
很多引數和 curl 都很像。比如我用 curl 測試一個請求:
ulric@ulric-flashcat ~ % curl -X POST -H "Content-Type: application/json" -d '{"service": "tomcat"}' 'https://httpbin.org/post?name=ulric&city=beijing'
{
"args": {
"city": "beijing",
"name": "ulric"
},
"data": "{\"service\": \"tomcat\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Content-Length": "21",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "curl/8.4.0",
"X-Amzn-Trace-Id": "Root=1-6655a6c4-4522374c5b8d68143d638049"
},
"json": {
"service": "tomcat"
},
"origin": "123.113.255.104",
"url": "https://httpbin.org/post?name=ulric&city=beijing"
}
把 curl 換成 httpstat,請求效果如下:
ulric@ulric-flashcat ~ % httpstat -X POST -H "Content-Type: application/json" -d '{"service": "tomcat"}' 'https://httpbin.org/post?name=ulric&city=beijing'
Connected to 34.198.16.126:443
HTTP/2.0 200 OK
Server: gunicorn/19.9.0
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Length: 529
Content-Type: application/json
Date: Tue, 28 May 2024 09:41:44 GMT
Body discarded
DNS Lookup TCP Connection TLS Handshake Server Processing Content Transfer
[ 11ms | 217ms | 446ms | 570ms | 0ms ]
| | | | |
namelookup:11ms | | | |
connect:229ms | | |
pretransfer:678ms | |
starttransfer:1248ms |
total:1248ms
可以看到,httpstat 把請求的各個階段的耗時都展示出來了,非常直觀。
本文作者:秦曉輝,快貓星雲聯合創始人,開源監控產品 Open-Falcon、Nightingale 創始人,極客時間《運維監控系統實戰筆記》作者