silent-failure-detector은(는) 무엇을 하나요?
error 모니터링으로는 볼 수 없는 실패, 즉 조용히 멈추는 프로세스를 잡아냅니다. 예외도 크래시도 없이 그저 신호 발행을 중단하고, 며칠 후에야 알게 되는 상황을 방지합니다.
사용 시점
- 로거, 하트비트, 크론 작업, 에이전트 루프, 데이터 피드 등 예상 주기가 있는 타임스탬프 스트림이 있고, 그것이 멈췄는지 알고 싶을 때
- 일일 무결성 점검에 연결할 수 있는 검증 가능하고 결정론적인 검사가 필요할 때
작동 방식 (한 가지 조절 변수)
가장 최근 신호가 expected_interval_sec * multiplier(기본값 multiplier = 3.0 → 약 세 번의 비트 누락)보다 오래된 경우 SILENT로 판단합니다. 빈 스트림도 SILENT입니다. 승수는 탐지 지연 시간(낮을수록 실제 중단을 더 빨리 감지)과 버스트성 주기의 오탐지(높을수록 더 관대함) 사이의 트레이드오프를 조절합니다. expected_interval_sec을 스트림의 일반적인 간격으로 설정하고, 주기가 버스트성이라면 p95 간격에 가깝게 설정하고 그 사실을 명시하세요.
실행 방법
echo '{"now": 1750000000, "expected_interval_sec": 60,
"timestamps": [1749999940, 1749999990]}' > input.json
python3 detector.py input.json # 종료 코드 0 = 정상, 종료 코드 1 = 침묵 (경보 대상)
또는 임포트: from detector import detect; detect(now, timestamps, expected_interval_sec, multiplier=3.0).
출력
{ "status": "silent", "reason": "last signal 19880s old vs threshold 180s",
"last_age_sec": 19880, "threshold_sec": 180.0 }
알려진 한계 (주장이 아닌 측정치 — BENCHMARK.md 참조)
105개 레이블링 케이스에서 83.8% 정확도(TPR 81.8% / TNR 86.0%) 를 기록했습니다. 모든 오류는 임계값 근처의 2~4배 '회색 영역'에서 발생하며, 명확한 케이스는 100% 정확합니다. 두 가지 명백한 실패 모드: (1) 살아 있지만 현재 느린 스트림이 우연히 3배를 넘긴 경우의 오탐지, (2) 막 죽은 스트림에 대한 한 윈도우 탐지 지연. 지연 시간/오탐지 선호도에 따라 multiplier를 조정하세요. 평가는 재현 가능합니다 — 직접 다시 실행하고 수치를 확인하세요.