Web Power Analyzer
Document
User manual
사용자 매뉴얼
관리자 화면은 웹 페이지를 불러올 때 사용한 에너지를 측정하고, 측정 조건을 조정하며, 단일 URL 또는 여러 URL의 측정 작업을 실행하는 도구입니다. 결과 에너지는 줄(J) 단위로 제공되며, 측정 레코드와 API를 통해 후속 분석에 사용할 수 있습니다.
1. Measurement settings
측정 설정 화면
Measurement Settings에서는 측정의 반복 횟수, 페이지 로드 대기 시간, 시스템 안정화 시간, 실패 재시도 정책을 설정합니다. Save를 누르면 이후에 시작하는 측정에 적용됩니다.
입력 항목
| 화면 항목 | 설명 | 사용 시 참고 |
|---|---|---|
| Repetitions | 같은 URL을 몇 번 반복해 측정할지 정합니다. | 값이 클수록 결과의 흔들림을 확인하기 좋지만 측정 시간이 길어집니다. |
| Settle delay seconds | 페이지를 연 뒤 추가로 기다리는 시간(초)입니다. | 애니메이션·추가 요청이 많은 페이지는 값을 늘리면 초기 로딩 영향이 줄어듭니다. |
| Navigation timeout ms | 페이지 로딩이 끝날 때까지 기다리는 최대 시간(밀리초)입니다. | 느린 페이지가 실패하면 값을 늘리고, 잘못된 URL을 오래 기다리지 않으려면 줄입니다. |
| Minimum cooldown seconds | 한 번의 측정이 끝난 뒤 다음 측정을 시작하기 전의 최소 대기 시간(초)입니다. | 연속 실행으로 인한 시스템 부하 영향을 줄입니다. |
| Idle stable seconds | 측정 시작 전에 시스템이 유휴 상태로 안정되어 있어야 하는 시간(초)입니다. | 다른 작업이 끝난 직후의 불안정한 측정을 피합니다. |
| Run retry count | 측정 실행 자체가 실패했을 때 다시 시도하는 횟수입니다. | 일시적인 네트워크 또는 브라우저 오류에 대비합니다. |
| URL drift retry count | 측정 중 페이지 주소가 다른 주소로 바뀌었을 때 다시 시도하는 횟수입니다. | 로그인 리디렉션 또는 페이지 이동이 잦은 사이트에서 사용합니다. |
자동 표시 항목과 버튼
| 화면 항목 | 설명 |
|---|---|
| Repetitions / Baseline Duration / Baseline Reinterval / Idle Gate | 현재 서버에 적용된 핵심 측정 조건을 요약해 보여주는 읽기 전용 카드입니다. |
| baseline_duration_s | 기본 에너지 사용량을 한 번 관찰하는 실제 시간입니다. |
| baseline_reinterval_k | 하나의 기본 측정값을 몇 번의 페이지 측정에 적용하는지 보여줍니다. |
| idle_gate_seconds | 측정 전 시스템 유휴 상태를 기다리는 기준 시간을 보여줍니다. |
| URL Analysis / Modeling | 상단 버튼으로 URL 측정 화면 또는 모델 관리 화면으로 이동합니다. |
| Save | 현재 입력한 측정 설정을 저장합니다. 저장 후 새로 시작하는 작업부터 적용됩니다. |
| Runtime Check | API 연결 여부, 설정 저장소 연결 상태, 예상 샘플 수, 예상 소요 시간을 표시합니다. |
2. URL analysis
URL 분석 화면
URL Analysis에서는 한 개의 URL을 바로 측정하거나, URL 목록 파일을 올려 여러 페이지를 순차적으로 측정할 수 있습니다.
단일 URL 측정
| 화면 항목 | 설명 | 사용 시 참고 |
|---|---|---|
| URL | 측정할 웹 페이지 주소를 입력합니다. | http:// 또는 https://로 시작해야 합니다. |
| Run FULL | 입력한 URL의 전체 페이지 측정 작업을 시작합니다. | 클릭 후 작업 상태와 결과가 아래 영역에 표시됩니다. |
| 상태 배지 | 측정 작업의 현재 상태를 표시합니다. | 대기·실행·완료·실패 여부를 먼저 확인하세요. |
| 결과 영역 | 작업 식별자, 처리 상태, 결과 또는 오류 정보를 보여줍니다. | 오류가 발생하면 메시지를 확인한 뒤 URL 또는 설정을 조정해 다시 실행합니다. |
파일 기반 배치 측정
| 화면 항목 | 설명 | 사용 시 참고 |
|---|---|---|
| URL file | 측정할 URL 목록이 담긴 TXT 또는 CSV 파일을 선택합니다. | 한 줄에 하나의 URL을 넣고, 최대 5,000개 URL을 등록할 수 있습니다. |
| Preview file | 파일에서 읽은 URL 목록을 미리 확인합니다. | 미리보기가 끝나야 Run batch 버튼이 활성화됩니다. |
| Run batch | 미리보기한 URL 목록으로 비동기 배치 측정 작업을 생성합니다. | 작업이 끝날 때까지 페이지를 열어둘 필요는 없습니다. |
| 배치 상태 배지 | 현재 배치 작업의 진행 상태를 표시합니다. | 실행 중에는 Refresh로 최신 상태를 다시 확인할 수 있습니다. |
| 배치 결과 영역 | 등록된 작업 정보와 처리 결과를 보여줍니다. | 실패한 항목이 있으면 Batch History에서 원인과 재시도 대상을 확인합니다. |
| Batch History / 개수 배지 | 최근 배치 작업과 등록 건수를 표시합니다. | 작업을 선택하면 URL별 상태를 확인하고, 필요 시 실패 항목을 재시도할 수 있습니다. |
URL 파일 작성 예시
TXT와 CSV 모두 URL을 한 줄에 하나씩 작성합니다. CSV는 헤더 없이 첫 번째 열에 URL만 넣으세요. 설명이나 주석 행은 넣지 않습니다.
https://www.example.com/
https://www.example.com/products
https://www.example.org/aboutClient API reference
클라이언트 API
URL에서 모델 입력값을 생성한 뒤 해당 입력값으로 페이지의 예상 에너지 사용량을 조회할 수 있습니다. 모든 요청은 Content-Type: application/json을 사용합니다.
| Method | Endpoint | 클라이언트 사용 목적 |
|---|---|---|
| POST | /page-features/collect | URL을 서버의 Chrome/CDP로 열어 예측 모델이 요구하는 25개 입력값을 생성합니다. |
| POST | /page-energy/predictions | 생성된 25개 입력값으로 해당 페이지의 에너지 사용량을 예측합니다. |
URL 입력값 생성 API
POST /page-features/collect는 전달받은 URL을 별도의 Chrome/CDP 브라우저에서 로드하고 네트워크, Resource Timing, DOM, JavaScript/CSS Coverage 정보를 수집해 모델 입력값을 생성합니다. URL은 http:// 또는 https://로 시작해야 합니다.
{
"url": "https://www.example.com"
}
응답에는 요청한 url, 모델 입력 계약을 나타내는 featureSetId, 정확히 25개의 camelCase 정수 값이 담긴 features가 포함됩니다. Coverage 수집 상태는 jsCoverageStatus와 cssCoverageStatus로 확인하며, 부분 실패나 참고 사항은 coverageErrorCode와 warnings에 표시됩니다.
features를 사용해 예측 API를 별도로 호출해야 합니다.에너지 예측 API
POST /page-energy/predictions는 /page-features/collect가 반환한 featureSetId와 features에 labelScope: "PACKAGE_PLUS_DRAM"을 더한 요청을 받아 페이지의 예상 에너지 사용량을 반환합니다. 응답의 predictedEnergyJ가 클라이언트가 사용할 예측 결과이며 단위는 줄(J)입니다.
Canonical record schema
Schema
아래 필드는 정규 레코드 및 학습 데이터셋에서 사용하는 핵심 컬럼입니다. 기본 예측 대상(label)은 energy_package_dram_j입니다.
| 구분 | 필드 | 설명 |
|---|---|---|
| 식별/메타데이터 | record_id | 측정 레코드의 고유 식별자 |
| 식별/메타데이터 | url | 측정 대상 페이지 URL |
| 식별/메타데이터 | page_domain | 페이지 URL의 도메인 |
| 식별/메타데이터 | created_at | 측정 레코드 생성 시각 |
| 예측 대상(label) | energy_package_dram_j | Package와 DRAM을 합산한 페이지 에너지 측정값(J) |
| 품질/검증 정보 | achieved_cv | 반복 측정값의 변동계수(CV) |
| 품질/검증 정보 | unobserved_resource_types | 리소스 영향 분석에서 관측하지 못한 resource type 배열 |
| 품질/검증 정보 | runs_count | 페이지 측정 실행 횟수 |
| 품질/검증 정보 | resource_timings_count | Resource Timing 항목 수 |
| Coverage 품질 정보 | js_coverage_aggregation_version | JavaScript Coverage 중첩 range 집계 규칙. 정정판은 innermost-wins-v1 |
| Coverage 품질 정보 | js_coverage_status | JavaScript Coverage 수집 상태: SUCCESS, PARTIAL, FAILED |
| Coverage 품질 정보 | css_coverage_status | CSS Coverage 수집 상태: SUCCESS, PARTIAL, FAILED |
| Coverage 품질 정보 | coverage_error_code | Coverage 실패 또는 부분 실패 원인. 성공 시 null |
| 모델 입력 feature | request_count | 페이지 요청 수 |
| 모델 입력 feature | third_party_request_count | PSL 기반 등록 가능 도메인(eTLD+1)이 페이지와 다른 요청 수 |
| 모델 입력 feature | distinct_domain_count | PSL 기반 등록 가능 도메인(eTLD+1)의 고유 개수 |
| 모델 입력 feature | transfer_size_document | document 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_script | script 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_css | CSS 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_image | image 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_font | font 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_media | media 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_xhr_fetch | XHR/fetch 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | transfer_size_other | 기타 리소스 전송 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_document | document 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_script | script 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_css | CSS 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_image | image 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_font | font 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_media | media 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_xhr_fetch | XHR/fetch 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | decoded_body_size_other | 기타 리소스 압축 해제 후 크기 합계(bytes) |
| 모델 입력 feature | js_total_bytes_total | 대표 run에서 Coverage가 분석한 JavaScript 전체 바이트 합계 |
| 모델 입력 feature | js_unused_bytes_total | innermost-wins-v1 규칙으로 계산한 미실행 JavaScript 바이트 합계 |
| 모델 입력 feature | css_total_bytes_total | 대표 run에서 Coverage가 분석한 CSS 전체 바이트 합계 |
| 모델 입력 feature | css_unused_bytes_total | 대표 run 측정 구간에서 사용되지 않은 CSS 바이트 합계 |
| 모델 입력 feature | dom_node_count | DOM 노드 수 |
| 모델 입력 feature | dom_depth | DOM 트리 최대 깊이 |
js_coverage_status 또는 css_coverage_status가 SUCCESS인 축만 정상 측정값으로 사용합니다. PARTIAL·FAILED의 숫자 0은 하위 호환 대체값일 수 있으므로 실제 값 0으로 해석하지 않습니다.Input and output
INPUT JSON 형식
예측 API는 camelCase의 정확히 25개 정수 feature를 요구합니다. 모든 값은 0 이상 64-bit 정수여야 합니다.
{
"labelScope": "PACKAGE_PLUS_DRAM",
"featureSetId": "kepler-page-energy-b-v1",
"features": {
"requestCount": 120, "thirdPartyRequestCount": 12, "distinctDomainCount": 8,
"transferSizeDocument": 12000, "transferSizeScript": 840000, "transferSizeCss": 120000,
"transferSizeImage": 240000, "transferSizeFont": 0, "transferSizeMedia": 0,
"transferSizeXhrFetch": 32000, "transferSizeOther": 0,
"decodedBodySizeDocument": 25000, "decodedBodySizeScript": 2300000, "decodedBodySizeCss": 410000,
"decodedBodySizeImage": 610000, "decodedBodySizeFont": 0, "decodedBodySizeMedia": 0,
"decodedBodySizeXhrFetch": 80000, "decodedBodySizeOther": 0,
"domNodeCount": 1800, "domDepth": 18,
"jsTotalBytesTotal": 2400000, "jsUnusedBytesTotal": 630000,
"cssTotalBytesTotal": 410000, "cssUnusedBytesTotal": 150000
}
}OUTPUT JSON 형식
{
"status": "READY",
"labelScope": "PACKAGE_PLUS_DRAM",
"target": "energy_package_dram_j",
"predictedEnergyJ": 18.42,
"fallbackUsed": false,
"fallbackReason": null,
"modelKey": "page-energy-model-b",
"modelRunId": "00000000-0000-0000-0000-000000000000"
}