프로파일링 코드 실행
요청의 각 단계 타이밍을 정하면 직관이 증거로 대체됩니다. 기간이 구조화된 이벤트이면 실행, 릴리스 및 입력 크기 범주 전반에 걸쳐 함수를 비교할 수 있습니다.
기간 프로필은 어떤 기능을 먼저 최적화할 가치가 있는지 알려줍니다.
프로젝트 설정
npm init -y
npm install telemetry-sh
완료된 각 단계를 계측합니다.
동일한 열이 워크플로 전체에서 작동하도록 단계당 하나의 이벤트를 사용합니다. run_id는 하나의 요청 또는 작업에 속하는 단계를 연결합니다.
const telemetry = require("telemetry-sh");
const { randomUUID } = require("node:crypto");
telemetry.init(process.env.TELEMETRY_API_KEY);
async function measureStep({ runId, stepName }, operation) {
const startedAt = Date.now();
try {
const result = await operation();
await telemetry.log("profile_step_completed", {
run_id: runId,
step_name: stepName,
status: "success",
duration_ms: Date.now() - startedAt,
release: process.env.APP_RELEASE ?? "unknown",
});
return result;
} catch (error) {
await telemetry.log("profile_step_completed", {
run_id: runId,
step_name: stepName,
status: "error",
duration_ms: Date.now() - startedAt,
error_type: error.constructor?.name ?? "Error",
release: process.env.APP_RELEASE ?? "unknown",
});
throw error;
}
}
async function profileRequest() {
const runId = randomUUID();
const project = await measureStep(
{ runId, stepName: "load_project" },
() => loadProject()
);
return measureStep(
{ runId, stepName: "generate_report" },
() => generateReport(project)
);
}
기본적으로 함수 인수, 데이터베이스 레코드 또는 예외 메시지를 기록하지 마세요. input_size_bucket, cache_status 또는 query_name와 같은 안전한 범주는 원시 콘텐츠를 저장하지 않고도 성능을 설명할 수 있습니다.
쿼리 평균 및 꼬리 기간
SELECT
step_name,
COUNT(*) AS runs,
ROUND(AVG(duration_ms), 0) AS avg_duration_ms,
ROUND(approx_percentile_cont(duration_ms, 0.95), 0) AS p95_duration_ms,
ROUND(
100.0 * SUM(CASE WHEN status = 'error' THEN 1 ELSE 0 END)
/ NULLIF(COUNT(*), 0),
2
) AS error_rate_pct
FROM profile_step_completed
WHERE timestamp_utc >= now() - INTERVAL '7 days'
GROUP BY step_name
ORDER BY p95_duration_ms DESC;
간헐적으로 느린 단계가 계속 표시되도록 평균보다는 p95를 사용하십시오. 배포 후 release로 분할하고 여러 느린 단계가 동일한 요청에 속하는 경우 개별 run_id 값을 검사합니다.
성능 뷰 구축
다음으로 시작하세요:
- p95 기간을 단계별로 표시하는 막대 차트;
- 가장 느린 단계에 대한 시간 경과에 따른 p95의 선형 차트;
- 릴리스별로 분할된 결과 테이블;
- 오류 또는 극단적 기간 행으로 필터링된 최근 이벤트 테이블.
유용한 경계의 프로필. 핫 루프의 모든 작은 기능에 대해 이벤트를 발생시키지 마십시오. 오버헤드를 추가하고 해석하기 어려운 데이터 세트를 생성합니다.
다음 단계
측정된 워크플로가 API 요청인 경우 완전한 결과 시각화, 대시보드 레이아웃 및 알림 디자인을 위해 API 대기 시간 백분위수 레시피를 사용하세요.