CrUX 기록 API

CrUX History API는 페이지 및 출처 세부사항에서 6개월간의 과거 실제 사용자 경험 데이터에 대한 짧은 지연 시간으로 액세스를 제공합니다.

일반적인 사용 사례

CrUX History API를 사용하면 'https://example.com 출처의 과거 UX 트렌드 가져오기'와 같은 특정 URI의 이전 사용자 환경 측정항목을 쿼리할 수 있습니다.

History API는 값이 배열로 지정되고 키에 복수형으로 라벨이 지정된다는 점을 제외하고 일일 CrUX API와 동일한 구조를 따릅니다. 예를 들어 histogram 대신 histogramTimeseries, p75 대신 p75s가 사용됩니다.

CrUX API 키

일일 API와 마찬가지로 CrUX History API를 사용하려면 Google Cloud API 키가 필요합니다. 동일한 키를 일별 및 History API에 사용할 수 있습니다.

사용자 인증 정보 페이지에서 계정을 만들고 Chrome UX Report API 사용을 위해 프로비저닝할 수 있습니다.

API 키가 있으면 애플리케이션은 모든 요청 URL에 쿼리 매개변수 key=[YOUR_API_KEY]를 추가할 수 있습니다. 예시 쿼리를 참조하세요.

API 키는 URL에 포함하기에 안전합니다. 인코딩이 전혀 필요하지 않습니다.

데이터 모델

이 섹션에서는 요청 및 응답의 데이터 구조를 자세히 설명합니다.

레코드

페이지 또는 사이트에 관한 별개의 정보입니다. 레코드에는 식별자 및 측정기준의 특정 조합에 대한 데이터가 포함될 수 있습니다. 레코드에는 하나 이상의 측정항목에 대한 데이터가 포함될 수 있습니다.

식별자

식별자는 조회해야 하는 레코드를 지정합니다. CrUX에서 이러한 식별자는 웹페이지와 웹사이트입니다.

출발지

식별자가 출처인 경우 해당 출처의 모든 페이지에 있는 모든 데이터가 함께 집계됩니다. 예를 들어 http://www.example.com 출처에 다음 사이트맵에 배치된 페이지가 있다고 가정해 보겠습니다.

http://www.example.com/
http://www.example.com/foo.html
http://www.example.com/bar.html

즉, 출처가 http://www.example.com로 설정된 Chrome UX 보고서를 쿼리하면 http://www.example.com/, http://www.example.com/foo.html, http://www.example.com/bar.html 데이터가 모두 해당 출처의 페이지이므로 함께 집계되어 반환됩니다.

URL

식별자가 URL이면 해당 URL에 대한 데이터만 반환됩니다. http://www.example.com 원본 사이트맵 다시 확인:

http://www.example.com/
http://www.example.com/foo.html
http://www.example.com/bar.html

식별자가 값이 http://www.example.com/foo.html인 URL로 설정된 경우 해당 페이지의 데이터만 반환됩니다.

크기

측정기준은 레코드가 집계되는 특정 데이터 그룹을 식별합니다. 예를 들어 폼 팩터 PHONE는 레코드에 휴대기기에서 발생한 로드에 관한 정보가 포함되어 있음을 나타냅니다.

CrUX History API는 폼 팩터 측정기준으로 집계한 경우에만 사용할 수 있습니다. PHONE, TABLET, DESKTOP로 분할된 일반적인 기기 클래스입니다.

측정항목

히스토그램, 백분위수, 분수인 통계 집계 시계열의 측정항목을 보고합니다.

히스토그램

측정항목이 히스토그램 배열로 표현되면 각 시계열 항목은 측정항목이 전체 기간에 비례하여 일정 간격에 속하는 페이지 로드 비율을 나타냅니다. 데이터 포인트는 API에서 반환한 수집 기간 날짜 순으로 표시되며 첫 번째 포인트가 가장 오래된 데이터 포인트이고 마지막 포인트가 가장 최근의 수집 기간입니다.

예시 측정항목에 대한 간단한 3빈 히스토그램은 다음과 같습니다.

{
  "histogramTimeseries": [
    {
      "start": 0,
      "end": 2500,
      "densities": [0.9190, 0.9203, 0.9194, 0.9195, 0.9183, 0.9187]
    },
    {
      "start": 2500,
      "end": 4000,
      "densities": [0.0521, 0.0513, 0.0518, 0.0518, 0.0526, 0.0527]
    },
    {
      "start": 4000,
      "densities": [0.0288, 0.0282, 0.0286, 0.0285, 0.0290, 0.0285]
    }
  ],
}

