SRE 排障利器,介面請求超時試試 httpstat

SRETalk發表於2024-06-11

夜鶯資深使用者群有人推薦的一個工具,看了一下真挺好的,也推薦給大家。

需求場景

A 服務呼叫 B 服務的 HTTP 介面,發現 B 服務返回超時,不確定是網路的問題還是 B 服務的問題,需要排查。

工具簡介

就類似 curl,httpstat 也可以請求某個後端,而且可以把各個階段的耗時都展示出來,包括 DNS 解析、TCP 連線、TLS 握手、Server 處理並等待響應、完成最終傳輸等,非常直觀。上圖:

SRE 排障利器,介面請求超時試試 httpstat

看著不錯吧,咱們一起測試一下。這個工具是 go 寫的,作者沒有提供二進位制包,所以需要自己編譯。

安裝 Go 環境

自己編輯就需要有 Go 環境,我這裡給大家簡單演示一下。我的電腦是 Mac,M1 晶片,首先下載 go 安裝包():。一般使用 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 創始人,極客時間《運維監控系統實戰筆記》作者

相關文章