Chrome UX Report API を使用して、数百万ものウェブサイトの実際のユーザー エクスペリエンス データにアクセスする方法を学べます。
Chrome UX レポート(CrUX)データセットは、Chrome ユーザーがウェブ上の人気ページに実際にアクセスしたときの状況を表すデータセットです。クエリ可能なデータセットが BigQuery で初めてリリースされた 2017 年以来、CrUX のフィールド データは PageSpeed Insights、CrUX ダッシュボード、Search Console の Core Web Vitals レポートなどのデベロッパー ツールに統合され、デベロッパーは実際のユーザー エクスペリエンスを測定、モニタリングできるようになりました。これまで欠けていたのが、CrUX データへの RESTful アクセスをプログラムで提供するツールです。このギャップを埋めるために、このたび、まったく新しい Chrome UX Report API をリリースすることになりました。
この API は、CrUX データへのシンプル、迅速、包括的なアクセスをデベロッパーに提供することを目標に構築されました。CrUX API は、Lighthouse のパフォーマンス監査のラボデータもレポートする既存の PageSpeed Insights API とは異なり、フィールドのユーザー エクスペリエンス データのみをレポートします。CrUX API は効率化されており、ユーザー エクスペリエンス データを迅速に提供できるため、リアルタイム監査アプリケーションに最適です。
デベロッパーが最も重要なすべての指標(Core Web Vitals)にアクセスできるようにするために、CrUX API は、オリジンレベルと URL レベルの両方で Largest Contentful Paint(LCP)、Interaction to Next Paint(INP)、Cumulative Layout Shift(CLS)の監査とモニタリングを行います。
早速、使い方を見ていきましょう。
送信元データをクエリする
CrUX データセットのオリジンには、基盤となるページレベルのエクスペリエンスがすべて含まれます。次の例は、コマンドラインで cURL を使用して、CrUX API に対してオリジンのユーザー エクスペリエンス データを照会する方法を示しています。
API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
--header 'Content-Type: application/json' \
--data '{"origin": "https://web.dev"}'
curl
コマンドは、次の 3 つの部分で構成されます。
- API の URL エンドポイント(呼び出し元の API 秘密鍵を含む)。
- リクエスト本文に JSON が含まれていることを示す
Content-Type: application/json
ヘッダー。 https://web.dev
オリジンを指定する JSON エンコードされたリクエスト本文。
JavaScript で同じことを行うには、CrUXApiUtil
ユーティリティを使用します。
API 呼び出しを行い、デコードされたレスポンスを返す(GitHub のバリアントも参照)
では、履歴やバッチのサポートなど、さらに多くの機能をご利用いただけます)。
const CrUXApiUtil = {};
// Get your CrUX API key at https://goo.gle/crux-api-key.
CrUXApiUtil.API_KEY = '[YOUR_API_KEY]';
CrUXApiUtil.API_ENDPOINT = `https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=${CrUXApiUtil.API_KEY}`;
CrUXApiUtil.query = function (requestBody) {
if (CrUXApiUtil.API_KEY == '[YOUR_API_KEY]') {
throw 'Replace "YOUR_API_KEY" with your private CrUX API key. Get a key at https://goo.gle/crux-api-key.';
}
return fetch(CrUXApiUtil.API_ENDPOINT, {
method: 'POST',
body: JSON.stringify(requestBody)
}).then(response => response.json()).then(response => {
if (response.error) {
return Promise.reject(response);
}
return response;
});
};
[YOUR_API_KEY]
は実際の鍵に置き換えます。次に、CrUXApiUtil.query
関数を呼び出して、リクエスト本文オブジェクトを渡します。
CrUXApiUtil.query({
origin: 'https://web.dev'
}).then(response => {
console.log(response);
}).catch(response => {
console.error(response);
});
このオリジンのデータが存在する場合、API レスポンスはユーザー エクスペリエンスの分布を表す指標を含む JSON エンコードされたオブジェクトです。分布指標はヒストグラムのビンとパーセンタイルです。
{
"record": {
"key": {
"origin": "https://web.dev"
},
"metrics": {
"largest_contentful_paint": {
"histogram": [
{
"start": 0,
"end": 2500,
"density": 0.7925068547983514
},
{
"start": 2500,
"end": 4000,
"density": 0.1317422195536863
},
{
"start": 4000,
"density": 0.07575092564795324
}
],
"percentiles": {
"p75": 2216
}
},
// ...
}
}
}
histogram
オブジェクトの start
プロパティと end
プロパティは、特定の指標でユーザーに表示される値の範囲を表します。density
プロパティは、その範囲内のユーザー エクスペリエンスの割合を表します。この例では、すべての web.dev ページにわたる LCP ユーザー エクスペリエンスの 79% が 2,500 ミリ秒未満であり、これは「良好」です。LCP のしきい値。percentiles.p75
値は、この分布のユーザー エクスペリエンスの 75% が 2,216 ミリ秒未満であることを意味します。レスポンスの構造について詳しくは、レスポンスの本文のドキュメントをご覧ください。
エラー
CrUX API に特定のオリジンのデータがない場合、CrUX API は JSON でエンコードされたエラー メッセージを返します。
{
"error": {
"code": 404,
"message": "chrome ux report data not found",
"status": "NOT_FOUND"
}
}
このエラーをデバッグするには、まず、リクエストされたオリジンがパブリック ナビゲート可能であることを確認します。これをテストするには、ブラウザのアドレスバーにオリジンを入力し、リダイレクト後の最終ページ URL と比較します。よくある問題としては、サブドメインを不必要に追加または削除することや、間違った HTTP プロトコルを使用することなどが挙げられます。
{"origin": "http://www.web.dev"}
{"origin": "https://web.dev"}
リクエストされた送信元がナビゲート可能なバージョンである場合、送信元のサンプル数が不十分な場合にも、このエラーが発生することがあります。データセットに含まれるすべてのオリジンと URL には、個々のユーザーを匿名化するために十分な数のサンプルが必要です。また、オリジンと URL は公開インデックス登録が可能である必要があります。ウェブサイトをデータセットに含める方法について詳しくは、CrUX の手法をご覧ください。
URL データをクエリする
オリジンでの全体的なユーザー エクスペリエンスに関する CrUX API へのクエリ方法は見てきました。結果を特定のページに制限するには、url
リクエスト パラメータを使用します。
API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
--header 'Content-Type: application/json' \
--data '{"url": "https://web.dev/fast/"}'
この cURL コマンドはオリジンの例と似ていますが、リクエスト本文で url
パラメータを使用して検索するページを指定する点が異なります。
JavaScript で CrUX API から URL データをクエリするには、リクエスト本文の url
パラメータを使用して CrUXApiUtil.query
関数を呼び出します。
CrUXApiUtil.query({
url: 'https://web.dev/fast/'
}).then(response => {
console.log(response);
}).catch(response => {
console.error(response);
});
この URL のデータが CrUX データセットに存在する場合は、API は JSON でエンコードされたレスポンスを返します。次に例を示します。
{
"record": {
"key": {
"url": "https://web.dev/fast/"
},
"metrics": {
"largest_contentful_paint": {
"histogram": [
{
"start": 0,
"end": 2500,
"density": 0.8477304539092148
},
{
"start": 2500,
"end": 4000,
"density": 0.08988202359528057
},
{
"start": 4000,
"density": 0.062387522495501155
}
],
"percentiles": {
"p75": 1947
}
},
// ...
}
}
}
フォームによると、https://web.dev/fast/
の 85% が「良好」です。LCP は 75 パーセンタイルの 1,947 ミリ秒で、オリジン全体の分布よりもわずかに優れています。
URL の正規化
CrUX API は、リクエストされた URL を正規化して、既知の URL のリストに一致させます。たとえば、URL https://web.dev/fast/#measure-performance-in-the-field
をクエリすると、正規化により https://web.dev/fast/
のデータが返されます。この場合、レスポンスに urlNormalizationDetails
オブジェクトが含まれます。
{
"record": {
"key": {
"url": "https://web.dev/fast/"
},
"metrics": { ... }
},
"urlNormalizationDetails": {
"normalizedUrl": "https://web.dev/fast/",
"originalUrl": "https://web.dev/fast/#measure-performance-in-the-field"
}
}
詳しくは、CrUX ドキュメントの URL の正規化をご覧ください。
フォーム ファクタ別のクエリ
ユーザー エクスペリエンスは、ウェブサイトの最適化、ネットワーク状態、ユーザーの環境によってできます。これらの違いをより深く理解するには、CrUX API の formFactor
ディメンションを使用して、オリジンと URL のパフォーマンスをドリルダウンします。
API では、DESKTOP
、PHONE
、TABLET
の 3 つの明示的なフォーム ファクタ値がサポートされています。オリジンまたは URL に加えて、これらの値のいずれかをリクエスト本文に指定し、結果をそれらのユーザー エクスペリエンスのみに制限します。この例では、cURL を使ってフォーム ファクタ別に API をクエリする方法を示します。
API_KEY="[YOUR_API_KEY]"
curl "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=$API_KEY" \
--header 'Content-Type: application/json' \
--data '{"url": "https://web.dev/fast/", "formFactor": "PHONE"}'
JavaScript を使用して CrUX API でフォーム ファクタ固有のデータをクエリするには、リクエスト本文で url
パラメータと formFactor
パラメータを使用して CrUXApiUtil.query
関数を呼び出します。
CrUXApiUtil.query({
url: 'https://web.dev/fast/',
formFactor: 'PHONE'
}).then(response => {
console.log(response);
}).catch(response => {
console.error(response);
});
formFactor
パラメータを省略することは、すべてのフォーム ファクタを組み合わせたデータをリクエストするのと同じことです。
{
"record": {
"key": {
"url": "https://web.dev/fast/",
"formFactor": "PHONE"
},
"metrics": {
"largest_contentful_paint": {
"histogram": [
{
"start": 0,
"end": 2500,
"density": 0.778631284916204
},
{
"start": 2500,
"end": 4000,
"density": 0.13943202979515887
},
{
"start": 4000,
"density": 0.08193668528864119
}
],
"percentiles": {
"p75": 2366
}
},
// ...
}
}
}
レスポンスの key
フィールドに formFactor
リクエストの構成がエコーバックされ、スマートフォン エクスペリエンスのみが含まれていることを確認します。
前のセクションで説明したように、このページのユーザー エクスペリエンスの 85% で LCP は「良好」でした。これに対して、スマートフォン専用のエクスペリエンスでは、「良好」と判断したのは 78% だけでした。また、75 パーセンタイルは、1,947 ミリ秒から 2,366 ミリ秒に上昇し、スマートフォンのエクスペリエンスで遅くなっています。フォーム ファクタ別にセグメント化すれば、ユーザー エクスペリエンスの極端なばらつきが顕在化する可能性があります。
Core Web Vitals のパフォーマンスを評価する
Core Web Vitals プログラムでは、ユーザー エクスペリエンスまたはエクスペリエンスの分布が「良好」と判断されるかどうかを判断するためのターゲットを定義します。次の例では、CrUX API と CrUXApiUtil.query
関数を使用して、ウェブページにおける Core Web Vitals の指標(LCP、INP、CLS)の分布が「良好」かどうかを評価しています。
CrUXApiUtil.query({
url: 'https://web.dev/fast/'
}).then(response => {
assessCoreWebVitals(response);
}).catch(response => {
console.error(response);
});
function assessCoreWebVitals(response) {
// See https://web.dev/vitals/#core-web-vitals.
const CORE_WEB_VITALS = [
'largest_contentful_paint',
'interaction_to_next_paint',
'cumulative_layout_shift'
];
CORE_WEB_VITALS.forEach(metric => {
const data = response.record.metrics[metric];
if (!data) {
console.log('No data for', metric);
return;
}
const p75 = data.percentiles.p75;
const threshold = data.histogram[0].end;
// A Core Web Vitals metric passes the assessment if
// its 75th percentile is under the "good" threshold.
const passes = p75 < threshold;
console.log(`The 75th percentile (${p75}) of ${metric} ` +
`${passes ? 'passes' : 'does not pass'} ` +
`the Core Web Vitals "good" threshold (${threshold}).`)
});
}
結果は、このページが 3 つの指標すべてについて Core Web Vitals の評価に合格していることを示しています。
The 75th percentile (1973) of largest_contentful_paint passes the Core Web Vitals "good" threshold (2500).
The 75th percentile (20) of interaction_to_next_paint passes the Core Web Vitals "good" threshold (200).
The 75th percentile (0.05) of cumulative_layout_shift passes the Core Web Vitals "good" threshold (0.10).
API の結果を自動的にモニタリングする方法と組み合わせることで、CrUX からのデータを使用して、実際のユーザー エクスペリエンスをすばやく、常に向上させることができます。Core Web Vitals とその測定方法について詳しくは、Web Vitals と Core Web Vitals を測定するためのツールをご覧ください。
次のステップ
CrUX API の初期バージョンに含まれる機能は、CrUX で得られる分析情報のほんの一部にすぎません。BigQuery の CrUX データセットのユーザーは、次のような高度な機能に精通している可能性があります。
- その他の指標
first_paint
dom_content_loaded
onload
time_to_first_byte
notification_permissions
- その他のディメンション
month
country
effective connection type
(ECT)
- その他の粒度
- 詳細なヒストグラム
- その他のパーセンタイル
公式の CrUX API ドキュメントを参照して API キーを取得し、他のサンプル アプリケーションを確認してください。ぜひお試しください。ご質問やフィードバックがございましたら、CrUX ディスカッション フォーラムからお寄せください。また、CrUX API に関する最新情報をお届けするには、CrUX お知らせフォーラムに登録するか、Twitter で @ChromeUXReport をフォローしてください。