이 데이터는 페이지 로드의 91.90% 가 기록의 첫 번째 수집 기간 동안 0~2,500ms 사이의 예시 측정항목 값을 경험했으며 그 뒤를 이어 92.03%, 91.94%를 경험했음을 나타냅니다. 이 히스토그램에는 측정항목의 단위가 포함되어 있지 않으며, 이 경우 밀리초로 가정합니다.

또한 페이지 로드의 5.21% 는 기록의 첫 번째 수집 기간에 2,500ms에서 4,000ms 사이의 예시 측정항목 값을 경험했으며, 페이지 로드의 2.88% 는 기록의 첫 번째 수집 기간에 4,000ms보다 큰 값을 경험했습니다.

백분위수

측정항목에는 추가 분석에 유용할 수 있는 백분위수 시계열도 포함될 수 있습니다.

데이터 포인트는 API에서 반환한 수집 기간 날짜 순으로 표시되며 첫 번째 포인트가 가장 오래된 데이터 포인트이고 마지막 포인트가 가장 최근의 수집 기간입니다.

{
  "percentilesTimeseries": {
    "p75s": [1362, 1352, 1344, 1356, 1366, 1377]
  },
}

이러한 백분위수는 해당 측정항목에 대해 특정 백분위수의 특정 측정항목 값을 표시할 수 있습니다. 이는 최종 비닝된 데이터가 아닌 사용 가능한 전체 데이터 세트를 기반으로 하므로 최종 비닝된 히스토그램을 기반으로 하는 보간된 백분위수와 일치하지 않을 수 있습니다.

분수

측정항목은 라벨이 지정된 분수의 시계열로 표현할 수 있습니다. 각 라벨은 특정 방식의 페이지 로드를 나타냅니다. 데이터 포인트는 API에서 반환한 수집 기간 날짜 순으로 표시되며 첫 번째 포인트가 가장 오래된 데이터 포인트이고 마지막 포인트가 가장 최근의 수집 기간입니다.

예:

{    
  "fractionTimeseries": {
    "desktop": {"fractions": [0.3195, 0.2115, 0.1421]},
    "phone": {"fractions": [0.6295, 0.7544, 0.8288]},
    "tablet": {"fractions": [0.051, 0.0341, 0.029]}
  }
}

이 예에서 가장 최근 데이터 포인트에 따르면 페이지 로드의 14.21% 가 데스크톱에서 발생했으며, 82.88% 가 휴대전화에서 발생했습니다.

측정항목 값 유형

CrUX History API는 동일한 측정항목 값 유형을 사용하므로 자세한 내용은 일일 CrUX API 측정항목 값 유형 문서를 참고하세요.

측정항목 사용 가능 여부

자격 기준에 따라 출처 또는 URL은 CrUX History API가 적용되는 일부 수집 기간에만 적용될 수 있습니다. 이러한 경우 CrUX History API는 histogramTimeseries 밀도에 대해 "NaN"를 반환하고 대상 데이터가 없는 수집 기간에 대해 percentilesTimeseriesnull를 반환합니다. 차이가 발생하는 이유는 히스토그램 밀도는 항상 숫자이고 백분위수는 숫자 또는 문자열일 수 있기 때문입니다 (CLS는 숫자처럼 보이지만 문자열을 사용함).

예를 들어 두 번째 기간에 적합한 데이터가 없는 경우 다음과 같이 표시됩니다.

{
  "histogramTimeseries": [
    {
      "start": 0,
      "end": 2500,
      "densities": [0.9190, "NaN", 0.9194, 0.9195, 0.9183, 0.9187]
    },
    {
      "start": 2500,
      "end": 4000,
      "densities": [0.0521, "NaN", 0.0518, 0.0518, 0.0526, 0.0527]
    },
    {
      "start": 4000,
      "densities": [0.0288, "NaN", 0.0286, 0.0285, 0.0290, 0.0285]
    }
  ],
  "percentilesTimeseries": {
    "p75s": [1362, null, 1344, 1356, 1366, 1377]
  },
}

시간이 지나면서 자격 요건을 충족하거나 자격을 상실하는 URL 또는 출처의 경우 누락된 항목이 많이 표시될 수 있습니다.

수집 기간

CrUX History API에는 각 집계 기간의 시작일과 종료일을 나타내는 firstDateendDate 필드의 배열이 있는 collectionPeriods 객체가 포함되어 있습니다. 예를 들면 다음과 같습니다.

    "collectionPeriods": [{
        "firstDate": { "year": 2022, "month": 7, "day": 10 },
        "lastDate": { "year": 2022, "month": 8, "day": 6 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 17 },
        "lastDate": { "year": 2022, "month": 8, "day": 13 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 24 },
        "lastDate": { "year": 2022, "month": 8, "day": 20 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 31 },
        "lastDate": { "year": 2022, "month": 8, "day": 27 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 7 },
        "lastDate": { "year": 2022, "month": 9, "day": 3 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 14 },
        "lastDate": { "year": 2022, "month": 9, "day": 10 }
      }
    ]

