본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 17. 01:33

몇 분 만에 완성하는 런북(Runbooks): HazelJS를 활용한 온콜(On-call) 장애 대응 코파일럿(Copilot)

요약

HazelJS를 사용하여 장애 대응을 자동화하는 온콜(On-call) 코파일럿 구축 방법을 소개합니다. 트리아지, 런북 검색, 고객 커뮤니케이션을 담당하는 멀티 에이전트 시스템과 슈퍼바이저 라우팅 구조를 구현합니다.

핵심 포인트

  • 트리아지, 런북 검색, 커뮤니케이션 에이전트 분리 설계
  • 슈퍼바이저 패턴을 통한 작업 라우팅 구현
  • HazelJS 프레임워크 기반의 에이전트 모듈 구성
  • 장애 심각도 분류 및 고객 대응 초안 작성 자동화

운영 환경(Production)에 문제가 발생했을 때, 엔지니어들은 일반적인 챗봇이 아니라 로그, 메트릭, 그리고 **런북(Runbooks)**을 찾습니다. 유용한 장애 대응 코파일럿(Incident copilot)은 페이징 시스템(Paging system)을 대체하려 들지 않으면서도, **영향도를 분류(Classifies impact)**하고, 적절한 플레이북(Playbook)을 제시하며, **고객에게 안전한 언어로 초안을 작성(Drafts customer-safe language)**합니다.

핵심 아이디어는 트리아지(Triage, 우선순위 분류) 사실과 커뮤니케이션 톤(Comms tone)을 분리하는 것입니다. 즉, 두 개의 에이전트(Agent)와 하나의 슈퍼바이저(Supervisor)를 사용하고, 먼저 피스처(Fixtures)를 적용한 뒤 실제 데이터 소스로 교체하는 방식입니다.

우리가 구축하는 것

  • 심각도 트리아지(Severity triage) — 구조화된 도구 출력 (컴포넌트, 고객 영향도, 제안된 심각도).
  • 런북 검색(Runbook retrieval) — 온콜(On-call) 플레이북에 대한 키워드 검색 (피스처 → 이후 Confluence / Notion).
  • 고객 업데이트 초안 작성(Customer update drafting) — 신중한 언어를 사용한 짧은 상태 메시지.
  • 슈퍼바이저 라우팅(Supervisor routing)createSupervisor가 여러 라운드에 걸쳐 트리아지(Triage) vs 런북(Runbook) vs 커뮤니케이션(Comms)을 선택.

providers에 **IncidentController**와 세 개의 @Agent 클래스를 추가하고, AgentModule 이전에 파일을 임포트(Import)한 뒤, POST /incident/analyze(단일 코디네이터)와 POST /incident/supervisor(멀티 워커 라우터)를 노출합니다.

런타임 전제 조건(Runtime prerequisites): 동일한 AI 네이티브 베이스라인 — 템플릿 부팅을 위한 Postgres, npm run db:push, OPENAI_API_KEY, npm run dev.

피스처 런북(Fixture runbooks)

const RUNBOOKS = [
  {
    id: 'rb-payment-latency',
...

에이전트(Agents)

트리아지 에이전트(Triage agent)

@Agent({
  name: 'IncidentTriageAgent',
  description: 'Classifies incidents and suggests immediate checks',
...

런북 검색 에이전트(Runbook search agent)

@Agent({
  name: 'RunbookSearchAgent',
  description: 'Finds runbook steps for a symptom',
...

고객 커뮤니케이션 에이전트(Customer comms agent)

@Agent({
  name: 'CustomerCommsAgent',
  description: 'Drafts cautious external status updates',
...

HTTP 컨트롤러 (supervisor)

@Controller('incident')
export class IncidentController {
  constructor(private readonly agentService: AgentService) {}
...

실행 및 테스트(Running & testing)

실행 및 테스트(Running & testing)

npx @hazeljs/cli g app incident-copilot-demo --template=ai-native
cd incident-copilot-demo
cp .env.example .env
...

1) Triage 전용(Triage-only)triage.json:

{ "message": "Checkout is slow; customers see 8s latency on payment confirm in EU." }
curl.exe -s -X POST http://localhost:3000/incident/triage 
-H "Content-Type: application/json" 
-d "@triage.json"

2) 감독관(Supervisor)incident.json:

{
  "message": "Kafka lag spiked on ingestion-raw; pipeline stalled. Draft a cautious customer update and cite runbook steps."
}
curl.exe -s -X POST http://localhost:3000/incident/supervisor 
-H "Content-Type: application/json" 
-d "@incident.json"

3) 검사기(Inspector) — 경로 및 모듈 내부 검사를 위해 http://localhost:3000/__hazel을 사용합니다.

**CustomerCommsAgent**를 VPN 외부로 노출하기 전에 **GuardrailsModule**과 함께 사용하세요.

프로덕션 배포 전 변경할 사항(What to change before production)

  • **searchRunbooks**를 실제 지식 기반(KB)에 연결하고, 검색된 모든 단계에 **버전 ID(version ids)**를 유지하세요.
  • 공개 초안에 대한 **승인(approval)**을 추가하세요 (requiresApproval: true를 게시 도구에 적용).
  • 감사를 위해 PagerDuty / Jira 인시던트에 **실행 ID(execution ids)**를 첨부하세요.
  • 잦은 오탐지 경보로 인한 남용을 방지하기 위해 /incident/*에 **속도 제한(rate limits)**을 추가하세요.

HazelJS는 두 번째 오케스트레이션 제품 없이 네이티브 멀티 에이전트 라우팅(native multi-agent routing) 기능을 제공합니다. 전문가는 작게 유지되고, **createSupervisor**가 대시보드용 **라운드 메타데이터(round metadata)**를 노출하며, 동일한 모듈 스택은 RAG 및 Flow 기반 플레이북까지 확장됩니다.

패키지 링크 (Package links)

HazelJS 사이트 (HazelJS site)

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0