golang, http, httptrace, network, troubleshooting
Go client で http を trace する
この記事はもともと reveal.js のスライドとして公開していた内容を、記事として書き起こしたものです
よく分からない挙動に立ち向かう
Day2 はつらい 😢
またその話か。
http は難しい
http だけでもヘッダやボディを含めて色々問題の原因となりうるものがある。
その上で、tcp, ip, ネットワーク、物理レイヤーが原因となりうる 😇
事件は internet のつながらない環境で起こった 🔥
ruby のクライアントからオブジェクトストレージへのアクセスが遅い。
しかし、問題はクライアントか、サーバーか、ネットワークか…
え、ruby の実行環境持っていかないといけないの?
internet がつながらない -> ruby をインストール
-> 解決と思いきや、gem が足りない -> gem インストール
-> 解決と思いきや、native build が必要 -> gcc, make をインストール -> 失敗 😇
え、ストレージチームも確認したいって?
ruby の環境を作って、gem インストールしてもらってつらい…
そこで、奥さん。バイナリ簡単に作れる Go
httptrace-client
Go の httptrace パッケージを使っただけのサンプル。
httptrace package
client での http header の状態のみならず、DNS の問い合わせ、connection の開始と完了などの状態を trace できる。
src/net/http/httptrace/trace.go
使いそうなメソッド定義
1type ClientTrace struct {
2 GetConn func(hostPort string)
3 GotConn func(GotConnInfo)
4 GotFirstResponseByte func()
5 DNSStart func(DNSStartInfo)
6 DNSDone func(DNSDoneInfo)
7 ConnectStart func(network, addr string)
8 ConnectDone func(network, addr string, err error)
9 TLSHandshakeStart func()
10 TLSHandshakeDone func(tls.ConnectionState, error)
11 WroteHeaderField func(key string, value []string)
12 WroteHeaders func()
13 WroteRequest func(WroteRequestInfo)
14}
google へ https してみる
12019/08/17 18:37:54.178798 GetConn: google.com:443
22019/08/17 18:37:54.179219 DNSStart: {Host:google.com}
32019/08/17 18:37:54.181677 DNSDone: {Addrs:[{IP:216.58.196.238 Zone:}
42019/08/17 18:37:54.288372 TLSHandshakeStart
52019/08/17 18:37:54.942141 TLSHandshakeDone: {Version:771 HandshakeComplete:true DidResume:false CipherSuite:49195 NegotiatedProtocol:h2 NegotiatedProtocolIsMutual:true }
62019/08/17 18:37:54.942706 GotConn:
72019/08/17 18:37:54.942855 WroteHeaderField: :authority [google.com]
82019/08/17 18:37:54.942865 WroteHeaderField: :method [GET]
92019/08/17 18:37:54.942870 WroteHeaderField: :path [/]
102019/08/17 18:37:54.942876 WroteHeaderField: :scheme [https]
112019/08/17 18:37:54.942886 WroteHeaderField: accept-encoding [gzip]
122019/08/17 18:37:54.942892 WroteHeaderField: user-agent [Go-http-client/2.0]
132019/08/17 18:37:54.942956 WroteRequest: {Err:<nil>}
142019/08/17 18:37:55.170277 GotFirstResponseByte
tcp dump も取っておこう 📃

Linux 向けに build して、クライアントとサーバー側で動作確認 🤝
1GOARCH="amd64" GOOS="linux" go build main.go
day 2 へ立ち向かおう 😇
FIN