出力形式¶
httptap は、インタラクティブなトラブルシューティングから自動化されたスクリプティングまで、さまざまなユースケースに合わせた複数の出力形式をサポートしています。
リッチモード(デフォルト)¶
デフォルトの出力形式は Rich ライブラリを使用し、ターミナルに美しいウォーターフォールテーブルを表示します。
機能¶
- シンタックスハイライト付きの**色付き出力**
- タイミングフェーズの**視覚的なプログレスバー**
- 読みやすい**構造化されたテーブル**
- IP、TLS バージョン、証明書情報を含む**ネットワークの詳細**
- ステータス、ボディサイズ、
Serverヘッダー、リダイレクト先を示す**レスポンスのメタデータ**
使いどころ¶
- インタラクティブなデバッグセッション
- リクエストパフォーマンスの視覚的な確認
- 関係者へのタイミングデータの提示
コンパクトモード¶
ステップごとに人間が読みやすい 1 行で、ターミナルログやリダイレクトチェーンのトレース向けに設計されています。
出力例¶
Step 1: 200 GET https://httpbin.io/get | dns=8.9ms connect=97.0ms tls=194.6ms ttfb=446.0ms total=447.3ms | 389 B
機能¶
- ステップごとに 1 行 — 最初に HTTP ステータス、続いてメソッドと URL、次にフェーズごとのタイミング、そして人間が読みやすいボディサイズ。
- **タイミングには
msサフィックスが付く**ため、散文的なログエントリと並べても自然に読めます。 - **レスポンスサイズ**は適切な単位(
B、KB、MB)で書式設定されます。 - **リダイレクトの要約テーブル**は引き続きステップごとの行の後に出力されるため、チェーン全体の形が見えたままになります。
使いどころ¶
- ログファイルへの追記
- 手早いパフォーマンス比較
- URL とステータスを確認したい CI / CD パイプラインの出力
- 完全なウォーターフォールでは情報が多すぎる場合の、ターミナルに優しい要約
メトリクスのみモード¶
書式なしの生のメトリクスで、他のツールによる解析に最適化されています。
出力例¶
Step 1: dns=30.1 connect=97.3 tls=199.0 ttfb=472.2 total=476.0 status=200 bytes=389 ip=44.211.11.205 family=IPv4 tls_version=TLSv1.2 proxy=direct
機能¶
- **機械で解析可能な**形式
- ネットワークの詳細を含む**完全なメトリクス**
- 抽出しやすい**一貫した構造**
- **色や書式**文字を含まない
- 値のエスケープ — 必要に応じてパーセントエンコーディングを使用し、すべてのメトリクスが単一の
key=valueトークンに収まるようにします。
使いどころ¶
- スクリプティングと自動化
- 分析のためのデータ収集
- 監視ツールとの統合
- awk/grep/sed による解析
--compact との併用¶
--metrics-only は --compact より優先されます。両方のフラグを指定した場合も、 機械可読な key=value 行がそのまま出力され(既存のスクリプトはそのまま動作します)、 --compact が無視されたことを知らせる警告が stderr に出力されます。
解析の例¶
# TTFB 値を抽出する
httptap --metrics-only https://httpbin.io/delay/1 | grep -oP 'ttfb=\K[0-9.]+'
# すべてのタイミングメトリクスを取得する
httptap --metrics-only https://httpbin.io/get | \
awk '{for(i=1;i<=NF;i++){if($i ~ /=/) print $i}}'
JSON エクスポート¶
包括的な分析のために、完全なリクエストデータを構造化された JSON としてエクスポートします。
パスに - を渡すと JSON が標準出力に書き出されます(通常のレポートは抑制されます)。ステータスメッセージは stderr に出力されます:
JSON の構造¶
{
"schema_version": 1,
"httptap_version": "0.6.3",
"timestamp": "2026-09-18T08:00:00Z",
"initial_url": "https://httpbin.io",
"total_steps": 1,
"steps": [
{
"url": "https://httpbin.io",
"step_number": 1,
"request": {
"method": "GET",
"headers": {},
"body_bytes": 0
},
"timing": {
"dns_ms": 8.947,
"connect_ms": 96.977,
"tls_ms": 194.566,
"ttfb_ms": 445.951,
"total_ms": 447.344,
"wait_ms": 145.461,
"xfer_ms": 1.392,
"is_estimated": false
},
"network": {
"ip": "44.211.11.205",
"ip_family": "IPv4",
"http_version": "HTTP/2.0",
"tls_version": "TLSv1.2",
"tls_cipher": "ECDHE-RSA-AES128-GCM-SHA256",
"cert_cn": "httpbin.io",
"cert_days_left": 41,
"cert_sans": ["httpbin.io", "*.httpbin.io"],
"cert_issuer": "WE1",
"cert_serial": "05BB0F0AA84C8FECE0E72D805BA7A5D2B",
"cert_not_before": "2026-08-01T00:00:00+00:00",
"cert_not_after": "2026-10-30T00:00:00+00:00",
"tls_verified": true,
"tls_custom_ca": false,
"proxy_url": null,
"proxy_source": null
},
"response": {
"status": 200,
"bytes": 389,
"content_type": "application/json",
"server": "gunicorn/19.9.0",
"date": "2026-09-18T07:59:59+00:00",
"location": null,
"headers": {
"date": "Fri, 18 Sep 2026 07:59:59 GMT",
"content-type": "application/json",
"server": "gunicorn/19.9.0"
}
},
"error": null,
"note": null,
"redirect_limit_reached": false,
"proxy": null
}
],
"summary": {
"total_time_ms": 447.344,
"final_status": 200,
"final_url": "https://httpbin.io",
"final_bytes": 389,
"errors": 0
}
}
フィールドリファレンス¶
トップレベルのメタデータは、レポートの形式と生成日時を示します。利用者は schema_version を使って互換性のある解析ロジックを選択してください。
| Field | Type | 説明 |
|---|---|---|
schema_version | integer | JSON レポート形式のバージョン。現在のバージョンは 1 です。 |
httptap_version | string | レポートを生成した httptap のバージョン。 |
timestamp | string | エクスポートの作成日時(RFC 3339 UTC 形式、例: 2026-09-18T08:00:00Z)。 |
initial_url | string | リダイレクト前に httptap に渡された URL。 |
total_steps | integer | steps のエントリ数。 |
steps | array | 追跡した各リダイレクトを含む、リクエストごとの計測値。 |
summary | object | エクスポート全体の集計値。 |
_ms で終わるタイミング値の単位はミリ秒です。リクエストおよびレスポンスのボディサイズの単位はバイトです。レスポンスサイズ(bytes、final_bytes)は、curl の size_download と同様に、Content-Encoding のデコード前にネットワーク上で受信したボディをカウントします。証明書とレスポンスの日付は、利用可能な場合 ISO 8601/RFC 3339 形式のタイムスタンプになります。ネストされた steps と summary の構造については上記の例を参照してください。
認証情報はマスクされます。ステップの url、response.location、Location および Content-Location ヘッダー、network.proxy_url の userinfo に含まれるパスワード(または単独のトークン)は **** に置き換えられ、Authorization や Set-Cookie などの機密ヘッダーもマスクされます。
network.tls_custom_ca は --cacert を使用した場合は true、それ以外の場合は false です。ステップの redirect_limit_reached は、そのステップで --follow が 10 回のリダイレクト上限に達して停止した場合に true になります。そのようなステップは summary.errors にもカウントされます。
error を持つステップは、それまでに受信したレスポンスを保持します。失敗の前にステータス行とヘッダーが届いていた場合(たとえばボディが -m/--max-time を超えて停止した場合)、response.status、response.headers、response.bytes(それまでに受信したボディのバイト数)が設定されます。ステータス行より前に失敗したステップでは response.status は null です。終了コードはネットワークエラーのコード(75)のままです。
機能¶
- 全フェーズの**完全なデータエクスポート**
- 解析しやすい**構造化された形式**
- 複数ステップによる**リダイレクトチェーンのサポート**
- メタデータの保持(ヘッダー、タイムスタンプ)
- リクエスト失敗時の**エラー情報**
使いどころ¶
- 後処理による分析
- データパイプラインとの統合
- 長期的なパフォーマンス追跡
- 詳細なデバッグセッション
- チームメンバーとの結果共有
処理の例¶
jq を使って特定のフィールドを抽出する:
# 合計時間を取得する
jq '.summary.total_time_ms' output.json
# すべての TTFB 値を抽出する
jq '.steps[].timing.ttfb_ms' output.json
# 証明書の有効期限を取得する
jq '.steps[0].network.cert_days_left' output.json
# 失敗したリクエストをフィルタリングする
jq 'select(.summary.errors > 0)' output.json
HAR エクスポート¶
--har PATH は、解析したリクエストチェーンを HTTP Archive (HAR) 1.2 ドキュメントとして書き出します。ブラウザーの DevTools や HAR ビューアーが読み込める形式です。 パスに - を渡すと stdout に書き出し(通常のレポートは抑制されます)、ステータスメッセージは stderr に出力されます。
httptap --follow --har run.har https://httpbin.io/redirect/2
httptap --har - https://httpbin.io/get | jq '.log.entries[].timings'
--har と --json は併用できますが、stdout に書き出せるのはどちらか一方だけです。 ファイルを書き込めない場合、httptap は --json と同様に終了コード 73 で終了します。
Chrome DevTools で開くには、Network パネルを開いて Import HAR file(ツールバーのアップロード矢印)を使うか、 ファイルをパネルにドラッグします。Firefox DevTools では、Network パネルの設定メニューに Import HAR があります。
HAR の構造¶
HTTPS リクエスト 1 件の例(一部省略):
{
"log": {
"version": "1.2",
"creator": { "name": "httptap", "version": "0.7.0" },
"pages": [
{
"startedDateTime": "2026-10-06T08:00:00.000+00:00",
"id": "page_1",
"title": "https://httpbin.io/get",
"pageTimings": { "onContentLoad": -1, "onLoad": -1 }
}
],
"entries": [
{
"pageref": "page_1",
"startedDateTime": "2026-10-06T08:00:00.000+00:00",
"time": 448.2,
"request": {
"method": "GET",
"url": "https://httpbin.io/get",
"httpVersion": "HTTP/2.0",
"cookies": [],
"headers": [],
"queryString": [],
"headersSize": -1,
"bodySize": 0
},
"response": {
"status": 200,
"statusText": "OK",
"httpVersion": "HTTP/2.0",
"cookies": [],
"headers": [{ "name": "content-type", "value": "application/json; charset=utf-8" }],
"content": { "size": 389, "mimeType": "application/json; charset=utf-8" },
"redirectURL": "",
"headersSize": -1,
"bodySize": 389,
"_transferSize": 389
},
"cache": {},
"timings": {
"blocked": -1,
"dns": 8.9,
"connect": 291.6,
"send": 0,
"wait": 146.4,
"receive": 1.3,
"ssl": 194.6
},
"serverIPAddress": "44.211.11.205",
"_tls": {
"version": "TLSv1.2",
"cipher": "ECDHE-RSA-AES128-GCM-SHA256",
"certCN": "httpbin.io",
"certIssuer": "Amazon RSA 2048 M03",
"certDaysLeft": 200,
"verified": true
}
}
]
}
}
ドキュメントには次の内容が含まれます。
- 実行全体を表す ページ 1 件。
titleは httptap に渡した URL です。ページ読み込みのタイミングは該当しないため-1です。 - リダイレクトチェーンの順に リクエストごとに 1 エントリ。各エントリは
pagerefでページを参照します。 httptap が計測するのは所要時間であり実際の開始時刻ではないため、エントリは隙間なく順に並べられ、 最後のエントリはファイルを書き出した時点で終わります。 - リクエスト: メソッド、URL、ネゴシエートされた HTTP バージョン、httptap に渡されたヘッダー (
-Hと、--dataから導出されたContent-Type)、解析済みのクエリ文字列、bodySize。 リクエストボディ自体は書き出されません。 - レスポンス: ステータス、HTTP バージョン、ヘッダー、
redirectURL(Locationヘッダー)、content.mimeType(Content-Type、ない場合はx-unknown)、ボディサイズ。 httptap はボディをデコードしないため、content.sizeとbodySizeはContent-Encodingのデコード前、 ネットワーク上で受信したサイズです。ボディのテキストは含まれません。 serverIPAddress: httptap が接続したアドレス。
statusText にはステータスコードの標準的な理由フレーズが入り(未知のコードでは空)、headersSize は -1 です。httptap は実際に送られた理由フレーズやヘッダーサイズを記録しないためです。 cookies 配列は空で、Cookie と Set-Cookie はマスクされた状態でヘッダーに含まれます。
タイミング¶
| HAR フィールド | httptap の値 | 備考 |
|---|---|---|
blocked | -1 | 計測しません。 |
dns | dns_ms | |
connect | connect_ms + tls_ms | HAR 仕様の定めどおり、TLS ハンドシェイクを含みます。 |
ssl | tls_ms | HTTPS のみ。平文の HTTP では -1。すでに connect に含まれます。 |
send | 0 | 個別には計測しません。リクエストの送信は wait に含まれます。 |
wait | wait_ms | レスポンスの最初のバイトまでのサーバー処理時間。 |
receive | xfer_ms | ボディの転送時間。 |
time は blocked、dns、connect、send、wait、receive のうち -1 以外の値の合計です。 ssl はすでに connect に含まれているため、重ねて加算しません。値はミリ秒で、小数点以下 3 桁に丸められます。 接続と TLS のフェーズが計測ではなく推定された場合(JSON エクスポートの is_estimated)、 timings に "_estimated": true が付きます。
失敗したリクエスト¶
失敗したステップもエクスポートされます。response.status は 0、またはすでに受信していたステータス (たとえば -m/--max-time を超えてボディが停止した場合)で、エラーメッセージは response._error に入ります。 Chrome DevTools は HAR をインポートするとき、ここからエラーを読み取ります。 失敗したステップには計測済みのフェーズがないため、dns、connect、ssl は -1、 send、wait、receive は 0、time は 0 です。
カスタムフィールド¶
HAR 仕様では、_ で始まるフィールドが拡張用に予約されています。httptap は次のフィールドを追加します。
| フィールド | 位置 | 内容 |
|---|---|---|
_tls | エントリ | version、cipher、certCN、certIssuer、certDaysLeft、verified。HTTPS のみ。 |
_proxy | エントリ | リクエストが経由したプロキシの url(認証情報はマスク済み)と source。 |
_redirectLimitReached | エントリ | このステップで --follow が 10 回のリダイレクト上限に達して停止した場合に true。 |
_estimated | timings | 接続と TLS のタイミングが推定値の場合に true。 |
_transferSize | response | ネットワーク上で受信したボディのバイト数。レスポンスがない場合は -1。 |
_error、_errorKind | response | 失敗したステップのエラーメッセージとその種類(network または internal)。 |
認証情報のマスク¶
HAR エクスポートには JSON エクスポートと同じマスク処理が適用されます。URL の userinfo に含まれるパスワード (または単独のトークン)は、リクエスト URL、ページタイトル、redirectURL、Location と Content-Location ヘッダー、 プロキシ URL で **** に置き換えられ、Authorization、Cookie、Set-Cookie などの機密ヘッダーもマスクされます。
Warning
パスとクエリ文字列はそのまま残ります。また、HAR ファイルはバグ報告に添付されることがよくあります。 共有する前に、HAR ファイルに機密データが含まれていないか確認してください。
Prometheus テキストファイルエクスポート¶
--prometheus PATH で node_exporter の textfile collector 用レポートを書き出します:
ファイルはアトミックに書き込まれます。すべてのサンプルには host ラベル(ホスト名のみ)とリダイレクトチェーンの step が付与されるため、複数のプローブで 1 つの textfile ディレクトリを共有できます。エクスポートされるゲージ:
| Metric | 追加ラベル | 意味 |
|---|---|---|
httptap_request_success | ステップが完了した場合は 1、ネットワーク/TLS エラーの場合は 0 | |
httptap_request_duration_seconds | phase | dns、connect、tls、ttfb、wait、xfer、total |
httptap_response_status_code | ステップの HTTP ステータス | |
httptap_response_body_size_bytes | ネットワーク上のレスポンスボディサイズ | |
httptap_last_run_timestamp_seconds | ファイルが書き込まれた Unix 時刻(host のみ) |
失敗したステップは httptap_request_success 0 のみをエクスポートするため、障害が高速なレスポンスのように見えることはありません。パスやクエリ文字列がラベルとして使用されることはありません。
OpenTelemetry エクスポート¶
--otlp ENDPOINT は OTLP/HTTP のトレースを送信します。事前にオプションの extra をインストールしてください:
pip install 'httptap[otel]'
httptap --otlp http://localhost:4318/v1/traces https://api.example.com/health
1 回の実行は 1 つのトレースとしてエクスポートされます。トレースは httptap.analysis ルートスパンと、リダイレクトステップごとに 1 つずつ順番に並ぶ http.request スパン、そして DNS、接続、TLS、サーバー待機、転送の各フェーズの子スパンで構成されます。送信は -m/--max-time の範囲内で行われます。コレクターのエラーは警告として報告され、終了コードは変わりません。クエリパラメータがコレクターに送信されないよう、エクスポートには完全なリクエスト URL は含まれません。
リダイレクトチェーン¶
--follow を使用すると、すべての出力形式にリダイレクトチェーンの各ステップのデータが含まれます。
リッチモード¶
チェーン全体の合計を含む要約テーブルを表示します。
コンパクトモード¶
リダイレクトステップごとに 1 行を出力し、続いてリダイレクトチェーンの要約テーブルを出力します。
出力:
Step 1: 302 GET https://httpbin.io/redirect/2 | dns=8.9ms connect=97.0ms tls=194.6ms ttfb=446.0ms total=447.3ms | 0 B
Step 2: 302 GET https://httpbin.io/relative-redirect/1 | dns=2.7ms connect=97.5ms tls=194.0ms ttfb=400.2ms total=400.6ms | 0 B
Step 3: 200 GET https://httpbin.io/get | dns=2.6ms connect=97.4ms tls=197.3ms ttfb=403.2ms total=404.0ms | 389 B
JSON エクスポート¶
steps 配列にすべてのステップを含め、完全なタイミングとメタデータを付与します。
オプションの組み合わせ¶
出力形式のオプションは他のフラグと組み合わせられます:
# コンパクト出力でリダイレクトを追跡する
httptap --follow --compact https://httpbin.io/redirect/2
# メトリクス表示でリダイレクトチェーンを JSON にエクスポートする
httptap --follow --json chain.json --metrics-only https://bit.ly/example
Note
--json と表示モード(--compact、--metrics-only)を同時に使用した場合、表示モードは標準出力に表示され、JSON はファイルに書き込まれます。
SLO しきい値のオーバーレイ¶
--slo KEY=MS[,KEY=MS...] は、最終的に成功したリクエストに対して評価された合否判定を、すべての出力モードに付加します。
- リッチモード — ウォーターフォールの後に枠付きのパネルが出力されます。ボーダーは合格で緑、不合格で赤になり、各違反が実測値、しきい値、超過量(ミリ秒単位)とともに列挙されます。
- コンパクトモード — 上記のリッチモードと同じように動作します。SLO パネルは引き続き 1 行のステップ要約の後に出力されます。
- メトリクスのみ — 最終的に成功したステップの行に
slo=passまたはslo=fail slo_violations=<keys>のトークンが追加されます。中間のリダイレクトステップは変更されません。 - JSON —
summary.sloにpass、thresholds_ms、violations[](それぞれkey、threshold_ms、actual_ms、delta_msを含む)が含まれます。--sloが指定されない場合は存在しません。
違反があると httptap は完全な出力をレンダリングしつつ終了コード 4 で終了するため、事後分析のための証拠が保持されます。
仕様の文法、評価ルール、終了コードの優先順位、CI / cron のレシピについては、専用の SLO しきい値チェック ページを参照してください。
次のステップ¶
-
カスタムコンポーネント、監視、バッチ分析
-
プログラムからの利用と拡張