FDE Capstone: The Warehouse Got the Same Order Three Times
Quiz: From alerts to runbook check commands
한국어 원문으로 표시합니다.
Prometheus 텍스트 노출 형식에서 레이블 값 note="a, b}" 를 쉼표로 잘라 읽는 파서가 틀리는 이유로 가장 정확한 것은?
- 형식이 레이블 값을 반드시 URL 인코딩하도록 정해 두어서 쉼표가 원문에 나올 수 없기 때문
- 따옴표 안의 쉼표와 중괄호는 값의 일부이고, 이스케이프는 역슬래시·큰따옴표·줄바꿈 셋뿐이기 때문
- 레이블은 한 샘플에 하나만 허용되므로 쉼표가 나오면 그 줄 전체가 잘못된 줄이기 때문
- 레이블 값의 쉼표는 여러 값을 뜻하는 목록 구분자라서 배열로 풀어야 하기 때문
출고 큐 경보를 orders_queue_depth > 1000 대신 가장 오래 기다린 메시지의 나이로 거는 이유는?
- 깊이 지표는 gauge 라서 경보 규칙의 비교식에 쓸 수 없고 counter 만 비교할 수 있기 때문
- 나이 지표가 깊이보다 수집 주기가 짧아서 같은 장애를 더 빨리 잡아내기 때문
- 점심 몰림처럼 깊이만 크고 금방 빠지는 상황에서 페이지가 울리지 않고, 사용자가 겪는 지연에 더 가깝기 때문
- 나이 지표는 서비스가 죽어도 마지막 값을 유지해서 못 긁음까지 함께 잡아 주기 때문
필수 지표 하나가 응답에서 통째로 사라졌다. orders_disk_free_bytes / orders_disk_size_bytes < 0.1 규칙만 있다면 어떻게 되나?
- 비교할 샘플이 없어 결과가 비고 경보가 울리지 않는다. 그래서 absent 같은 별도 규칙이 필요하다
- 없는 지표는 0 으로 계산되므로 비율이 0 이 되어 디스크 경보가 곧바로 울린다
- Prometheus 가 규칙 평가를 거부하고 규칙 파일 전체를 다시 읽을 때까지 모든 경보가 멈춘다
- 지표가 사라지면 up 이 자동으로 0 이 되므로 대상 다운 경보가 대신 울린다
런북 확인 줄을 df -h /var/lib/orders | awk 'NR==2 {exit ($5+0 > 90)}' 로 적었다. 당번 컨테이너에 그 경로가 없을 때 이 줄이 위험한 이유는?
- awk 가 df 의 오류 메시지를 숫자로 읽어 90 을 넘는 값으로 판단하므로 늘 장애로 나온다
- df 가 경로를 찾지 못하면 셸이 파이프 전체를 중단하고 종료 코드 127 을 돌려준다
- df 는 원격 서비스의 디스크를 보는 도구라서 네트워크가 막힌 곳에서는 시간 초과로 멈춘다
- 파이프의 종료 코드가 마지막 awk 의 것이라 df 가 실패해도 0 이 되어 정상처럼 보인다
확인 명령을 5초 제한으로 돌리는 점검기가 subprocess.run([...], timeout=5) 만 썼는데 30초 멈추는 명령에서 함께 멈췄다. 가장 알맞은 고침은?
- timeout 값을 1초로 줄여 bash 가 더 빨리 죽게 한다
- 새 세션(start_new_session)으로 띄우고 시간이 지나면 os.killpg 로 프로세스 그룹째 끊는다
- stdout 을 버리지 말고 capture_output 으로 받아 파이프가 차지 않게 한다
- 명령 앞에 nohup 을 붙여 부모와 분리한 뒤 종료를 기다리지 않는다
이 실습의 런북 규칙에서 확인 명령이 '정상이면 0, 그 장애면 0 이 아닌 값' 으로 끝나게 한 까닭으로 가장 알맞은 것은?
- 당번이 출력 모양을 해석하지 않아도 되고, 같은 줄을 훈련 스크립트가 돌려 장애 확증에 쓸 수 있기 때문
- Prometheus 경보 규칙의 annotations 가 종료 코드만 받아들이도록 정해져 있기 때문
- 종료 코드로 끝나는 명령은 자동으로 시간 제한이 걸려 새벽에 멈추는 일이 없기 때문
- 출력을 남기지 않아야 고객 정보가 당번 터미널에 찍히지 않아 보안 감사를 통과하기 때문