알림이 한 채널에 섞이던 문제, 등급 라우터로 나눈 기록
자동화 스크립트 알림이 한 채널에 섞여 오던 문제를, 상태 없는 포맷터 하나로 등급별 채널에 나눠 보낸 1인 개발 빌드로그예요.
자동화 스크립트가 늘어날수록 알림은 전부 같은 채널로 들어왔어요. 블로그 초안이 나왔다는 소식과 발행 성공 기록, 실패 경보가 한 줄로 섞이니까 정작 손을 대야 하는 메시지가 묻혔어요. 10월 13일에 커밋 2건으로 이걸 정리했어요.
상태 없는 포맷터부터
첫 커밋에서는 파일 3개를 새로 올렸어요. 알림을 카드로 만들고 채널을 고르는 스크립트, 라우팅 규칙 문서, 테스트예요. 상태를 들고 있지 않게 만들었어요. 이벤트 하나를 받으면 카드 문자열과 채널 이름만 돌려주고 끝나요. 기억하는 게 없으니 어느 스크립트에서 불러도 결과가 같아요.
직접 만들어 보니 제일 오래 고민한 건 "할 일" 칸이었어요. 예전 알림은 무슨 일이 났는지만 말하고 끝나서, 다 읽은 뒤에 뭘 해야 할지 따로 생각해야 했어요. 이번에는 할 일과 기한을 필수 필드로 넣었고, 비어 있으면 렌더 단계에서 멈춰요. 내부 용어를 바꿔 주는 치환표도 같이 넣었어요. 혼자 쓰는 운영 은어가 카드에 그대로 찍히면 나중에 다시 읽을 때 해석부터 해야 하더라고요.
등급 6가지, 채널 3개
등급은 crit·now·today·approval·record·recovered로 나눴어요. 앞의 셋은 경보 채널로, 승인 요청은 승인 채널로, 기록은 기록 채널로 가요. 복구 소식에는 전용 채널이 없어요. 원래 등급이 가던 채널로 돌아가요. 문제가 터진 자리에서 복구까지 봐야 흐름이 이어지니까요.
def channel_for(event):
if event['severity'] != 'recovered':
return CHANNELS[event['severity']]
original = event.get('original_severity')
if original not in CHANNELS:
raise ValueError('recovered event requires original_severity')
return CHANNELS[original]테스트해 보면 원래 등급 없이 복구 이벤트만 넣었을 때 기본 채널로 흘러가지 않고 바로 에러가 나요. 갈 곳을 모르는 알림을 아무 데나 던지면 그게 또 묻히는 알림이 돼요.
기존 스크립트 5개 옮기기
두 번째 커밋에서는 이미 돌고 있던 스크립트 5개가 새 라우터를 쓰도록 바꿨어요. 블로그 초안 생성·발행, 밤 리뷰, 포트 노출 점검 같은 작업이에요. 성공 소식은 기록 채널로 내리고 실패 경보만 경보 채널에 남겼어요. 적용해 봤더니 호출부를 고치는 것보다 "이 소식을 지금 봐야 하나"를 하나씩 정하는 데 시간이 더 들었어요.
옮기는 동안에는 --dry-run으로 돌려 보니 네트워크를 타지 않고 채널 이름과 카드 본문만 터미널에 찍혀서 확인하기 편했어요. 테스트에서도 이 모드만 쓰도록 문서에 적어 뒀어요.
호출하는 셸 스크립트 쪽에는 알림이 실패해도 멈추지 않게 || true가 붙은 곳이 있어요. 이러면 전송 실패가 흔적 없이 사라져요. 그래서 실패하면 0이 아닌 종료 코드를 내고, 실패 기록 파일에 출처·등급·채널·제목을 한 줄씩 남기게 했어요. 웹훅 주소는 기록하지 않아요.
남겨 둔 것
사흘 앞선 10월 10일에는 플랜비(농구 동호회 운영 매니저)에서 미납 회비 알림이 앱 안에 실제로 도착하게 손봤어요. 둘 다 결국 같은 질문으로 돌아왔어요. 이 알림을 받은 사람이 다음에 뭘 하면 되는가.
- 상태 없는 포맷터
- 등급별 채널 분리
- 실패 흔적 남기기
아침에 몰아 보내기와 24시간 리마인드는 이번 구현에 넣지 않았어요. 따로 설계하려고 남겨 뒀어요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.