콘텐츠로 건너뛰기
Telemetry
문서 찾아보기
가이드업데이트된 2026년 7월 27일Telemetry 편집 및 제품 팀의 검토2 최소 읽기

코딩 에이전트와 함께 이 문서를 사용하세요.

Claude Code, Codex, Cursor 또는 다른 코딩 에이전트에 대한 집중 프롬프트 팩을 연 다음 여기에서 다루는 워크플로에 맞게 조정하세요.

이 페이지에서
  1. 프로젝트 설정
  2. 완료된 각 단계를 계측합니다.
  3. 쿼리 평균 및 꼬리 기간
  4. 성능 뷰 구축
  5. 다음 단계

프로파일링 코드 실행

요청의 각 단계 타이밍을 정하면 직관이 증거로 대체됩니다. 기간이 구조화된 이벤트이면 실행, 릴리스 및 입력 크기 범주 전반에 걸쳐 함수를 비교할 수 있습니다.

842밀리초 요청의 대부분을 소비하는 데이터베이스 조회를 보여주는 함수 실행 폭포

기간 프로필은 어떤 기능을 먼저 최적화할 가치가 있는지 알려줍니다.

프로젝트 설정

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 대기 시간 백분위수 레시피를 사용하세요.

관련 기능

안정적인 이벤트 이름, 타입이 지정된 필드, 개인 정보 보호 검토 컨텍스트를 캡처합니다.

페이지 작성자 및 참고 자료

이 설명은 Telemetry 편집팀의 소유입니다. 제품 팀은 동작, 예시, 경계를 검토합니다.

문서 검토 방법