DevOpsDevOps 학습 로드맵 · 17/17

번외: 임계값 없이 - 통계 기반 이상탐지로 Datadog Watchdog 흉내내기

Datadog Watchdog 같은 상용 AI 이상탐지 기능을, Prometheus의 holt_winters·predict_linear로 정상 트래픽 패턴을 학습해 고정 임계값 없이 이상을 탐지하는 절차로 오픈소스 구현. 고정 임계값 알림과 나란히 비교해 오탐/누락을 실측.

2026-07-276 min read
#이상탐지#Prometheus#Watchdog#Datadog#AIOps#holt-winters
DevOps 학습 로드맵시리즈 목차
1채용공고 요구사항 6개 중 자신 있게 답할 수 있는 게 절반도 안 됐다2kubeadm으로 온프레미스 Kubernetes 클러스터를 처음부터 세우는 절차3FastAPI 서비스 골격, RabbitMQ DLQ, Harbor+Trivy, Jenkins→ArgoCD 파이프라인 구축 절차4Argo Rollouts로 카나리 배포와 Prometheus 메트릭 기반 자동 롤백 붙이기5yaml 복붙 관리의 드리프트 문제를 Kustomize overlay로 구조화하기6Terraform과 Ansible로 클러스터를 코드에서 다시 세울 수 있게 만드는 절차7Prometheus·Loki 관측 스택 구축과 장애 주입 실험 설계 절차8자체 JWT 구현부터 취약점 실험, Keycloak 마이그레이션까지의 실제 절차9ISMS-P 인프라 영역 심사를 가정하고 내 클러스터의 증적을 만드는 절차10SealedSecret이 못 남기는 것 - OpenBao + External Secrets Operator로 감사 로그 확보하기11번외: 더미 워커를 실제 ONNX 추론으로, GPU 스케줄링까지 교체하는 절차12번외: 인터넷을 완전히 끊고도 클러스터가 돌아가는지 - 폐쇄망(에어갭) 시뮬레이션 절차13번외: 부하테스트로 관측 스택을 실전 검증하기 - k6 + HPA + MSA 파이프라인14번외: SLI/SLO/에러 버짓을 실제로 계산해서 배포 판단 기준으로 써보기15번외: DORA 4대 지표를 Four Keys로 자동 집계해보기16번외: 임계값 없이 - 통계 기반 이상탐지로 Datadog Watchdog 흉내내기17번외: Grafana OnCall로 PagerDuty 없이 온콜·에스컬레이션 구현하기

목표

지금까지 만든 알림 규칙(HighErrorRate > 0.05 같은)은 전부 고정 임계값이다. 문제는 "정상적인 트래픽 변동"과 "진짜 이상 상황"을 구분하지 못한다는 것 - 예를 들어 트래픽이 몰리는 시간대엔 응답시간이 평소보다 늘어나는 게 정상인데, 고정 임계값은 그 맥락을 모른다. Datadog의 Watchdog(Datadog 플랫폼 안의 AI 이상탐지 기능 - Datadog이라는 제품과는 별개의, 그 안에 포함된 하나의 기능이다)이 하는 일이 바로 이 맥락을 학습하는 것이다. 이 시리즈에서는 Prometheus의 시계열 예측 함수로 같은 개념을 오픈소스로 흉내낸다.

개념: 고정 임계값이 놓치는 것

상황고정 임계값(> 500ms)학습 기반 이상탐지
평소 대비 정상적인 피크 시간대 트래픽 증가오탐(진짜 이상 아닌데 알림)정상 범위로 인식, 알림 안 함
평소보다 낮은 트래픽 시간대의 미세한 지연 증가임계값 미달로 누락평소 패턴과 다름을 감지, 알림
요일별/시간대별 반복되는 패턴(주말 트래픽 감소 등)매번 같은 임계값 적용과거 같은 시간대와 비교

실제 구축 절차

1. holt_winters로 계절성 있는 예측선 만들기

Prometheus의 holt_winters 함수는 과거 데이터의 추세(trend)와 계절성(seasonality)을 반영해 "지금 이 시점에 예상되는 값"을 계산한다.

# 과거 1시간 추세를 반영한 요청 수 예측 (평활 계수는 실측하며 조정)
holt_winters(http_requests_total[1h], 0.3, 0.1)

2. 예측 구간을 벗어나는지로 이상 판정

# prometheus-rules/anomaly.yaml
groups:
  - name: anomaly-detection
    rules:
      - record: anomaly:request_rate:predicted
        expr: holt_winters(sum(rate(http_requests_total[5m]))[1h:5m], 0.3, 0.1)

      - record: anomaly:request_rate:actual
        expr: sum(rate(http_requests_total[5m]))

      - record: anomaly:request_rate:deviation_ratio
        expr: |
          abs(anomaly:request_rate:actual - anomaly:request_rate:predicted)
          /
          anomaly:request_rate:predicted

      - alert: TrafficAnomalyDetected
        expr: anomaly:request_rate:deviation_ratio > 0.5   # 예측치 대비 50% 이상 이탈
        for: 10m
        labels: { severity: warning }
        annotations:
          summary: "실제 트래픽이 예측 패턴에서 50% 이상 벗어남 - 임계값이 아니라 패턴 이탈로 감지"

3. predict_linear로 "이대로 가면 언제 임계값을 넘는지" 예측

디스크 사용량처럼 서서히 증가하는 지표는, 현재 값이 아니라 증가 추세를 보고 미리 경고하는 게 더 유용하다.

# 디스크 사용량이 현재 추세(최근 6시간)로 계속 늘면 4시간 안에 가득 찰지 예측
predict_linear(node_filesystem_avail_bytes[6h], 4 * 3600) < 0

이 알림은 "지금 디스크가 부족하다"가 아니라 "지금 이 속도로 줄면 4시간 뒤에 부족해진다"를 미리 알려준다 - 시리즈 6의 장애 주입 실험(디스크 풀)에서 사후에야 알아챘던 것과 대비되는 지점이다.

4. 고정 임계값과 나란히 비교

기존 HighErrorRate(고정 임계값) 알림과 이번에 만든 TrafficAnomalyDetected(학습 기반)를 같은 대시보드에 나란히 두고, 부하테스트 시리즈(12번)에서 쓴 k6 스크립트로 트래픽을 인위적으로 늘려가며 두 알림 중 어느 쪽이 먼저·더 정확하게 반응하는지 비교한다.

검증 방법

  • 평소 패턴대로 트래픽을 흘리며 TrafficAnomalyDetected가 오탐하지 않는지(정상 변동을 이상으로 잘못 잡지 않는지) 확인
  • k6로 평소와 다른 갑작스러운 트래픽 패턴을 주입해 학습 기반 알림이 실제로 반응하는지 확인
  • 같은 상황에서 기존 고정 임계값 알림과 비교해 어느 쪽이 먼저 반응했는지, 오탐률은 어느 쪽이 높았는지 기록
  • predict_linear 기반 디스크 알림이 실제 디스크 풀 몇 시간 전에 미리 발화하는지 확인(시리즈 6 장애 주입 실험 재활용)

체크리스트

  • holt_winters 기반 예측선 recording rule 작성
  • 예측치 대비 이탈률로 이상탐지 알림 규칙 작성
  • predict_linear로 디스크 사용량 사전 경고 알림 작성
  • 기존 고정 임계값 알림과 나란히 두고 k6 부하로 반응 속도·오탐률 비교
  • 비교 결과를 표로 정리 (고정 임계값 vs 학습 기반, 각각의 장단점)