Copyright © 2023 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、サーバーがリクエスト-レスポンスサイクルに関するパフォーマンス指標をユーザーエージェントに通知できるようにします。また、アプリケーションがこれらの指標を収集・処理・活用して、アプリケーションの配信を最適化できるようにするJavaScriptインターフェースも標準化します。
このセクションは、公開時点での 文書のステータスを説明しています。現行のW3C 公開物と技術レポートの最新版は、 W3C 技術レポート一覧(https://www.w3.org/TR/)で参照できます。
この文書は、Webパフォーマンス作業グループによって 勧告トラックを利用して作業草案として公開されました。
作業草案としての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。
この文書はドラフトであり、いつでも更新・置換または廃止される可能性があります。他の文書として引用するのは不適切です。進行中の作業としてのみ引用してください。
この文書は、 W3C 特許ポリシーの下で活動するグループによって作成されました。 W3Cは、 関連する特許開示の公開リストを 管理しています。グループの成果物に関連する特許開示は、そのページで確認でき、特許開示の手順も記載されています。個人が、本質的なクレームを含む特許について実際に知識がある場合は、 W3C特許ポリシー第6節に従って情報を開示しなければなりません。
この文書は、 2021年11月2日版 W3Cプロセス文書に従って管理されています。
このセクションは非規定(参考)です。
Webアプリケーションのパフォーマンス特性を正確に測定することは、Webアプリケーションを高速化するための重要な側面です。 [NAVIGATION-TIMING] および [RESOURCE-TIMING] は、ドキュメントとそのリソースに対する詳細なリクエストタイミング情報を提供します。これにはリクエストが開始された時刻や、接続のネゴシエーションやレスポンスの受信などの様々なマイルストーンが含まれます。しかし、ユーザーエージェントはリクエストのタイミングデータを観測できるものの、リクエスト-レスポンスサイクルの特定の段階がなぜ、あるいはどのようにしてそれだけの時間がかかったのかについては把握できません。例えば、リクエストがどのようにルーティングされたか、サーバー側でどこに時間が費やされたかなどです。
この仕様では、PerformanceServerTiming
インターフェースを導入します。これにより、サーバーはリクエスト-レスポンスサイクルに関するパフォーマンス指標をユーザーエージェントに通知でき、アプリケーションがこれらの指標を収集、処理、活用してアプリケーションの配信を最適化できるJavaScriptインターフェースも提供します。
非規定と記載されているセクションだけでなく、この仕様書内のすべての作成ガイドライン、図、例、および注記は非規定です。それ以外の内容はすべて規定です。
この文書におけるキーワード MAY、MUST、SHOULD NOT は、 BCP 14 [RFC2119] [RFC8174] に記載されている通り、全て大文字で現れる場合のみ、その意味で解釈されます。
Server-Timing ヘッダーフィールドは、与えられたリクエスト-レスポンスサイクルに対して、1つ以上の指標と説明を通知するために使用されます。RFC5234 に基づくABNF(拡張Backus-Naur形式)の Server-Timing ヘッダーフィールド の構文は以下の通りです:
Server-Timing = #server-timing-metric
server-timing-metric = metric-name *( OWS ";" OWS server-timing-param )
metric-name = token
server-timing-param = server-timing-param-name OWS "=" OWS server-timing-param-value
server-timing-param-name = token
server-timing-param-value = token / quoted-string
RFC7230
を参照し、#
、*
、OWS
、token
、quoted-string
の定義を確認してください。
レスポンスには同じ metric-name を持つ server-timing-metric エントリが複数存在する場合があり、ユーザーエージェントはこれらすべてのエントリを処理し、公開しなければなりません(MUST)。
ユーザーエージェントは、提供された指標をどの順序でも表示して構いません(MAY)。つまり、HTTPヘッダーフィールド内の指標の順序は重要ではありません。
このヘッダーフィールドは将来のパラメータ追加に対応できる拡張可能な構文で定義されています。レスポンスの Server-Timing ヘッダーフィールド内の特定の server-timing-param-name を認識しないユーザーエージェントは、そのトークンを無視し、エラーを通知せずに処理を継続しなければなりません(MUST)。
あいまいさを避けるため、1つのserver-timing-metric
内でserver-timing-param-name
は複数回現れるべきではありません(SHOULD
NOT)。もし同じserver-timing-param-name
が複数回指定された場合、最初のインスタンスのみを考慮し、たとえserver-timing-param
が不完全または無効であっても、以降のすべての出現はエラー通知などをせずに無視しなければなりません(MUST)。これはserver-timing-metric
内のパラメータ順が重要になる唯一のケースです。
ユーザーエージェントは、server-timing-param-value
の後、次のserver-timing-param
や現在のserver-timing-metric
の終了までの間に発見された余分な文字を無視しなければなりません(MUST)。
ユーザーエージェントは、metric-name
の後、最初のserver-timing-param
や次のserver-timing-metric
までの間に発見された余分な文字を無視しなければなりません(MUST)。
この仕様では、server-timing-param-namesとして "dur"(duration
)および "desc"(description
)を定義します。いずれも任意です。
HTTPオーバーヘッドを最小化するため、提供される名前や説明はできるだけ短く保つべきです。例:省略形を使用したり、任意値を可能な限り省略する。
クライアント・サーバー・中継機関間で時計同期が保証できないため、クライアントのタイムライン上で意味のあるstartTime
を割り当てることは不可能です。そのため、本仕様ではstartTime
属性は意図的に省略されています。複数エントリ間の関係性を確立したい場合は、指標名や説明を使って独自データを通信することができます。
サーバーや関連する中継機関は、どの指標をいつユーザーエージェントに通知するかを完全に制御できます。例えば、プライバシーやセキュリティ上の理由で一部の指標へのアクセスが制限される場合があります。詳細は 6. プライバシーとセキュリティ セクションを参照してください。
Server-Timingヘッダーフィールドをパースするには、文字列fieldを与えて、以下の手順に従います:
positionを位置変数として、最初はfieldの先頭を指す。
nameを、コードポイントの並びを収集することで、fieldからU+003B(;)に等しくないものを、positionを基準に収集した結果とする。
先頭と末尾のASCII空白を除去するをnameに適用する。
nameが空文字列の場合、nullを返す。
metricを新しいPerformanceServerTiming
として生成し、そのmetric nameにnameを設定する。
paramsを空の順序付きマップとする。
positionがfieldの末尾でない間、以下を繰り返す:
positionを1進める。
paramNameを、コードポイントの並びを収集することでfieldからU+003D(=)に等しくないものを、positionを基準に収集した結果とする。
先頭と末尾のASCII空白を除去するをparamNameに適用する。
positionを1進める。
paramValueを空文字列とする。
ASCII空白をスキップするをfieldとpositionで適用する。
positionのfieldのコードポイントがU+0022(")であれば:
paramValueに、HTTP引用文字列を収集するの結果(extract-value flagをセットした状態)をfieldとpositionで適用し、設定する。
コードポイントの並びを収集するで、fieldからU+003B(;)に等しくないものをpositionを基準に収集する。結果は使用しない。
それ以外の場合:
rawParamValueを、コードポイントの並びを収集することでfieldからU+003B(;)に等しくないものをpositionを基準に収集した結果とする。
paramValueを、rawParamValueの先頭と末尾のASCII空白を除去した結果とする。
metricを返す。
WebIDL[Exposed=(Window,Worker)]
interface PerformanceServerTiming
{
readonly attribute DOMString name
;
readonly attribute DOMHighResTimeStamp duration
;
readonly attribute DOMString description
;
[Default] object toJSON
();
};
toJSON
が呼び出された場合、[WEBIDL]の default
toJSON steps を実行する。
name
のgetter手順は、thisの metric name を返すこと。
duration
のgetter手順は以下の通り:
dur を thisの params["dur"
] を 浮動小数点数値のパース規則でパースした結果とする。
dur がエラーの場合は0を返す。そうでなければdurを返す。
duration
は DOMHighResTimeStamp
であり、通常はミリ秒単位の 継続時間 を表します。実際には強制できないため、duration
は任意の時間単位を表すことができ、ミリ秒単位で 継続時間 を表すことが推奨されます。
description
のgetter手順は、thisの params["desc"
] が 存在する場合はそれを返し、そうでなければ空文字列を返す。
PerformanceServerTiming
は関連付けられた文字列 metric name
を持ち、初期値は空文字列である。
PerformanceServerTiming
は関連付けられた 順序付きマップ params を持ち、初期値は空である。
PerformanceResourceTiming
インターフェースへの拡張 この仕様で部分的に拡張される PerformanceResourceTiming
インターフェースは [RESOURCE-TIMING] で定義されています。
WebIDL[Exposed=(Window,Worker)]
partial interface PerformanceResourceTiming
{
readonly attribute FrozenArray<PerformanceServerTiming
> serverTiming
;
};
serverTiming
のgetter手順は以下の通り:
entriesを新しいリストとする。
各fieldについて、thisのtiming infoのserver-timing headers内:
metricを、Server-Timingヘッダーフィールドをパースするをfieldに適用した結果とする。
metricがnullでなければ、appendでmetricをentriesに追加する。
entriesを返す。
このセクションは非規定(参考)です。
この仕様で定義されるインターフェースは、サーバータイミング指標を通知するリソースを含む任意のウェブページに対して、潜在的に機微なアプリケーションおよびインフラ情報を公開します。このため、PerformanceServerTiming
インターフェースへのアクセスはデフォルトで同一オリジンポリシーによって制限されています。リソース提供者は、[RESOURCE-TIMING]にて定義されるTiming-Allow-Origin
HTTPレスポンスヘッダーを追加し、サーバー指標へのアクセスを許可するドメインを明示的に指定できますが、ユーザーエージェントは 同一オリジン
ポリシーの制限を維持してもよい(MAY)です。
Timing-Allow-Origin
HTTPレスポンスヘッダーの利用に加え、サーバーはどの指標をいつ誰に返すかを制御するためのロジックも利用できます。例えば、サーバーは認証済みの正しいユーザーにのみ特定の指標を提供し、それ以外のユーザーには何も提供しない場合があります。
永続メッセージヘッダーフィールド登録簿は、以下の登録内容で更新されるべきです([RFC3864]参照):
このセクションは非規定(参考)です。
> GET /resource HTTP/1.1
> Host: example.com
< HTTP/1.1 200 OK
< Server-Timing: miss, db;dur=53, app;dur=47.2
< Server-Timing: customView, dc;desc=atl
< Server-Timing: cache;desc="Cache Read";dur=23.2
< Trailer: Server-Timing
< (... snip response body ...)
< Server-Timing: total;dur=123.4
名前 | 継続時間 | 説明 |
---|---|---|
miss | ||
db | 53 | |
app | 47.2 | |
customView | ||
dc | atl | |
cache | 23.2 | Cache Read |
total | 123.4 |
上記のヘッダーフィールドは、サーバーがユーザーエージェントにデータを通知するためのあらゆる方法を示す6つの異なる指標を伝えています:指標名のみ、値付き指標、値・説明付き指標、説明付き指標など。例えば、上記の指標はexample.com/resource.jpg
の取得について次のように示すかもしれません。
アプリケーションは、提供されたJavaScriptインターフェースを使って、これらの指標を収集・処理・活用できます:
// serverTiming entriesは'navigation'および'resource'エントリに存在可能
for (const entryType of ['navigation', 'resource']) {
for (const {name: url, serverTiming} of performance.getEntriesByType(entryType)) {
// serverTiming配列を反復
for (const {name, duration, description} of serverTiming) {
// "遅い"ものだけ処理
if (duration > 200) {
console.info('遅い server-timing エントリ =',
JSON.stringify({url, entryType, name, duration, description}, null, 2))
}
}
}
}
このセクションは非規定(参考)です。
サーバー処理時間はリクエスト全体の時間の大きな割合を占めることがあります。例えば、動的レスポンスは複数のデータベースクエリやキャッシュ参照、API呼び出し、関連データの処理とレンダリングなどを必要とする場合があります。同様に、静的レスポンスでもサーバーの過負荷やキャッシュの遅延などで遅延することがあります。
現在、ユーザーエージェントの開発者ツールではリクエストの開始時刻やレスポンスの最初と最後のバイトの受信時刻は表示できますが、サーバー上でどこやどのように時間が使われたかは見えません。つまり、開発者はサーバーにパフォーマンスのボトルネックがあるかどうか、その場合どのコンポーネントかを迅速に診断できません。現状、この問いに答えるには、開発者はサーバーログを確認したり、レスポンス内にパフォーマンスデータを埋め込んだり、外部ツールを使ったりしなければなりません。これではボトルネックの特定や診断が困難、場合によっては非現実的です。
Server Timingは、サーバーが関連するパフォーマンス指標をクライアントに通知し、クライアント側で開発者ツールに直接表示できる標準的な仕組みを定義します。例えば、リクエストにサーバー送信の指標を付与し、レスポンス生成時のどこ/どう時間が使われたかを可視化できます。
開発者ツールでサーバー送信のパフォーマンス指標を表示するだけでなく、標準のJavaScriptインターフェースによって、分析ツールがこれらの指標を自動的に収集・処理・ビーコン送信・集計し、運用分析やパフォーマンス分析に活用できます。
Server Timingにより、オリジンサーバーはリクエスト処理中のどこやどのように時間が使われているかのパフォーマンス指標を通知できます。しかし、同じリクエストとレスポンスが複数のプロキシ(例:キャッシュサーバー、ロードバランサー等)を経由する場合もあり、それぞれが独自の遅延や指標を加えたい場合があります。
例えば、CDNエッジノードは、どのデータセンターが使われたか、リソースがキャッシュにあったか、キャッシュやオリジンサーバーからレスポンス取得にどれだけ時間がかかったかなどを報告できます。また、他のプロキシでも同様の処理が繰り返され、リクエストがどのようにルーティングされ、どこで時間を使ったかの全体像が把握できます。
同様に、Service Workerが有効な場合、一部またはすべてのナビゲーションやリソースリクエストがService Worker経由でルーティングされます。実質的にService Workerはローカルプロキシとして、リクエストの再ルーティングやキャッシュレスポンスの提供、レスポンスの生成などを行えます。その結果、Server TimingはService Workerがリクエスト処理の方法(サーバー取得かローカルキャッシュか、各処理ステップの継続時間など)についてカスタム指標を報告できるようにします。
このセクションは非規定(参考)です。
本書は、[NAVIGATION-TIMING]、[RESOURCE-TIMING]、[PERFORMANCE-TIMELINE-2]、[RFC6797]仕様のライセンスにより許可された部分を再利用しています。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: