パケットの鼓動を可視化せよ:Tsharkで紐解くWeb APIの「沈黙」
夜中の3時、アラートの音が鳴り響く。監視画面には、APIエンドポイントのレイテンシ急増と、断続的な502 Bad Gatewayの文字。現場で何が起きているのか? ログには「タイムアウト」としか書かれていない。そんな時、教科書通りのpingやtracerouteで満足していては、障害の核心には辿り着けない。
ネットワークエンジニアの武器庫にある最強のメス、それがtsharkだ。今日は、GUIのWiresharkをサーバに持ち込めないような窮地で、僕らがどのようにしてパケットの海から真実を抽出しているのか、その「極意」を伝授しよう。
—
1. なぜ「tcpdump」ではなく「Tshark」なのか
ネットワークのトラブルシューティングにおいて、tcpdumpは確かに偉大だ。しかし、HTTP/2やTLS、あるいは特定のWeb APIのJSONペイロードの中身まで踏み込んで相関をとろうとした瞬間、tcpdumpのテキスト出力はただの「ノイズの塊」と化す。
tsharkが優れているのは、Wiresharkの強力なディセクタ(パケット解析エンジン)をCUIで直結できる点にある。-Y(Display Filter)でパケットの断片を削ぎ落とし、-T fieldsで必要な情報だけをCSVのように抽出する。このプロセスこそが、障害時の「真実」を見つける最短距離なんだ。
—
2. 実戦的コマンド:Display FilterとFields抽出の魔法
例えば、APIサーバの特定のエンドポイントに対して、どのクライアントがどれだけのレスポンスタイムで通信しているかを追いたいとしよう。
パケットを絞り込む(-Y)
まずは、不要なパケットを捨てる。http.request.uriやhttp.response.codeといったフィルタを駆使する。
# クライアントからのPOSTリクエストに絞り、レスポンスコードが200以外のものを抽出する
tshark -r capture.pcap -Y 'http.request.method == "POST" && http.response.code != 200'
必要なフィールドだけをCSVで抜き出す(-T fields)
ここからが本題だ。tsharkの真骨頂は、解析結果をデータとして加工できることにある。x-request-idヘッダーとレスポンス時間を抽出してみよう。
# -E separatorで区切り文字を指定し、必要なフィールドを抽出
tshark -r capture.pcap \
-Y 'http.response' \
-T fields \
-e frame.time \
-e http.header.x_request_id \
-e http.time \
-E separator=, \
-E header=y > api_latency.csv
このコマンドを実行すれば、Excelやpandasで即座にグラフ化可能なデータが手に入る。現場で「平均レイテンシは?」と聞かれた時、数万パケットの中から数秒で回答を出せるエンジニアは、信頼される。
—
3. 実務で使う「通信フロー」の読み解き方
Web APIのトラブルで最も多いのは、TCPハンドシェイクは完了しているのに、アプリケーション層でのレスポンスが極端に遅い、あるいは途中で切断されるケースだ。
ここで役立つのが、tcp.analysis.retransmissionやtcp.analysis.zero_windowといったフラグを使ったフィルタリングだ。
# TCPの再送が発生している通信だけを抽出(ネットワーク層の詰まりを可視化)
tshark -i eth0 -Y 'tcp.analysis.retransmission' -T fields -e ip.src -e ip.dst -e tcp.seq
もし、tcp.analysis.zero_windowが頻発していれば、それは受け手側のバッファが溢れている証拠。API側のスレッド枯渇や、DBのロック待ちが疑われる。こうしてレイヤーを跨いで相関を取るのが、シニアエンジニアの流儀だ。
—
4. 現場のTips:Fetch APIやcurlとの連携
トラブルが「特定環境のクライアントからのみ発生する」というケースもある。そんな時は、クライアントサイドでcurlを叩きながらtsharkで裏取りをする。
# クライアント側でトレースを仕込みつつ通信を実行
curl -v -H "X-Debug-Trace: true" https://api.example.com/v1/resource
この時、X-Debug-Traceのようなカスタムヘッダーを付与しておけば、tshark側のフィルタでそれをキーに特定のトランザクションだけを抽出できる。
# カスタムヘッダーをキーに抽出
tshark -r capture.pcap -Y 'http.header.x_debug_trace == "true"'
—
最後に:ツールに振り回されるな、パケットの声を聞け
ここまでtsharkのテクニックを語ったが、最後に一つだけ覚えておいてほしい。ツールはあくまで「パケットの声」を通訳する機械に過ぎない。
大切なのは、そのパケットが「なぜ」そのタイミングで発生したのか、TCPのシーケンス番号が何を物語っているのかを想像する力だ。コマンドは暗記する必要はない。僕らも現場ではマニュアルを叩きながら打っている。大事なのは、何を見つけたいかという「仮説」を常に持つことだ。
次のアラートが鳴った時、慌ててログを眺める前に、一度パケットをキャプチャしてみてほしい。そこには、あなたが探している答えの「全て」が記録されているはずだ。
健闘を祈る。また現場のどこかで会おう。
コメント