LabHub
배우기 러닝패스 코스

관측성 · 사고 조사와 사후 분석 · 이론

조사에서 먼저 하는 일은 시간을 못박는 것이다

LabHub 에서 이어서 보기

한 줄 요약

조사에서 먼저 하는 일은 원인을 찾는 것이 아니라 시간을 못박는 것이다. 시작과 끝이 정해져야 영향 범위를 셀 수 있고, 그래야 가설마다 '자료에 무엇이 보여야 하는가' 를 적을 수 있다.

왜 이게 필요했나

한 번은 결제 오류 신고를 받고 네 사람이 모였다. 한 사람은 "오늘 아침 배포" 를, 한 사람은 "특정 고객사 트래픽 급증" 을, 한 사람은 "데이터베이스 연결 고갈" 을 말했다. 셋 다 그럴듯했고 셋 다 조사에 30분씩 걸리는 이야기였다. 두 시간 뒤 원인은 넷째 후보였고, 그때까지 아무도 사고가 언제 시작됐는지 를 자료로 확인하지 않았다.

시작 시각을 먼저 못박았다면 그 자리에서 둘이 지워졌을 것이다. 배포는 사고가 시작되고 40분 뒤에 나갔고, 문제의 고객사 트래픽은 사고 내내 평소와 같았다. 두 사실 모두 조회 한 번이면 나왔다. 순서를 바꾸는 것만으로 두 사람의 30분이 남는다.

여기서 중요한 것은 기억이 아니라 기록이다. 사람의 기억은 "10시쯤부터였던 것 같다" 라고 말하지만 자료는 "오류 비율이 0.05 를 넘은 첫 순간" 을 정확히 말한다. 조사의 첫 줄은 언제나 그 조건식과 그 시각이어야 한다.

어떻게 동작하나

순서는 여섯 단계다.

하나, 시각을 못박는다. 무엇을 '사고' 로 볼지 조건식을 먼저 고정한다. 예를 들어 "5분 창에서 5xx 비율이 5%를 넘음". 그다음 범위 조회로 그 조건이 처음 참이 된 시각과 마지막으로 참이었던 시각을 찾는다. 이때 절대 시각으로 적지 않는다 — 시간대와 서머타임이 회고를 망친다. "지금으로부터 몇 분 전" 으로 적어 두면 나중에 누구의 화면에서도 같은 구간을 다시 그릴 수 있다.

둘, 범위를 센다. 몇 건이 실패했는가, 어느 핸들러가 얼마를 차지했는가. 여기서 흔한 함정은 창을 짧게 자르는 것이다. 사고 구간을 모자라게 덮으면 실패 건수가 통째로 빠진다. 조건이 참이었던 분들만 골라 그 분의 증가량을 더하면 창 길이에 흔들리지 않는다.

셋, 가설과 예측을 먼저 적는다. 가설만 적으면 나중에 자료를 보고 해석을 맞춰 버리게 된다. "이 가설이 참이라면 어느 지표가 어떻게 보여야 하는가" 를 먼저 적어 두면, 자료가 그 모양이 아닐 때 가설을 버릴 수 있다.

넷, 지운다. 확증보다 반증이 싸다. 한 핸들러의 결함이라면 그 핸들러만 오류율이 튀어야 하는데 네 핸들러가 전부 같은 비율로 튄다면 그 가설은 끝이다. 트래픽 급증이라면 요청률이 올라야 하는데 사고 구간의 요청률이 직전 한 시간과 6% 차이라면 그 가설도 끝이다.

다섯, 남은 것을 다른 신호로 확증한다. 지운 뒤 남은 하나를, 처음 조건식과 다른 지표로 확인한다. 같은 지표를 다시 보는 것은 확증이 아니라 같은 말의 반복이다. 오류율로 사고를 정의했다면 확증은 큐 깊이나 포화도처럼 오류율과 독립으로 움직이는 신호에서 찾아야 하고, 그 신호가 같은 구간에서 같은 모양으로 움직였는지를 분 단위로 겹쳐 봐야 한다.

여섯, 기계가 읽을 수 있는 연표를 남긴다. Google SRE Book 의 [사후 분석 문화](https://sre.google/sre-book/postmortem-culture/) 장이 강조하는 것도 '무엇을 남기는가' 다. 사건마다 상대 시각과 근거 지표를 한 줄씩. 사람이 읽는 문장은 나중에 통계로 못 만들지만, 표는 만들 수 있다.

현장에서 만나는 모습

[효과적인 장애 조사](https://sre.google/sre-book/effective-troubleshooting/) 장이 되풀이해 말하는 것이 이 순서다. 그런데 사후 분석에서 가장 자주 빠지는 칸은 원인이 아니라 탐지 지연 이다. 영향이 시작된 시각과 경보가 울린 시각의 차이는 거의 항상 기록되지 않는다. 그런데 이 숫자가 다음 분기에 무엇을 고칠지를 정한다. 5분 창에 10분 지속 조건을 걸어 두면 탐지에 11분이 걸리고, 사고가 20분짜리였다면 절반이 지난 뒤에야 사람이 깨어난 것이다.

또 하나는 관계없는 사건을 같은 연표에 올리는 일이다. 같은 12시간 안에 꼬리 지연만 튀는 구간이 따로 있는데, 오류 사고와 시간이 겹치지 않는데도 회고 문서에 함께 적히곤 한다. 연표에 올릴 때는 각 줄에 근거 지표를 함께 적어 두어야 나중에 둘이 다른 사건이라는 것이 남는다.

세 번째는 가설의 개수를 늘리는 쪽으로 회의가 흘러가는 것이다. 후보가 여섯 개가 되면 사람이 여섯 갈래로 흩어지고, 각자 다른 지표를 열어 서로 다른 시간 축을 본다. 조사에서 필요한 것은 후보를 늘리는 능력이 아니라 싸게 지우는 순서다. 예측이 가장 구체적인 가설부터 확인하면 조회 한 번에 하나씩 떨어져 나가고, 남는 후보가 둘 이하가 되면 그때부터는 여러 사람이 붙어도 겹치지 않는다. 지우는 데 쓴 쿼리와 그 결과를 그대로 붙여 두는 것이 뒤에 오는 사람에게는 결론보다 값이 크다.

마지막은 조사 과정 자체를 남기지 않는 것이다. 지운 가설과 지운 근거를 적어 두지 않으면, 다음 사고에서 같은 가설로 또 30분을 쓴다. 지운 기록은 원인 기록만큼 값이 있다.

다음 실습에서 할 것

파드의 Prometheus 12시간치에 들어 있는 한 번의 사고를 순서대로 조사한다. 조건식을 고정해 시작과 끝을 상대 시각으로 못박고, 조건이 참이었던 분들만 골라 실패 건수와 핸들러별 분포를 센다. 가설 세 개와 각 가설의 예측을 먼저 적은 뒤 조회로 둘을 지우고, 남은 하나를 다른 지표로 확증한다. 그다음 기계가 읽는 연표와 사후 분석 자료를 만들고, 마지막으로 지금보다 빨리 잡는 탐지 규칙을 써서 얼마나 빨라지는지, 대신 헛된 호출이 생기지는 않는지를 같은 12시간 자료로 검증한다.