--- title: Runbook — background job timeout category: TRANSIENT_DEPENDENCY error_codes: [JOB_TIMEOUT] severity: P2 owner: oncall last_updated: 2026-06-13 status: stub --- # Runbook: background job timeout (`runbook://job/timeout`) ## 1. Trigger 이 runbook은 다음 alert에서 발동됩니다. - alert name: `job_timeout` - alert payload 필수 field: `error.code=JOB_TIMEOUT`, `job_name`, `correlation_id`, `runbook_link` - 임계: `job.retry.total{outcome=RETRY}` 급증 또는 graceful-shutdown 중 in-flight job interrupt 발생 - 연관: shutdown phase에서 19s await 초과로 interrupt된 job (D8) ## 2. First Response (10분 이내) ### Step 1 — 확인 1. ERROR log에서 `JOB_TIMEOUT` 라인 확인: `job_name`, 마지막 단계, 소요 시간 추출 2. timeout이 정상 실행 중 발생인지, graceful-shutdown(배포/스케일다운) 중 interrupt인지 구분 3. 해당 job이 멱등(retry-on-next-cycle 안전)인지 확인 — 비멱등이면 §4에서 신중히 처리 ### Step 2 — 임시 격리 - shutdown 중 interrupt면: 다음 기동 시 재시도 대상인지(멱등 전제) 확인, 중복 부작용 여부 점검 - 정상 실행 중 timeout이면: 해당 job의 외부 의존성(DB/HTTP) 지연 여부 확인 ## 3. Diagnosis - log query: `{service="app"} | error.code="JOB_TIMEOUT" | stats count by job_name` - metric panel: `job.retry.total{job_name, outcome}` - 가능한 원인 우선순위: - 외부 의존성(DB lock / 느린 HTTP) 지연으로 job p99 상승 - job 작업량 증가로 단일 cycle이 19s 예산 초과 (D8 — interrupt 노출) - interrupt 미반응 blocking call(JDBC 등) → awaitTermination 초과 (K8S-POD-LC-C2 SIGKILL 경로) ## 4. Mitigation - 단기: 의존성 회복 / job 입력 배치 크기 축소 - job p99가 구조적으로 19s를 넘으면: 작업을 분할하거나, grace period 연장 검토(parent project 운영 계약 소유자 승인 필요 — OUT_OF_BRANCH_SCOPE) - 비멱등 job이 재시도로 중복 부작용을 내면 멱등키/dedupe 도입 우선 ## 5. Escalation - 의존성 지연이 근본 원인이면 해당 의존성 오너에게 escalate - shutdown 예산(20s) vs k8s `terminationGracePeriodSeconds`(30s) 정합 이슈면 플랫폼/런타임 오너에게 escalate ## 6. Recovery / Verification - 회복 확인: `JOB_TIMEOUT` 신규 발생 멈춤, `job.retry.total{outcome=SUCCESS}` 정상 비율 회복 - 멱등 재시도분의 부작용 중복 없음 확인 ## 7. Related - error-codes.yaml rows: `JOB_TIMEOUT` (TRANSIENT_DEPENDENCY, 500, retryable=true, retry_after 10s) - metrics.yaml: `job.retry.total{job_name, outcome}` - 코드: `app-bootstrap` `async/AsyncExecutorConfig`(awaitTermination 19s — D8 graceful shutdown) - env: `APP_SERVER_SHUTDOWN_TIMEOUT`(owner: feature-env-driven-runtime-configuration D2) - 관련 runbook: [[job-executor-rejected]], [[job-dead-letter]] - 관련 branch: [[feature-background-job-async-contract]] (D4 retry / D8 shutdown) --- > **Stub 상태 안내**: 이 runbook은 skeleton 단계의 stub. 실제 retry carrier·job p99·shutdown 예산 확정 시 보강 필요.