이러한 수집 기간은 오름차순으로 정렬되며 응답의 다른 섹션에 있는 각 데이터 포인트의 기간을 나타냅니다.

History API는 매주 월요일에 업데이트되며 표준 지연시간에 따라 이전 토요일까지의 데이터를 포함합니다. 여기에는 이전 25주(매주 1회의 수집 기간)에 해당하는 데이터가 포함되어 있습니다.

각 수집 기간에는 이전 28일 동안의 집계된 데이터가 포함되고 수집 기간이 주 단위이므로 수집 기간이 중복됩니다. 이 값은 데이터의 이동 평균과 비슷하며, 각 후속 기간에 3주 분량의 데이터가 포함되고 1주일은 서로 다른 데이터가 포함됩니다.

쿼리 예

쿼리는 https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord?key=[YOUR_API_KEY]"에 대한 POST 요청을 사용하여 JSON 객체로 제출되고 POST 본문에 쿼리 데이터가 JSON 객체로 제출됩니다.

queryHistoryRecord는 일일 CrUX API의 queryRecord를 대체합니다.

본문의 예는 다음과 같습니다.

{
  "origin": "https://example.com",
  "formFactor": "PHONE",
  "metrics": [
    "largest_contentful_paint",
    "experimental_time_to_first_byte"
  ]
}

예를 들어 API_KEY를 키로 대체하여 다음 명령줄을 사용하여 curl에서 호출할 수 있습니다.

curl -s --request POST 'https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord?key=API_KEY' \
    --header 'Accept: application/json' \
    --header 'Content-Type: application/json' \
    --data '{"formFactor":"PHONE","origin":"https://www.example.com","metrics":["largest_contentful_paint", "experimental_time_to_first_byte"]}'

페이지 수준 데이터는 쿼리에 origin 대신 url 속성을 전달하여 API를 통해 사용할 수 있습니다.

{
  "url": "https://example.com/page",
  "formFactor": "PHONE",
  "metrics": [
    "largest_contentful_paint",
    "experimental_time_to_first_byte"
  ]
}

metrics 속성이 설정되어 있지 않으면 사용 가능한 모든 측정항목이 반환됩니다.

  • cumulative_layout_shift
  • first_contentful_paint
  • first_input_delay
  • interaction_to_next_paint
  • largest_contentful_paint
  • experimental_time_to_first_byte
  • navigation_types
  • round_trip_time
  • form_factors (요청에 formFactor가 지정되지 않은 경우에만 보고됨)

formFactor 값을 제공하지 않으면 모든 폼 팩터에서 값이 집계됩니다.

더 많은 쿼리 예를 보려면 CrUX History API 사용 가이드를 참조하세요.

데이터 파이프라인

CrUX 데이터 세트는 API를 통해 사용할 수 있게 되기 전에 파이프라인을 통해 처리되어 데이터를 통합, 집계 및 필터링합니다.

이동 평균

Chrome UX 보고서의 데이터는 집계된 측정항목의 28일 이동 평균입니다. 즉, 특정 시점의 Chrome UX 보고서에 표시되는 데이터는 실제로 지난 28일 동안 합산한 데이터입니다.

History API는 각각 28일에 걸친 다수의 수집 기간을 포함합니다. 각 수집 기간에는 이전 28일 동안의 집계된 데이터가 포함되고 수집 기간이 주 단위이므로 수집 기간이 중복됩니다. 이 값은 데이터의 이동 평균과 비슷하며, 각 후속 기간에 3주 분량의 데이터가 포함되고 1주일은 서로 다른 데이터가 포함됩니다.

주간 업데이트

History API는 매주 월요일 04:00(UTC)에 업데이트되며 전주 토요일까지의 데이터를 포함합니다(표준 2일 지연에 따라). 주당 한 번의 수집 기간으로 이전 25주 (약 6개월)의 데이터가 포함됩니다.

업데이트 시간에 대한 서비스 수준 계약은 없으며 매일 최선을 다해 실행됩니다.

스키마

POST HTTP 요청을 수락하는 CrUX History API의 단일 엔드포인트가 있습니다. API는 요청된 출처 또는 페이지에 관한 성능 데이터에 해당하는 하나 이상의 metrics가 포함된 record를 반환합니다.

