[태그:] 오탐

  • 경보가 늑대 소년이 될 때 — 오탐을 만드는 두 가지 설계 실수

    경보가 늑대 소년이 될 때 — 오탐을 만드는 두 가지 설계 실수

    자동화를 어느 정도 굴리기 시작하면 감시를 붙이게 된다. 뭔가 잘못되면 알려 달라는 것이다. 그렇게 붙인 경보가 어느 날 울린다. 가 보면 아무 문제가 없다. 그런 일이 몇 번 이어지면 그다음부터는 그 경보를 보는 눈이 달라진다. 이 글은 우리 기록에서 그런 경보 둘을 열어 본 이야기다.

    논지는 한 줄이다. 경보는 자기가 잰 것을 정직하게 말한다. 오탐은 그 값을 다른 것의 증거로 쓸 때 생긴다. 우리가 연 두 경보는 둘 다 잰 값 자체는 맞았다. 어긋난 자리는 그 값에서 어떤 결론으로 건너뛰는 칸이었고, 그 칸을 설계한 것은 경보가 아니라 우리다.

    제목에 쓴 비유부터 밝혀 둔다. 늑대 소년은 이솝 우화에서 온 널리 쓰이는 비유이고, 헛울림이 이어지면 사람이 경보를 읽지 않게 된다는 뜻으로 쓰인다. 우리는 그 우려를 전제로 설계를 고쳤다. 다만 우리 기록에는 그 우려가 맞는지 측정한 값이 없다. 그러니 이 글은 오탐이 사람의 주의를 얼마나 떨어뜨리는지에 대해 아무 수치도 말하지 않는다 — 비유는 제목까지이고, 본문은 우리가 실제로 연 두 경보의 안쪽이다.

    이 글에서 쓰는 말 몇 개를 풀어 둔다. 경보는 조건을 만족하면 사람에게 알리도록 미리 걸어 둔 장치다. 임계는 그 조건에서 넘으면 알리기로 정한 값이다. 타임아웃은 정해진 시간 안에 끝나지 않으면 기다리기를 중단하도록 내가 정한 조건이다. 반환값은 명령이 끝나면서 남기는 숫자이고, 0 이면 정상 종료라는 뜻으로 쓰인다. 등급은 경보를 정상·경고 같은 칸으로 나눈 것이다. 처방은 그 경보에 딸려 나오는 조치 안내다.

    앞선 편과의 경계. 도구가 울리지 않고 조용히 실패한 경우들은 앞 편에 적었고, 이 글은 반대쪽인 잘못 울린 쪽이다. 그리고 무언가를 실제로 바꿔 놓은 사고는 연습 모드를 다룬 편에 있다. 이 글의 두 사례는 아무것도 바꾸지 않았다 — 사람을 다른 곳으로 보냈을 뿐이다.

    경보가 잰 값과 말한 결론이 어긋나는 구조를 칸으로 나눠 그린 도식. 첫째 칸은 잰 값으로, 경보가 실제로 측정한 것만 적는 자리다. 응답이 2초 안에 오지 않았다는 것, 예약이 정한 수명 30분을 넘겼다는 것, 자원 값을 읽지 못했다는 것이 적혀 있다. 둘째 칸은 말한 결론으로, 그 값에서 건너뛴 판정이다. 조회가 실패했다, 팀이 뜨지 않았다, 자원이 경고 수준이다가 적혀 있다. 셋째 칸은 처방으로, 그 결론에 딸려 나온 조치다. 바이러스 검사 격리를 복구하라, 실패 항목으로 결재 목록에 올려라, 경고 등급으로 표시하라가 적혀 있다. 넷째 칸은 어긋난 자리로, 잰 값과 결론 사이에 아무도 검사하지 않는 한 칸이 있다는 것과 그 칸을 채운 것은 경보가 아니라 설계라는 것이 적혀 있다. 아래 칸은 상태 칸을 몇 개로 두느냐의 대비다. 칸이 둘일 때는 정상과 위험뿐이라 측정 실패가 위험 쪽으로 접히고, 칸이 셋일 때는 정상과 위험과 측정 불능이 갈라져 못 쟀다는 사실이 그대로 남는다고 적었다. 그 아래에 우리 경보 여섯 건은 임계를 넘은 값이 0건이고 값이 비어 있으며 오류 목록에 getloadavg 가 찍혀 있었다는 것과, getloadavg 는 윈도우에 없는 함수여서 나쁜 값이 아니라 없는 값이라는 것을 적었다. 맨 아래 두 줄은 한정이다. 사례 하나는 관측 한 건이고 그 통지 문안 자체는 틀리지 않았다는 것, 그리고 오탐이 사람의 주의를 얼마나 떨어뜨리는지는 우리가 재지 않았다는 것이다.
    경보가 나쁘다는 그림이 아니다. 잰 값과 말한 결론 사이에 검사하지 않은 칸이 있다는 것과, 상태 칸을 둘로 두었을 때 측정 실패가 어디로 접히는지를 그린 것이다. 아래 두 줄은 한정이다.

    경보가 가리킨 것과 실제

    1. 경보는 잰 것을 말했고 결론으로 건너뛴 것은 우리였다

    증상. 경보가 울렸다. 가 보니 경보가 가리킨 것은 멀쩡했다. 그런데 경보 문장을 다시 읽어 보면 거기 적힌 값은 틀리지 않았다. 값도 맞고 대상도 멀쩡한, 앞뒤가 안 맞아 보이는 상태다.

    여기서 갈리는 두 가지 해석. 하나는 경보가 잘못 만들어졌다고 보는 것이다. 다른 하나는 내가 못 본 문제가 어딘가 있다고 보는 것이다. 우리 기록에서 열어 본 두 경보는 둘 다 아니었다. 경보는 자기가 잰 값을 그대로 말했고, 그 값이 가리키는 대상도 실제로 그 상태였다. 어긋난 것은 그 값에서 결론으로 건너뛰는 한 칸이었다.

    그 한 칸을 갈라 적으면 이렇게 된다. 경보 하나에는 서로 다른 세 가지가 붙어 있다.

    
    잰 값        경보가 실제로 측정한 것
    말한 결론    그 값에서 내린 판정
    처방         그 판정에 딸려 나오는 조치
    

    이 셋은 같은 자리에서 나오지 않는다. 잰 값은 측정이 정하고, 말한 결론과 처방은 설계가 미리 정해 둔 것이다. 경보를 붙일 때 우리는 이 셋을 한 덩어리로 붙인다. 그래서 잰 값이 맞으면 결론도 맞다고 읽게 된다. 우리가 연 두 경보는 그 지점에서 갈렸다.

    우리가 내린 결론. 오탐은 측정이 틀려서 생기지 않았다. 측정은 맞았다. 오탐은 그 값을 다른 것의 증거로 쓰기로 미리 정해 둔 자리에서 생겼다. 그 자리를 정한 것은 경보가 아니라 우리다.

    그래서 이 글이 하지 않는 말을 먼저 밝혀 둔다. 이 글은 경보를 붙이지 말라는 이야기가 아니고, 경보를 만든 쪽을 탓하는 이야기도 아니다. 우리는 감시를 계속 붙인다. 이 글이 보는 자리는 잰 값과 말한 결론 사이다. 2번과 3번이 첫째 형태이고, 4번이 그 형태의 다른 얼굴이며, 5번이 둘째 형태다. 6번은 우리가 세지 않은 범위다.

    확인 방법. 자기 경보를 하나 골라 위 세 줄로 갈라 적어 보라. 잰 값 칸에는 측정한 숫자만 적어야 하고, 판단이 섞여 들어가면 그것은 이미 결론 칸이다. 세 줄로 갈라 적을 수 없는 경보는 결론이 측정 안에 숨어 있는 것이다.

    2. 늦었다와 고장났다는 다른 사실이다

    이 항목은 우리가 실제로 겪은 것이고, 실측 값이 남아 있다.

    설계. 자동으로 도는 점검 하나가 2초 타임아웃으로 어떤 조회를 건다. 2초 안에 끝나지 않으면 조회 실패로 단정하고, 그 뒤에 바이러스 검사에 격리된 파일을 복구하라는 처방을 붙였다.

    실측. 같은 조회를 10회 재 봤다. 걸린 시간은 1.614초에서 6.948초 사이였고 중앙값은 2.738초였다. 2초를 넘긴 것이 10회 중 5회다. 그리고 반환값은 10회 전부 0이었다.

    
    실측 10회
      걸린 시간   1.614초 ~ 6.948초   (중앙값 2.738초)
      2초 초과    5 / 10
      반환값 0    10 / 10             조회는 열 번 다 성공했다
    

    이 표가 말하는 것. 조회는 열 번 다 성공했다. 못 지킨 것은 2초라는 조건뿐이다. 그런데 그 조건을 못 지킨 것을 조회 실패로 적었다. 조회 실패라고 적히는 순간, 그다음에 오는 것은 왜 조회가 실패했는가를 묻는 처방이다.

    타임아웃 반환값의 뜻을 그대로 읽으면 이렇다. 시간을 넘겨 중단시켰다는 것은 내가 기다리기를 그만뒀다는 뜻이다. 대상이 응답할 수 없는 상태였다는 뜻이 아니다. 앞쪽은 내 조건에 대한 사실이고 뒤쪽은 대상에 대한 사실인데, 같은 자리에 적히면 구별되지 않는다.

    초보용으로 옮기면 이렇다. 늦었다와 고장났다는 다른 사실이다. 타임아웃은 내가 정한 조건이고 고장은 대상의 상태다. 조건을 대상의 상태로 바꿔 읽으면 이상한 일이 생긴다 — 조건을 조일수록 고장이 늘어난다. 2초를 1초로 줄이면 그 표에서 실패는 10회 중 더 많은 줄이 된다. 대상은 아무것도 달라지지 않았는데 말이다.

    이 형태가 눈에 띄지 않는 이유. 임계값은 처음 붙일 때 한 번 정하고 그 뒤로는 잘 보지 않는다. 2초는 누군가 그때 적당하다고 본 값이고, 그 값이 측정 대상의 실제 분포와 맞는지는 따로 재야 아는 것이다. 우리 경우 실제 분포의 중앙값이 그 임계보다 위에 있었다. 즉 그 조건은 절반 정도가 넘도록 되어 있는 조건이었고, 그 상태로 몇 달을 지났다.

    이 실측의 범위도 함께 적어 둔다. 우리가 잰 것은 10회다. 그 열 번에서 나온 분포가 다른 시점에도 같다고 말할 수 없고, 우리는 다른 시점을 재지 않았다. 이 절이 말하는 것은 좁다 — 우리가 잰 열 번에서, 조건을 넘긴 것과 조회가 실패한 것이 서로 다른 줄이었다. 열 번 모두 반환값이 0 이었으므로 이 열 번 안에서는 그 둘이 겹친 줄이 없다.

    확인 방법. 타임아웃에서 나온 경보를 만나면 그 임계값만 늘려서 같은 것을 다시 재 보라. 경보가 사라지면 그 경보가 잰 것은 대상이 아니라 내 조건이다. 그리고 반환값을 남기는 도구라면 중단된 것인지 대상이 오류를 냈는지가 그 값에 갈려 있으니, 경보 문장 말고 그 숫자를 보라.

    3. 결론이 어긋나면 그 처방은 증상과 무관한 자리를 고치라고 한다

    이 항목은 앞 절과 같은 사례의 뒷부분이고, 대가가 숫자로 남아 있다.

    붙어 있던 처방. 조회 실패로 단정한 뒤에 나온 안내는 바이러스 검사에 격리된 파일을 복구하라는 것이었다. 이 처방이 맞으려면 파일이 격리됐다는 사실이 있어야 한다. 그런데 그 경보가 잰 것은 응답이 2초 안에 오지 않았다는 것뿐이다. 격리 여부는 재지 않았다.

    여기가 이 절의 요점이다. 처방은 잰 값에서 나오지 않는다. 결론에서 나온다. 그래서 결론이 한 칸 어긋나 있으면 처방은 그 어긋난 만큼 증상과 무관한 자리를 가리킨다. 우리 경우 그 처방이 가리킨 자리는 그 경보가 재지 않은 자리였다.

    대가. 그 오진은 한 번으로 끝나지 않았다. 점검이 주기적으로 도니까 같은 항목이 계속 올라왔다. 우리 원장에 남은 것은 고위험으로 분류된 결재 항목 9건이고, 올라온 간격은 1시간 35분에서 40분 사이다.

    
    원장에 남은 것
      항목 9건          전부 같은 오진에서 나왔다
      간격 1시간 35~40분  점검 주기가 도는 동안 계속 쌓였다
      분류 고위험        사람이 결재해야 하는 칸에 올라왔다
    

    이 숫자가 말하는 것과 말하지 않는 것. 말하는 것은 9건이 쌓였다는 것과 그 간격이다. 말하지 않는 것은 그 9건이 사람에게 어떤 영향을 줬는지다. 우리는 그것을 재지 않았다. 그래서 이 절에 적을 수 있는 것은 목록이 그만큼 채워졌다는 사실까지다.

    한 가지는 그 숫자에서 바로 읽힌다. 이 항목들은 스스로 멈추지 않는다. 원인을 고치기 전까지 점검이 도는 만큼 계속 올라온다. 경보를 붙일 때 우리가 생각하는 그림은 문제가 있을 때 한 번 울리는 것인데, 조건 위반을 고장으로 읽는 경보는 조건이 계속 위반되는 동안 계속 울린다.

    고위험이라는 분류에 대해서도 적어 둔다. 그 9건은 사람이 결재해야 하는 칸에 올라갔다. 자동으로 처리되지 않고 누가 보고 판단해야 하는 자리로 분류됐다는 뜻이다. 분류 자체는 설계대로 동작한 것이다 — 격리 복구는 실제로 사람이 판단할 일이니까. 다만 그 판단이 필요한 상황이 아니었다. 분류는 결론을 믿고 붙는 것이라, 결론이 어긋나 있으면 분류도 함께 어긋난다.

    초보용으로 옮기면 이렇다. 경보에 처방이 붙어 있으면 한 번 물어보라 — 이 처방이 고치려는 것을 이 경보가 쟀는가. 재지 않았다면 그 처방은 추측이다. 추측이 나쁜 것은 아니지만, 추측이 측정 결과와 같은 칸에 적혀 있으면 읽는 사람은 그것을 측정으로 읽는다.

    확인 방법. 반복해서 올라오는 경보 항목이 있으면 몇 건이 쌓였고 간격이 얼마인지 세어 보라. 간격이 점검 주기와 같으면 그 항목은 사건이 아니라 상태를 보고 있는 것이다. 사건은 한 번 나고 상태는 고쳐질 때까지 계속 난다.

    4. 문장은 참이었는데 제목과 등급이 다른 결론으로 보냈다

    이 항목은 2026년 9월 9일 밤에 있었던 관측 한 건이다. 우리 기록에서 이 형태로 확인한 것은 이 한 건이고, 여러 번 있었던 일로 적지 않는다.

    관측. 감시 절차가 통지를 보냈다. 내용은 팀이 이 선언으로 뜨지 않았고, 정한 수명 30분을 넘겼다는 것이었다. 같은 내용이 사람이 결재하는 목록에 실패 항목으로 올라왔다.

    그 시점의 실제 상태. 팀은 떠 있었다. 자리 목록을 실측해 보니 우리가 띄우기로 한 자리 넷이 전부 살아 있었다. 다만 그 기동은 그 예약이 한 것이 아니었다. 설치 경로에 결함이 있어서 사람이 손으로 고쳐 다시 띄운 것이었다.

    그래서 어떻게 된 것인가. 통지가 잰 것은 예약의 수명이었다. 그 예약이 정한 시간 안에 자기 일을 끝냈는지를 본 것이다. 그런데 말한 것은 팀의 생존이었다. 이 둘은 다른 사실이다. 예약이 실패해도 팀은 떠 있을 수 있고, 우리 경우가 그랬다.

    
    잰 것      이 예약이 정한 수명 30분 안에 끝났는가    ->  아니오
    말한 것    팀이 떠 있는가                            ->  아니오라고 읽혔다
    실제       자리 넷 생존 (사람이 손으로 띄웠다)       ->  예
    

    여기서 한정을 분명히 적어 둔다. 통지 문안 자체는 틀리지 않았다. 문안에 적힌 이 선언으로는 뜨지 않았다는 문장은 사실이다. 팀을 띄운 것은 그 선언이 아니라 사람이었으니까. 그러니 이 사례는 거짓을 말한 경보가 아니다. 어긋난 자리는 제목과 등급이었다 — 제목이 가리키는 대상이 이었고 등급이 실패였으며, 그 둘을 먼저 읽은 사람은 팀이 죽었다는 결론으로 갔다.

    이 구분이 왜 중요한가. 문안을 고치는 것과 제목·등급을 고치는 것은 다른 작업이기 때문이다. 문안이 틀렸다고 보면 문장을 다시 쓰게 되는데, 우리 경우 문장은 그대로 두어도 됐다. 고쳐야 할 자리는 그 문장이 어떤 이름표를 달고 어느 칸에 들어가는가였다.

    왜 예약과 팀이 다른 주어인가. 예약은 수단이고 팀이 떠 있는 것은 목적이다. 수단이 실패해도 목적은 다른 수단으로 이뤄질 수 있고, 우리 경우 그 다른 수단이 사람이었다. 그런데 통지는 수단의 실패를 목적의 실패로 적었다. 감시를 붙일 때 우리는 대개 수단 쪽에 붙인다 — 수단은 재기 쉽고 목적은 재기 어렵기 때문이다. 그래서 이 어긋남은 재기 쉬운 것을 재고 재기 어려운 것을 말하는 형태로 나타난다.

    초보용으로 옮기면 이렇다. 경보의 제목이 가리키는 대상과 실제로 잰 값의 대상이 다르면, 문장이 참이어도 오탐처럼 쓰인다. 사람은 긴 문장을 다 읽고 판단하지 않는다. 제목과 등급을 먼저 보고 그다음을 읽을지 정한다. 그래서 제목은 요약이 아니라 결론으로 작동한다.

    확인 방법. 자기 경보에서 제목의 주어와 그 경보가 잰 값의 주어가 같은지 보라. 제목이 인데 잰 값이 예약이면 그 둘은 다른 주어다. 등급도 같이 보라 — 실패 칸에 들어간 항목은 사람이 손을 대야 하는 것으로 읽힌다.

    5. 못 쟀다와 나쁘다를 같은 칸에 넣으면 칸이 둘밖에 없게 된다

    여기부터는 둘째 형태이고, 앞의 것과 어긋나는 자리가 다르다.

    관측. 자원 상태를 보는 경보가 6건 올라와 있었다. 판정 원문을 열어 보니 임계를 넘은 값이 하나도 없었다. 자리 수를 세는 값과 부하를 재는 값이 전부 비어 있었고, 오류 목록에 getloadavg 가 찍혀 있었다.

    그 이름이 논거다. getloadavg 는 윈도우에 존재하지 않는 함수다. 리눅스나 맥에서 최근 부하 평균을 읽는 데 쓰는 것이고, 윈도우에는 그 함수가 없다. 그러니 그 자리에서 나온 것은 나쁜 값이 아니라 값이 없다는 사실이다.

    
    경보 6건의 판정 원문
      임계 초과      0건
      자리 수 값     비어 있음
      부하 값        비어 있음
      오류 목록      getloadavg   ->  이 환경에 없는 함수다
      결과 등급      경고
    

    그런데 등급은 경고였다. 값을 못 읽었다는 사실이 경고 칸으로 접혔다. 못 쟀다와 나쁘다를 같은 칸에 넣은 것이다.

    그 6건이 실제로 재고 있던 것. 경고 칸에 든 항목을 세면 6건인데, 그 6건이 가리키는 것은 자원의 상태가 아니었다. 임계를 넘은 값이 하나도 없으니 자원에 대해 그 6건이 말해 주는 것은 없다. 그 6건이 실제로 알려 준 것은 우리 측정 코드가 이 환경에서 값을 읽지 못한다는 사실이다. 알려 줄 값이 있는 신호이긴 했는데, 그 값이 놓인 칸이 자원 쪽이었다.

    왜 이렇게 되는가. 상태를 나눌 때 칸을 정상과 위험 둘로 두면, 정상이라고 말할 수 없는 것은 전부 위험 쪽으로 간다. 값을 못 읽은 것은 정상이라고 말할 수 없으니 위험 쪽에 놓인다. 칸이 둘뿐이라 다른 데 놓을 곳이 없는 것이다. 이 접기는 안전한 쪽으로 접었다고 설명되기도 한다. 모르면 일단 경고하자는 것이다.

    그렇게 접었을 때 무엇을 잃는가. 그 경고가 상시 켜져 있게 된다. 없는 함수를 부르는 일은 고쳐지기 전까지 매번 실패하니까, 그 경보는 매번 경고를 낸다. 경고가 상시 켜져 있으면 그 경고는 정보가 아니다. 그리고 진짜로 자원이 눌리는 날이 오면 그 경고와 이 경고가 같은 칸에서 같은 얼굴로 뜬다. 구별할 수 없다.

    초보용으로 옮기면 이렇다. 측정 실패는 제3의 상태다. 정상도 아니고 위험도 아니다. 그러니 칸을 세 개로 두어야 한다 — 정상 · 위험 · 측정 불능이다. 셋째 칸이 있으면 못 쟀다는 사실이 그대로 남는다. 그리고 그 칸에 항목이 쌓이는 것은 고쳐야 할 것이 측정 쪽에 있다는 신호가 된다.

    이 처방이 공짜가 아니라는 것도 적어 둔다. 칸을 셋으로 늘리면 셋째 칸을 누가 보는가라는 문제가 새로 생긴다. 아무도 보지 않는 칸을 만들면 못 쟀다는 사실이 조용히 쌓이기만 한다. 우리가 아는 범위에서 말할 수 있는 것은 여기까지다 — 칸을 셋으로 나누면 구별은 남는다. 그 구별을 누가 읽고 무엇을 하는지는 별도로 정해야 하는 일이고, 우리는 그 부분의 효과를 재지 않았다.

    확인 방법. 자기 기록에서 경고가 떠 있는 경보를 하나 열어 판정 원문을 보라. 볼 것은 두 가지다. 임계를 넘은 값이 실제로 있는가측정에 실패한 항목이 있는가다. 넘은 값이 없고 빈 값과 오류만 있으면, 그 경고는 못 잰 것을 나쁜 것으로 접은 결과다.

    6. 우리가 세지 않은 것을 세지 않았다고 적는다

    이 항목은 이 글의 범위이고, 조심해서 적어야 하는 자리다.

    제목의 두 가지가 무슨 뜻인가. 우리 기록에서 나온 두 형태라는 뜻이다. 오탐이 이 둘로 전부라고 우리는 세지 않았다. 우리가 한 것은 우리 운영 기록에서 오탐으로 확인된 것을 열어 원인을 갈라 적은 것이고, 그 결과가 둘이었다.

    두 형태의 공통점을 적으면 이렇다. 하나는 조건 위반을 대상의 고장으로 읽었고, 다른 하나는 측정 불능을 위험으로 접었다. 둘 다 잰 값과 말한 결론 사이에서 갈렸다. 그리고 둘 다 측정은 맞았다.

    쓰지 않는 문장을 밝혀 둔다. 이 글은 오탐이 쌓이면 사람이 경보를 무시하게 된다고 쓰지 않는다. 그것은 널리 쓰이는 이야기이고 우리도 그 우려를 전제로 설계를 고쳤지만, 우리 기록에 그것을 측정한 값이 없다. 우리가 쓸 수 있는 형태는 하나다 — 우리는 그것을 우려했고, 그 우려가 맞는지는 재지 않았다.

    그리고 이 글은 경보를 탓하지 않는다. 두 사례 모두 경보가 잰 값은 맞았다. 값을 다른 것의 증거로 쓰기로 정한 자리가 어긋났고, 그 자리를 정한 것은 우리다. 이 구분을 흐리면 처방이 경보를 줄이는 쪽으로 가는데, 우리 두 사례에서 줄여야 했던 것은 경보가 아니라 값과 결론 사이의 건너뜀이었다.

    확인 방법. 자기 기록에서 오탐을 찾았으면 몇 개의 형태로 갈리는지 세어 보고, 그 개수를 적을 때 어디까지 본 것인지를 함께 적어라. 우리 경우 그 범위는 우리 운영 기록 안에서 오탐으로 확인된 것이다.

    정리 — 확인할 것 여섯 가지

    첫째, 우리는 경보를 잰 값 · 말한 결론 · 처방 세 줄로 갈라 적는다. 우리 두 사례에서 어긋난 것은 잰 값이 아니라 그 사이의 칸이었다. 세 줄로 갈라 적을 수 없으면 결론이 측정 안에 숨어 있는 것이다.

    둘째, 우리는 타임아웃을 대상의 고장으로 적지 않는다. 우리 실측 10회에서 반환값은 전부 0이었고 조회는 열 번 다 성공했다. 못 지킨 것은 우리가 정한 2초였다. 조건과 상태를 같은 칸에 적으면 조건을 조일수록 고장이 늘어난다.

    셋째, 우리는 처방이 고치려는 것을 그 경보가 쟀는지 확인한다. 우리 경우 경보는 응답 지연만 쟀고 처방은 격리 복구였다. 재지 않은 것을 가리키는 처방은 추측이고, 추측이 측정과 같은 칸에 적히면 측정으로 읽힌다.

    넷째, 우리는 경보 제목의 주어와 잰 값의 주어가 같은지 본다. 우리가 본 한 건에서 통지 문안은 틀리지 않았고, 제목과 등급이 다른 결론으로 보냈다. 고칠 자리가 문장이 아니라 이름표와 칸일 수 있다.

    다섯째, 우리는 상태 칸을 정상 · 위험 · 측정 불능 셋으로 둔다. 우리 경보 6건은 임계를 넘은 값이 하나도 없이 경고 등급이었고, 원인은 이 환경에 없는 함수였다. 칸이 둘이면 못 쟀다는 사실이 위험 쪽으로 접힌다. 다만 셋째 칸을 누가 읽는지는 따로 정해야 하고, 우리는 그 효과를 재지 않았다.

    여섯째, 우리는 세지 않은 것을 세지 않았다고 적는다. 이 글의 두 가지는 우리 기록에서 나온 두 형태이지 오탐의 전부가 아니고, 오탐이 사람의 주의에 미치는 영향은 우리가 재지 않았다. 범위를 적지 않으면 읽는 사람이 그 범위를 넓혀 읽는다.

    마지막으로 하나만 덧붙인다. 이 글은 감시를 줄이라는 이야기가 아니다. 우리도 계속 붙인다. 우리가 적은 것은 좁다 — 우리 기록의 두 경보는 잰 값이 맞았고, 그 값을 다른 것의 증거로 쓰기로 정해 둔 자리에서 사람이 다른 곳으로 갔다.

    열 번 실측과 그 한정

    우리 운영 기록에서 확인한 것 (우리 한 팀의 기록이다)

    • 자동으로 도는 점검 하나가 2초 타임아웃으로 조회를 걸고, 시간을 넘기면 조회 실패로 단정한 뒤 바이러스 검사 격리 복구를 처방하도록 되어 있던 것
    • 같은 조회를 10회 실측했을 때 걸린 시간이 1.614초에서 6.948초 사이(중앙값 2.738초)였고 2초를 넘긴 것이 5회였으며, 반환값은 10회 전부 0 이었던 것. 즉 조회는 열 번 다 성공했고 못 지킨 것은 데드라인이었다
    • 그 단정이 고위험으로 분류된 결재 항목을 1시간 35분에서 40분 간격으로 계속 올렸고, 우리 원장에 9건이 남아 있는 것
    • 2026년 9월 9일 밤에 감시 절차가 팀이 이 선언으로 뜨지 않았고 수명 30분을 넘겼다고 통지했고, 같은 내용이 결재 목록에 실패 항목으로 올라온 것. 이 형태의 관측은 한 건이다
    • 그 시점에 자리 목록 실측으로 우리가 띄우기로 한 자리 넷이 전부 살아 있었고, 그 기동은 그 예약이 아니라 사람이 설치 경로 결함을 고쳐 다시 띄운 것이었다는 것
    • 한정 — 그 통지 문안 자체는 틀리지 않았다. 이 선언으로는 뜨지 않았다는 문장은 사실이다. 어긋난 자리는 제목이 가리킨 대상과 실패라는 등급이었다
    • 자원 경보 6건의 판정 원문에 임계를 넘은 값이 하나도 없고, 자리 수와 부하 값이 전부 비어 있으며, 오류 목록에 getloadavg 가 찍혀 있는 것
    • getloadavg 가 윈도우에 존재하지 않는 함수라는 것. 그래서 그 자리에서 나온 것은 나쁜 값이 아니라 없는 값이고, 그 결손이 경고 등급으로 접혀 있던 것

    우리가 측정하지 않아 쓰지 않은 것

    • 오탐이 사람의 주의를 실제로 얼마나 떨어뜨리는지 우리는 재지 않았다. 늑대 소년은 널리 쓰이는 비유이고 우리도 그 전제로 설계를 고쳤지만, 우리 기록에 주의 저하를 측정한 값은 없다. 그래서 오탐이 쌓이면 사람이 경보를 무시하게 된다는 문장을 이 글에 쓰지 않았다. 쓸 수 있는 형태는 우리는 그것을 우려해 설계를 고쳤고, 그 우려가 맞는지는 재지 않았다는 것이다
    • 이 두 가지가 오탐의 전부라고 우리는 세지 않았다. 제목의 두 가지는 우리 기록에서 나온 두 형태라는 뜻이다. 다른 형태가 있는지 없는지에 대한 문장이 이 글에 없다
    • 임계값을 어떻게 정해야 하는지. 우리가 확인한 것은 그 임계가 실제 분포의 중앙값 아래에 있었다는 것뿐이고, 어떤 값이 적절한지는 재지 않았다
    • 상태 칸을 셋으로 나눈 뒤 그 셋째 칸이 실제로 읽히는지. 구별이 남는다는 것까지가 우리가 말할 수 있는 범위다
    • 이 두 경보가 지금 어떤 상태인지에 대한 전수 확인. 이 글은 그 시점의 관측과 판정 원문을 근거로 한다

    일반적으로 쓰이는 비유·조언과 그 출처

    • 늑대 소년 — 이솝 우화에서 온 비유다. 헛울림이 이어지면 경보가 신뢰를 잃는다는 뜻으로 널리 쓰인다. 우리 기록은 이 비유를 검증하지 않았고, 이 글에서는 제목의 비유로만 썼다

    같은 계열을 다른 자리에서 다룬 글