자동화 slecs

cron 자동화의 경보 노이즈를 줄여 팀 알림 피로 해소

목차

cron으로 운영하는 백그라운드 자동화 작업들에서 불필요한 경보와 로그가 쌓여 있었다. 보통 중요하지 않은 상황까지 알림을 보내다 보니 진짜 대응이 필요한 이벤트를 놓치거나 경보 피로(alert fatigue)가 생기는 악순환이 반복됐다. 이번에 두 가지 노이즈 소스를 걸러내는 작업을 했는데, 과정에서 느낀 자동화 시스템 설계의 핵심 원칙들을 정리해본다.

문제 1: 환경 의존 경로 하드코딩

auth-check 관련 두 스크립트(claude-auth-check.sh, codex-auth-check.sh)는 node 실행 경로를 절대 경로로 하드코딩해 두고 있었다. 로컬 개발 환경이나 서버 환경에 따라 node가 설치된 위치가 다르면 스크립트 자체가 깨지는 취약점이 있었다. 특히 여러 환경을 관리할 때는 이런 경로 문제가 부서마다 달라서 일관성 있게 대응하기 어렵다.

해결책은 간단했다. which nodecommand -v node 같은 동적 경로 탐색으로 스크립트가 런타임에 자동으로 node를 찾도록 바꿨다. 이렇게 하면 팀원들이 환경을 새로 세팅할 때마다 스크립트 경로를 손으로 수정해야 한다는 채널 노이즈를 없앨 수 있다.

# Before: 절대 경로 의존
NODE_PATH="/usr/local/bin/node"
$NODE_PATH script.js

# After: 자동 탐색
NODE_PATH=$(command -v node)
$NODE_PATH script.js

문제 2: 무분별한 Quota 실패 경보

health-monitor.py에서는 quota 도달 시까지 모든 상태를 같은 수준의 경보로 처리하고 있었다. 그런데 quota 실패는 사실 "리소스를 다 썼다"는 정상적인 신호일 수도 있다. 예를 들어 일일 API 호출 한도에 도달한 건 시스템 오류가 아니라 사용 패턴의 정상 범위다. 이걸 긴급 알림으로 보내면 온콜 엔지니어가 밤에 깨거나, 알림 채널이 정신없어진다.

내가 조정한 건 quota 실패는 로그에만 남기고 경보를 생략하도록 했다. 대시보드를 보는 팀원들이 필요하면 확인할 수 있지만, 부하를 주지는 않는 방식이다. 반대로 auth 실패나 헬스체크 timeout 같은 건 여전히 즉각적으로 알린다.

# Before: 모든 실패를 경보로
if quota_exceeded:
    send_alert("Quota exceeded", severity='high')

# After: quota는 기록만, 진짜 에러는 경보
if auth_failed:
    send_alert("Auth check failed", severity='high')
elif quota_exceeded:
    logger.warning("Quota limit reached")  # 경보 없음

회고: 신호 설계의 균형

자동화 시스템이 잘못 설계되면 세 가지 문제가 생긴다. 첫째, 신호가 너무 많으면 중요한 알림을 놓친다(false negative). 둘째, 신호가 너무 적으면 장애를 늦게 발견한다(false positive의 반대). 셋째, 신호와 잡음의 비율이 안 맞으면 팀의 응답 속도 자체가 떨어진다.

이번 작업에서 배운 교훈은:

  • 경로와 의존성은 하드코딩하지 말 것: 스크립트가 실행 환경에 강한 의존성을 가지면 팀원마다 설정이 달라진다. 자동 탐색이 기본이 되어야 한다.
  • 정상 상태와 장애 상태를 구분할 것: quota 도달은 의도한 정상이고, auth 실패는 장애다. 같은 로그 레벨로 처리하면 안 된다.
  • 경보 채널의 가치를 지킬 것: 경보를 너무 자주 보내면 그것도 노이즈가 된다. 팀원들이 경보를 무시하기 시작하면 진짜 위험이다.

변경 파일들이 작지만(scripts/ 3개 파일), 이 작업이 주는 효과는 크다. 이제 cron이 더 조용해지고, 팀이 실제 문제에만 집중할 수 있다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.