HTTP 요청

POST https://chromeuxreport.googleapis.com/v1/records:queryHistoryRecord

URL은 gRPC 트랜스코딩 구문을 사용합니다.

요청 본문

CrUX History API는 effectiveConnectionType 요청 필드를 지원하지 않는 경우를 제외하고 일일 CrUX API와 동일한 요청 본문을 사용합니다.

예를 들어 web.dev 홈페이지에 대해 데스크톱의 최대 콘텐츠 페인트 값을 요청하려면 다음을 실행합니다.

{
  "origin": "https://web.dev/",
  "formFactor": "DESKTOP",
  "metrics": [
    "largest_contentful_paint"
  ]
}

응답 본문

요청이 성공하면 record 객체와 urlNormalizationDetails가 포함된 응답이 다음 구조로 반환됩니다.

{
  "record": {
    "key": {
      object (Key)
    },
    "metrics": [
      string: {
        object (Metric)
      }
    ]
  },
  "urlNormalizationDetails": {
    object (UrlNormalization)
  }
}

예를 들어 이전 요청의 요청 본문에 대한 응답은 다음과 같을 수 있습니다.

{
  "record": {
    "key": {
      "origin": "https://web.dev"
    },
    "metrics": {
      "largest_contentful_paint": {
        "histogramTimeseries": [{
            "start": 0, "end": 2500, "densities": [
              0.9190, 0.9203, 0.9194, 0.9195, 0.9183, 0.9187, ...
            ]
          }, {
            "start": 2500, "end": 4000, "densities": [
              0.0521, 0.0513, 0.0518, 0.0518, 0.0526, 0.0527, ...
            ]
          },  {
            "start": 4000, "densities": [
              0.0288, 0.0282, 0.0286, 0.0285, 0.0290, 0.0285, ...
            ]
          }
        ],
        "percentilesTimeseries": {
          "p75s": [
            1362, 1352, 1344, 1356, 1366, 1377, ...
          ]
        }
      }
    },
    "collectionPeriods": [{
        "firstDate": { "year": 2022, "month": 7, "day": 10 },
        "lastDate": { "year": 2022, "month": 8, "day": 6 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 17 },
        "lastDate": { "year": 2022, "month": 8, "day": 13 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 24 },
        "lastDate": { "year": 2022, "month": 8, "day": 20 }
      }, {
        "firstDate": { "year": 2022, "month": 7, "day": 31 },
        "lastDate": { "year": 2022, "month": 8, "day": 27 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 7 },
        "lastDate": { "year": 2022, "month": 9, "day": 3 }
      }, {
        "firstDate": { "year": 2022, "month": 8, "day": 14 },
        "lastDate": { "year": 2022, "month": 9, "day": 10 }
      }, {
        ...
      }
    ]
  }
}

Key는 이 레코드를 고유한 것으로 식별하는 모든 측정기준을 정의합니다.

{
  "formFactor": enum (FormFactor),

  // Union field url_pattern can be only one of the following:
  "origin": string,
  "url": string
  // End of list of possible types for union field url_pattern.
}
입력란
formFactor

enum (FormFactor)

폼 팩터는 모든 사용자가 이 레코드의 사이트에 액세스하는 데 사용한 기기 클래스입니다.

폼 팩터가 지정되지 않으면 모든 폼 팩터에서 집계된 데이터가 반환됩니다.

통합 필드 url_pattern. URL 패턴은 레코드가 적용되는 URL입니다. url_pattern는 다음 중 하나여야 합니다.
origin

string

출처는 이 레코드가 적용되는 출처를 지정합니다.

참고: 출처를 지정하면 모든 페이지에 대한 이 출처의 로드 데이터가 출처 수준 사용자 환경 데이터로 집계됩니다.

url

string

url는 이 레코드의 특정 URL을 지정합니다.

참고: url를 지정하면 해당 URL에 대한 데이터만 집계됩니다.

측정항목

metric는 콘텐츠가 포함된 첫 페인트와 같은 단일 웹 성능 측정항목에 관한 사용자 환경 데이터 집합입니다. 여기에는 일련의 bins로 실제 Chrome 사용에 관한 요약 히스토그램이 포함되어 있습니다.

{
  "histogramTimeseries": [
    {
      object (Bin)
    }
  ],
  "percentilesTimeseries": {
    object (Percentiles)
  }
}

사용하여

"fractionTimeseries": {
  object (Fractions)
}
입력란
histogramTimeseries[]

object (Bin)

측정항목에 대한 사용자 환경의 시계열 히스토그램입니다. 시계열 히스토그램에는 구간이 하나 이상 있으며 모든 구간의 밀도는 최대 1이 됩니다.

