Go client で http を trace する
よく分からない挙動に立ち向かうhttp は難しい
http だけでもヘッダやボディを含めて色々問題の原因となりうるものがある
その上で、tcp, ip, ネットワーク、物理レイヤーが原因となりうる 😇事件は internet のつながらない環境で起こった 🔥
ruby のクライアントからオブジェクトストレージへのアクセスが遅い。
しかし、問題はクライアントか、サーバーか、ネットワークか...え、ruby の実行環境持っていかないといけないの?
internet がつながらない -> ruby をインストール
-> 解決と思いきや、gem が足りない -> gem インストール
-> 解決と思いきや、native build が必要 -> gcc, make をインストール -> 失敗 😇え、ストレージチームも確認したいって?
ruby の環境を作って、gem インストールしてもらってつらい...使いそうなメソッド定義
type ClientTrace struct {
GetConn func(hostPort string)
GotConn func(GotConnInfo)
GotFirstResponseByte func()
DNSStart func(DNSStartInfo)
DNSDone func(DNSDoneInfo)
ConnectStart func(network, addr string)
ConnectDone func(network, addr string, err error)
TLSHandshakeStart func()
TLSHandshakeDone func(tls.ConnectionState, error)
WroteHeaderField func(key string, value []string)
WroteHeaders func()
WroteRequest func(WroteRequestInfo)
}
google へ https してみる
2019/08/17 18:37:54.178798 GetConn: google.com:443
2019/08/17 18:37:54.179219 DNSStart: {Host:google.com}
2019/08/17 18:37:54.181677 DNSDone: {Addrs:[{IP:216.58.196.238 Zone:}
2019/08/17 18:37:54.288372 TLSHandshakeStart
2019/08/17 18:37:54.942141 TLSHandshakeDone: {Version:771 HandshakeComplete:true DidResume:false CipherSuite:49195 NegotiatedProtocol:h2 NegotiatedProtocolIsMutual:true }
2019/08/17 18:37:54.942706 GotConn:
2019/08/17 18:37:54.942855 WroteHeaderField: :authority [google.com]
2019/08/17 18:37:54.942865 WroteHeaderField: :method [GET]
2019/08/17 18:37:54.942870 WroteHeaderField: :path [/]
2019/08/17 18:37:54.942876 WroteHeaderField: :scheme [https]
2019/08/17 18:37:54.942886 WroteHeaderField: accept-encoding [gzip]
2019/08/17 18:37:54.942892 WroteHeaderField: user-agent [Go-http-client/2.0]
2019/08/17 18:37:54.942956 WroteRequest: {Err:}
2019/08/17 18:37:55.170277 GotFirstResponseByte
tcp dump も取っておこう 📃
linux build して、クライアントとサーバー側で動作確認 🤝
GOARCH="amd64" GOOS="linux" go build main.go