자동화 파이프라인9 분 읽기

내 대시보드는 20일 동안 초록이었다 — 검색 유입은 이미 99% 사라진 뒤였다

하루 200이던 검색 노출이 2로 떨어졌는데 감시는 한 번도 울리지 않았다. 28일 롤링 총계에 '하루 -50%' 임계를 걸어둔 탓이다. 롤링 총계는 사건을 지우도록 설계된 값이다.

#monitoring#alerting#metrics#seo#search-console
개념 도식: 28일 롤링 총계가 하루짜리 절벽을 가리는 구조
글 내용을 요약한 개념 도식.

8월 19일과 20일 사이에 제 사이트들의 구글 검색 노출이 하루 약 200건에서 약 2건으로 떨어졌습니다. 99%가 사라진 겁니다.

그 사실을 20일 뒤에 알았습니다. 그동안 관제 대시보드는 계속 초록이었고, 수집 작업은 매일 새벽 1시에 정확히 돌았고, 로그 파일도 매일 갱신됐습니다. 알림은 한 번도 울리지 않았습니다.

여러분의 감시 지표는 사건이 일어났을 때 실제로 모양이 변합니까?

임계는 있었다

감시가 없었던 게 아닙니다. 이런 가드가 걸려 있었습니다.

직전 스냅샷 대비 총 노출이 반토막 나면 경고한다.

합리적으로 보입니다. 검색 트래픽이 하루 만에 절반이 되는 일은 드무니까요. 실제로 이 가드는 과거에 한 번 제 역할을 했습니다. 속성 설정이 바뀌어 숫자가 3,415에서 88로 보였을 때 "트래픽 변화로 읽기 전에 계측부터 확인하라"고 잡아줬습니다.

문제는 그 가드가 보는 값이 28일 롤링 총계였다는 겁니다.

롤링 총계는 저역통과 필터다

실제 숫자를 보겠습니다. 절벽은 하루 만에 일어났는데, 28일 총계는 이렇게 움직였습니다.

  • 8월 21일: 4,653
  • 8월 25일: 4,360
  • 8월 30일: 3,777
  • 9월 5일: 2,722
  • 9월 8일: 2,336

18일에 걸쳐 절반으로 내려왔습니다. 하루 최대 낙폭은 8%였습니다. -50% 임계는 단 한 번도 닿지 않았습니다.

당연합니다. 28일 창은 매일 하루치만 갈아끼웁니다. 사건이 하루에 일어나도 총계가 그걸 반영하는 데는 28일이 걸립니다. 롤링 총계는 정의상 노이즈를 뭉개도록 만든 값이고, 사건도 노이즈와 똑같이 뭉갭니다.

사건을 지우도록 설계된 값 위에 사건 감지를 걸 수는 없습니다.

두 번째 착시: "제때 돌았다"

대시보드가 초록이었던 두 번째 이유는 더 단순합니다. 그 행은 수집 작업의 로그 파일 신선도를 보고 있었습니다.

작업은 매일 정상적으로 돌았습니다. API도 잘 붙었고 스냅샷도 잘 저장됐습니다. 실패한 게 하나도 없습니다. 다만 그 작업이 가져오는 숫자가 죽어 있었을 뿐입니다.

"제때 돌았는가"와 "결과가 살아 있는가"는 다른 질문입니다. 한 행에 섞어두면 앞의 답이 뒤의 답을 덮습니다.

당신이라면 어떻게 고치겠습니까?

임계를 -50%에서 -20%로 낮추겠습니까? 그러면 평상시 등락에 매일 울립니다. 매일 울리는 알림은 꺼진 알림과 같습니다.

창을 28일에서 7일로 줄이겠습니까? 방향은 맞지만 그것만으로는 부족합니다. 이유는 아래에 있습니다.

고친 방법 — 조건을 둘로 나눈다

총계 대신 일별 계열을 보고, 판정을 두 개로 나눴습니다.

급락 — 최근 7일 대 직전 7일. 40% 미만이면 발화. 지금 무너지는 중인가를 봅니다.

침체 — 최근 7일 대 90일 내 최고 7일. 40% 미만이면 발화. 이미 무너진 채로 있는가를 봅니다.

두 번째 조건이 핵심입니다. 급락만 넣고 오늘 데이터로 돌렸더니 **"정상"**이 나왔습니다. 붕괴가 2주 전이라 비교하는 두 창이 모두 바닥이었거든요. 그게 바로 제가 고치려던 그림입니다.

침체 조건을 넣으니 이렇게 나옵니다.

검색유입 침체 — 최근 7일 노출 21 / 90일 최고 7일 1,783 (1%)

그리고 분모가 작으면 판정하지 않습니다. 최고 7일이 20건 미만이면 비율은 잡음이라 "판정 불가"로 남깁니다. 판정 불가를 정상으로 적는 순간 같은 실수가 반복됩니다.

마지막으로 대시보드에서 행을 나눴습니다. "수집이 돌았는가"와 "유입이 살아 있는가"는 이제 별개 행입니다.

자가진단 세 가지

여러분의 감시에 이 셋을 대보세요.

  1. 지표가 롤링 합계·평균인가? 그렇다면 그 위의 임계는 하루짜리 사건을 못 봅니다. 원계열을 따로 두세요.
  2. "이미 무너진 상태"를 잡는 조건이 있는가? 변화율만 보면 붕괴 후 며칠 뒤 자동으로 초록이 됩니다.
  3. 작업 성공과 결과 생존이 같은 행에 있는가? 섞여 있으면 멀쩡히 도는 작업의 죽은 산출물을 영원히 못 봅니다.

솔직한 부분

절벽의 원인 자체는 제 잘못이 아니었습니다. 구글이 8월 18일부터 21일까지 스팸 업데이트를 롤아웃했고, 제 사이트의 절벽 시점이 그 구간 안에 정확히 들어갑니다. robots.txt도 정상이고, 사이트맵도 계속 수신되고, URL 검사 API도 크롤 성공을 보고합니다. 손에 쥔 레버가 없는 종류의 사건입니다.

제 잘못은 그걸 20일 동안 몰랐다는 것입니다. 알았다면 다른 채널로 더 빨리 옮겼을 겁니다. 실제로 같은 기간에 네이버 유입은 하루 1에서 46으로 늘고 있었는데, 저는 그 사실도 늦게 알았습니다.

감시의 값어치는 사건을 막는 데 있지 않습니다. 사건이 일어났다는 걸 제때 아는 것에 있습니다. 지표가 사건을 뭉개면 그 값어치가 통째로 사라집니다.

지금 여러분의 알림 규칙 하나만 열어보세요. 그 임계가 보는 값이 롤링 합계인가요?


관련 글: 앱 5개를 색인에서 날릴 뻔한 Next.js 설정 한 줄 · 내 게이트는 한 사람을 네 번 셌다

관련 글