특정 수집 기간에 누락된 값이 있으면 "NaN"로 표시됩니다.

percentilesTimeseries

object (Percentiles)

측정항목의 일반적인 유용한 백분위수입니다. 백분위수의 값 유형은 히스토그램 빈에 지정된 값 유형과 동일합니다.

특정 수집 기간에 누락된 값이 있으면 null로 표시됩니다.

fractionTimeseries

object (Fractions)

이 객체에는 라벨이 지정된 분수의 시계열이 포함되며, 총합은 항목당 최대 1개입니다.

분수는 소수점 이하 4자리로 반올림됩니다.

누락된 항목은 모든 분수에서 'NaN'으로 표시됩니다.

구간

bin는 시작부터 끝까지, 또는 시작부터 양의 무한대까지 끝나지 않는 데이터의 개별 부분입니다.

구간의 시작값과 끝값은 해당 구간이 나타내는 측정항목의 값 유형으로 지정됩니다. 예를 들어 콘텐츠가 포함된 첫 페인트는 밀리초 단위로 측정되고 정수로 노출되므로 측정항목 구간은 시작 및 종료 유형에 int32를 사용합니다. 하지만 누적 레이아웃 변경은 단위 없는 십진수로 측정되고 문자열로 인코딩된 십진수로 노출되므로 측정항목 구간은 값 유형에 문자열을 사용합니다.

{
  "start": value,
  "end": value,
  "densities": [number, number, number...etc.]
}
입력란
start

(integer | string)

start는 데이터 구간의 시작입니다.

end

(integer | string)

end는 데이터 구간의 끝입니다. end가 채워지지 않으면 구간에 끝이 없으며 start부터 +inf까지 유효합니다.

densities

array[number]

특정 측정항목에서 이 구간 값을 경험한 사용자 비율의 시계열입니다.

밀도는 소수점 이하 4자리로 반올림됩니다.

백분위수

Percentiles에는 지정된 통계 백분위수의 측정항목의 합성 값이 포함됩니다. 이 값은 전체 사용자 수 중에서 일정 비율의 사용자가 경험한 측정항목의 값을 추정하는 데 사용됩니다.

{
  "P75": value
}
입력란
p75s

array[(integer | string)]

페이지 로드의 75% 에서 지정된 값의 시계열에서 이 값 이하로 경험했습니다.

분수

Fractions에는 항목당 총 1이 되는 라벨이 지정된 분수의 시계열이 포함됩니다. 각 라벨은 어떤 방식으로든 페이지 로드를 설명하므로 이러한 방식으로 표현된 측정항목은 숫자 값이 아닌 고유한 값을 생성하는 것으로 간주될 수 있으며 분수는 특정 고유한 값이 측정된 빈도를 나타냅니다.

{
  "label_1": { "fractions": array[fraction]},
  "label_1": { "fractions": array[fraction]},
  ...
  "label_n": { "fractions": array[fraction]}
}

히스토그램 빈의 밀도 값과 마찬가지로 각 fraction은 숫자 0.0 <= value <= 1.0이고 합이 ~1.0이 됩니다. 특정 수집 기간에 측정항목을 사용할 수 없는 경우 해당 항목은 모든 분수 배열에서 'NaN'이 됩니다.

입력란
p75s

array[(integer | string)]

페이지 로드의 75% 에서 지정된 값의 시계열에서 이 값 또는 그보다 낮은 값을 경험했습니다.

UrlNormalization

조회 성공 가능성을 높이기 위해 URL을 정규화하기 위해 수행된 정규화 작업을 나타내는 객체입니다. 이는 제공된 url_pattern를 조회할 때 수행되는 간단한 자동 변경사항이며, 실패하는 것으로 알려져 있습니다. 다음 리디렉션과 같은 복잡한 작업은 처리되지 않습니다.

{
  "originalUrl": string,
  "normalizedUrl": string
}
입력란
originalUrl

string

정규화 작업 전에 요청한 원래 URL입니다.

normalizedUrl

string

정규화 작업 이후의 URL입니다. 합리적으로 조회할 수 있는 유효한 사용자 환경 URL입니다.

비율 제한

CrUX History API는 API에 대해 Google Cloud 프로젝트당 분당 150개의 쿼리에 대해 CrUX API와 동일한 한도를 공유하며, 이는 무료로 제공됩니다. 이 한도 및 현재 사용량은 Google Cloud 콘솔에서 확인할 수 있습니다. 대부분의 사용 사례에서 이 넉넉한 할당량으로 충분하며 늘어난 할당량에 대해서는 비용을 지불할 수 없습니다.