개발 slecs

크롤러 모니터링에 경고 단계 분기와 콘텐츠 건강도 점검 추가

목차

모니터링 코드에 분기 로직을 추가하고, 콘텐츠 건강도 점검 루틴을 붙이는 작업을 했다.

배경: 왜 "2단계 분기"가 필요했나

모니터링 대시보드에 있는 button strip — 보통 상태 요약을 빠르게 확인할 수 있는 버튼 그룹 컴포넌트 — 이 단일 조건으로만 동작하고 있었다. 처음엔 충분했다. 상태가 "정상이냐 아니냐" 두 가지로만 분기해도 운영하는 데 큰 문제가 없었으니까.

그런데 실제 운영을 해보면 중간 상태가 반드시 생긴다. "완전히 정상"도 아니고 "즉각 대응이 필요한 장애"도 아닌, 주의가 필요한 경고 구간. 이걸 단일 분기로 처리하면 두 가지 문제가 생긴다.

  • 경고 상태를 정상으로 묻어버리거나
  • 경고를 장애와 같은 수준으로 취급해서 알람 피로(alert fatigue)를 만들거나

둘 다 위험하다. 팀 입장에서 alert fatigue는 특히 골치다. 경고가 너무 자주 울리면 사람들이 알람을 무시하기 시작하고, 진짜 장애가 왔을 때 반응이 느려진다. 그래서 이번에 button strip에 2단계 분기를 명시적으로 구현했다.

작업 내용

변경이 들어간 파일은 두 개다.

파일 역할 이번 변경
check_content_health.py 콘텐츠 건강도 점검 메인 로직 일일 점검 루틴 신규 추가
crawler_common.py 크롤러 공통 유틸 button strip 2단계 분기 로직 반영

crawler_common.py는 공통 모듈이라 여기 건드리는 건 항상 조심스럽다. 영향 범위가 넓으니까. 이번엔 분기 로직만 추가하는 핀포인트 수정이라 다른 크롤러 흐름을 건드리지 않도록 신경 썼다. 조건 추가할 때 기존 단일 분기를 직접 수정하는 게 아니라, 상위에서 단계 값을 받아서 내려주는 방식으로 처리했다.

# 기존 단일 분기 패턴 (개념적 예시)
def get_strip_status(value):
    if value >= threshold:
        return "OK"
    return "FAIL"

# 2단계 분기 패턴 (개념적 예시)
def get_strip_status(value, warn_threshold, fail_threshold):
    if value >= warn_threshold:
        return "OK"
    if value >= fail_threshold:
        return "WARN"
    return "FAIL"

단순해 보이지만 이 구조로 바꾸면 임계값을 나중에 파라미터로 조정할 수 있어서 유지보수가 훨씬 편해진다. 하드코딩된 숫자가 로직 안에 박혀 있으면 나중에 팀원이 수정할 때 맥락을 다 파악해야 하는데, 파라미터로 빼두면 그냥 호출부에서 숫자만 바꾸면 된다.

check_content_health.py는 일일 본문 건강도 점검 루틴을 새로 만든 파일이다. "일일"이라는 게 포인트인데, 실시간 모니터링과 일일 배치 점검은 목적이 다르다. 실시간은 지금 당장 뭔가 터졌는지를 잡고, 일일 점검은 서서히 나빠지는 품질 저하를 잡는다. 콘텐츠 본문 쪽은 특히 후자가 중요하다. 크롤러가 멀쩡히 돌아도 실제 수집된 본문의 품질은 조금씩 나빠질 수 있거든 — 빈 본문, 이상하게 짧은 본문, 인코딩 깨짐 같은 게 쌓이는 식으로.

회고: 공통 모듈 수정할 때의 원칙

이번 작업을 하면서 다시 한번 느낀 건데, crawler_common.py 같은 공통 유틸은 수정 전에 반드시 "이 파일을 import하는 모듈이 몇 개냐"를 먼저 확인하는 습관이 필요하다. 팀 내에서도 이걸 놓쳐서 한 줄 수정이 엉뚱한 크롤러에 영향을 준 적이 있었다.

이번엔 분기 로직이 기존 인터페이스를 건드리지 않는 방향으로 설계했고, 기존 단일 분기를 쓰는 호출부는 그대로 동작하도록 기본값을 줬다. 이런 식의 하위 호환 유지는 공통 모듈 수정의 기본 예의라고 생각한다.

그리고 check_content_health.py처럼 점검 로직을 독립 파일로 분리한 건 잘한 선택이었다. 크롤러 실행 로직이랑 건강도 점검 로직이 한 파일에 뒤섞이면 나중에 테스트 짜기도 어렵고, 점검 주기나 기준을 바꿀 때 크롤러 코드까지 같이 열어야 하는 번거로움이 생긴다. 역할 단위로 파일을 나눠두면 팀원이 "건강도 로직만 고치고 싶어"라는 상황에서 바로 찾아갈 수 있다.

다음 단계는 이 2단계 분기 결과를 알람 채널에 연결하는 것. WARN은 조용히 슬랙 채널에만 올리고, FAIL은 on-call을 깨우는 식으로 분리할 계획이다.


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

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

댓글 0

첫 댓글 달아줘.