Network Error Logging

Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。

ネットワークエラーロギングは、HTTP の NEL レスポンスヘッダーを使って設定できるメカニズムです。この実験的なヘッダーにより、ウェブサイトやアプリケーションは、対応しているブラウザーから、失敗した (必要であれば成功した) ネットワーク読み取りに関するレポートを受け取ることを選択することができます。

レポートは、 Report-To ヘッダーで定義された報告グループに送信されます。

使用方法

ウェブアプリケーションは、 JSON エンコードされたオブジェクトである NEL ヘッダーを使って、この動作を選択します。

NEL: { "report_to": "nel",
       "max_age": 31556952 }

ブラウザーから安全と認識されたオリジンが必要です。

以下のオブジェクトキーが NEL ヘッダーで指定されています。

report_to

ネットワークエラーレポートの送信先となる Reporting API (en-US) グループです。

max_age
ポリシーの有効期間を秒単位で指定します (HSTS ポリシーが時間制限されているのと同様の方法です)。参照される報告グループは、少なくとも NEL ポリシーと同程度の有効期間を持つ必要があります。
include_subdomains
true の場合、ポリシーは、ポリシーヘッダーが設定されているオリジンの下のすべてのサブドメインに適用されます。このオプションを有効にする場合は、サブドメインを含めるように報告グループを設定する必要があります。
success_fraction
0 と 1 の間の浮動小数点値で、報告するネットワーク要求が成功した割合を指定します。既定値は 0 で、JSON ペイロードにキーが存在しない場合、成功したネットワークリクエストは報告されません。
failure_fraction
0 と 1 の間の浮動小数点値で、報告する失敗したネットワークリクエストの割合を指定します。既定値は 1 で、JSON ペイロードにキーが存在しない場合、失敗したすべてのネットワークリクエストが報告されます。

上記のレポートグループは、 Report-To ヘッダー内で通常の方法で定義されます。例えば下記のようになります。

Report-To: { "group": "nel",
             "max_age": 31556952,
             "endpoints": [
               { "url": "https://example.com/csp-reports" }
             ] }

エラーレポート

これらの例では、Reporting API のペイロード全体を示しています。最上位の "body" キーには、ネットワークエラーレポートが含まれています。

HTTP 400 (Bad Request) response

{
  "age": 20,
  "type": "network-error",
  "url": "https://example.com/previous-page",
  "body": {
    "elapsed_time": 338,
    "method": "POST",
    "phase": "application",
    "protocol": "http/1.1",
    "referrer": "https://example.com/previous-page",
    "sampling_fraction": 1,
    "server_ip": "137.205.28.66",
    "status_code": 400,
    "type": "http.error",
    "url": "https://example.com/bad-request"
  }
}

DNS 名が未解決

なお、このレポートではフェーズが dns に設定されており、含めることのできる server_ip はありません。

{
  "age": 20,
  "type": "network-error",
  "url": "https://example.com/previous-page",
  "body": {
    "elapsed_time": 18,
    "method": "POST",
    "phase": "dns",
    "protocol": "http/1.1",
    "referrer": "https://example.com/previous-page",
    "sampling_fraction": 1,
    "server_ip": "",
    "status_code": 0,
    "type": "dns.name_not_resolved",
    "url": "https://example-host.com/"
  }
}

ネットワークエラーの種類は、仕様で定義された以下の値のいずれかですが、ブラウザは独自のエラー種別を追加して送信することができます。

dns.unreachable
ユーザーの DNS サーバーに到達できない
dns.name_not_resolved
ユーザーの DNS サーバーは応答したが、リクエストされた URI の IP アドレスに解決できなかった。
dns.failed
DNS サーバーへのリクエストが、以前のエラー (SERVFAIL など) でカバーされない理由で失敗した
dns.address_changed
セキュリティ上の理由から、オリジナルのレポートを配信したサーバーの IP アドレスが、エラー発生時の現在のサーバーの IP アドレスと異なる場合、レポートデータはこの問題に関する情報のみを含むようにダウングレードされ、タイプは dns.address_changed に設定されます。
tcp.timed_out
サーバーへの TCP コネクションがタイムアウトした
tcp.closed
TCP コネクションがサーバーから閉じられた
tcp.reset
TCP コネクションがリセットされた
tcp.refused
TCP コネクションがサーバーから拒否された
tcp.aborted
TCP コネクションが中止された
tcp.address_invalid
IP アドレスが無効である
tcp.address_unreachable
IP アドレスに到達できない
tcp.failed
TCP コネクションが直前のエラーによってカバーできない原因で失敗した
http.error
ユーザーエージェントがレスポンスの受信に成功したが、 4xx または 5xx のステータスコードであった
http.protocol.error
コネクションが HTTP プロトコルエラーのために中止された
http.response.invalid
レスポンスが空であるか、 content-length が合っていないか、エンコーディングが正しくないか、その他の状況でユーザーエージェントがレスポンスを処理できなかった
http.response.redirect_loop
リクエストはリダイレクトループが検出されたため中止された
http.failed
コネクションは直前のエラーでカバーされなかった HTTP プロトコルのエラーで失敗した

仕様書

仕様書
Network Error Logging

ブラウザーの互換性

BCD tables only load in the browser