パフォーマンス情報の出力に広く使われている HTTP Archive (HAR) 形式を独自に拡張し、HTTP/2 フレーミングレイヤーの情報を追加できる拡張仕様を検討する。
これは、HTTP/2 ではパフォーマンス面での改善を目的とした様々な機能が盛り込まれているが、既存のブラウザにおいては HTTP/2 のフレーミングレイヤーの情報 (例: HTTP/2 フレームや優先度情報) を取得できないため、パフォーマンスチューニングが難しくなっているためである。
HAR のログ全体を格納する log
オブジェクトに、フレームが送受信されたタイミングやその内容を示す _h2Frames
キーを追加する。このキーの値には frame
オブジェクトの配列が含まれる。
{
"log": {
...,
"_h2Frames": [
{
"connection": "52492",
"time": "2015-06-20T13:39:59.638+00:00",
"peer": false,
"header": {
"legnth": 64,
"type": "HEADERS",
"flags": [
"END_STREAM",
"END_HEADERS"
],
"streamId": 1
},
"payload": {
"weight": 255
}
},
{
"connection": "52492",
"time": "2015-06-20T13:39:59.890+00:00",
"peer": true,
"header": {
"legnth": 32,
"type": "HEADERS",
"flags": [
"END_HEADERS"
],
"streamId": 1
},
"payload": {}
},
{
"connection": "52492",
"time": "2015-06-20T13:39:59.972+00:00",
"peer": true,
"header": {
"legnth": 1664,
"type": "DATA",
"flags": [
"END_STREAM"
],
"streamId": 1
},
"payload": {}
}
]
}
}
frame
オブジェクトは、HTTP/2 のフレーミングレイヤーで送受信されたフレームの情報を示すものであり、以下のキーを含む。
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
connection | HTTP/2 コネクションを識別するための文字列。entries オブジェクトに含まれる connection と値が一致する必要がある。 |
String | 52492 | 不可 |
time | フレームが送受信された時間を示すタイムスタンプ。フォーマットは ISO 8601 (YYYY-MM-DDThh:mm:ss.sTZD) を使用する。 | String | 2015-06-20T13:39:59.890+00:00 | 不可 |
peer | フレームを送信したのが通信相手であるかどうかを示すフラグ。true であれば、相手が送信したフレームになる。 |
Boolean | true | 不可 |
header | HTTP/2 フレームのヘッダー情報を含むオブジェクト。 | Object | - | 不可 |
payload | HTTP/2 フレームのペイロード情報を含むオブジェクト。フレームの種類により中身は異なる。 | Object | - | 不可 |
frame
オブジェクトに含まれる header
オブジェクトは、HTTP/2 フレームのヘッダー情報を示すものであり、以下のキーを含む。
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
length | フレームの長さ。 | Number | 64 | 不可 |
type | フレームの種類を文字列で表現したもの。 | String | HEADERS | 不可 |
flags | フレームに付与されたフラグを文字列で表現したものの値。 | String Array | [ "END_STREAM", "END_HEADERS", "PRIORITY" ] | 不可 |
streamId | フレームが送信されたストリーム ID。 | Number | 1 | 不可 |
frame
オブジェクトに含まれる payload
オブジェクトは、HTTP/2 フレームのペイロード情報を示すものである。オブジェクトの中身は、以下のようにフレームの種類により異なる。
DATA
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
padLength | パディングフィールドの長さ。 | Number | 8 | 可 |
HEADERS
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
padLength | パディングフィールドの長さ。 | Number | 8 | 可 |
streamDependency | 優先度情報の依存先ストリーム ID。 | Number | 5 | 可 |
weight | 優先度情報の重み。 | Number | 16 | 可 |
PRIORITY
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
exclusive | 優先度情報の exclusive フラグ。 | Boolean | true | 不可 |
streamDependency | 優先度情報の依存先ストリーム ID。 | Number | 5 | 不可 |
weight | 優先度情報の重み。 | Number | 16 | 不可 |
RST_STREAM
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
errorCode | エラーコードを文字列で表現したもの。 | String | PROTOCOL_ERROR | 不可 |
SETTINGS
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
settings | setting オブジェクトの配列。 | Object Array | - | 不可 |
PUSH_PROMISE
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
padLength | パディングフィールドの長さ。 | Number | 8 | 可 |
promisedStreamId | 予約ストリーム ID。 | Number | 13 | 不可 |
PING
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
opaqueDataLength | Opaque Dataの長さ。 | Number | 1 | 不可 |
GOAWAY
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
lastStreamID | 最後に処理したストリーム ID。 | Number | 9 | 不可 |
errorCode | エラーコードを文字列で表現したもの。 | String | PROTOCOL_ERROR | 不可 |
debugDataLength | デバッグデータの長さ。 | Number | 1 | 不可 |
WINDOW_UPDATE
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
windowSizeIncrement | ウインドウサイズの増加量 | Number | 100 | 不可 |
CONTINUATION
payload オブジェクトの中身は常に空になる。
SETTINGS フレームの payload
オブジェクトに含まれる setting
オブジェクトは、HTTP/2 設定情報を示すものである。
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
identifier | 設定識別子。 | String | SETTINGS_MAX_CONCURRENT_STREAMS | 不可 |
value | 設定値。 | Number | 100 | 不可 |
リクエストとレスポンスが、HTTP/2 のどのストリーム ID で処理されたかを識別可能にするため、entries
オブジェクトに、HTTP/2 のストリーム ID を追加する。
{
"log": {
...,
"entries": [
{
...,
"_h2StreamId": 1
}
]
}
}
新たに追加するキーの情報は以下の通り。
キー | 値 | 型 | 例 | キーの省略 |
---|---|---|---|---|
_h2StreamId | entries オブジェクトに紐付くリソースが転送されたストリームの ID。 |
Number | 1 | 可 |