Prometheus 모니터링 지표가 5분 뒤 사라지는 현상 (SRE 관점)?

사내 서비스들을 Prometheus로 모니터링하고 있는데, Oracle DB Exporter로부터 수집하는 up 지표가 약 5분 후 사라져버립니다. scrape_interval을 일부러 10분으로 길게 줬는데, 그 때문에 그런 걸까요? 5분 이상 up 시계열이 안 보이니, 설정한 서비스 다운 경보(예: up == 0 for 5m)도 제대로 발동하지 않습니다. 이런 현상을 어떻게 해결할 수 있을까요?”

수집 주기( scrape_interval )를 너무 길게 잡은 것이 원인입니다. Prometheus는 기본적으로 최근 5분 동안 데이터가 없으면 해당 시계열을 “없어진(stale)” 것으로 간주하기 때문에, 10분 간격으로 스크레이프하면 그 중간에 데이터 공백이 생겨 up 지표가 자동으로 빠지는 것입니다

  • 스크레이프 주기 단축: 가능하면 대상 Exporter의 scrape_interval을 1분 이하로 줄이세요 (일반적으로 15~60초). 이렇게 하면 연속적인 데이터 포인트가 유지되어 up 지표가 사라지지 않습니다.

  • 경보 조건 조정: 만약 주기 단축이 어려운 상황이라면, Alert 규칙에서 지표 부재에 대비하는 방식을 고려해야 합니다. 예를 들어 absent(up{job="Oracle-DB"} == 1) 같은 함수를 사용해 일정 기간 데이터가 없음을 탐지하는 방법도 있습니다 (Prometheus staleness 개념 참고).

근본적으로는 더 자주 수집하여 빈틈을 줄이는 것이 가장 확실한 해결책입니다. 이렇게 하면 5분 다운시 알람이 제대로 작동하고, SLO/SLA 모니터링에서도 누락 없이 정확한 가용성 판단이 가능합니다.

1 Like

[CloudBro AI Bot Response]
Prometheus에서 모니터링 지표가 5분 뒤 사라지는 현상은 매우 흔한 문제이며, SRE 관점에서 다음과 같이 접근할 수 있습니다.


문제 원인

  • Prometheus는 기본적으로 최근 5분 동안 데이터가 없으면 해당 시계열(time series)을 stale(없어진) 상태로 간주합니다.
    • 즉, scrape_interval이 너무 길면(예: 10분) 중간에 데이터가 없어서 up 같은 지표가 사라지거나 알람이 의도치 않게 꺼질 수 있습니다.

1. 스크레이프 주기 조정 (가장 권장되는 방법)

  • scrape_interval을 15초에서 60초 사이로 줄이세요. 보통 30초 내외가 많이 사용됩니다.
    • 예시: prometheus.yml에서
scrape_configs:
  - job_name: 'your_exporter_job'
    scrape_interval: 30s  # 30초마다 스크레이프
    static_configs:
      - targets: ['your_exporter_host:port']
  • 이렇게 하면 데이터 포인트가 연속적으로 기록되어 stale 상태가 발생하지 않습니다.

2. Alert 규칙에서 Staleness 고려하기

  • 스크레이프 주기를 줄이기 어려운 경우, Alert 룰에서 absent() 함수를 활용해 데이터 부재를 감지할 수 있습니다.
    • 예시 Alert 룰:
- alert: ExporterDown
  expr: absent(up{job="Oracle-DB"} == 1)
  for: 10m
  labels:
    severity: critical
  annotations:
    summary: "Oracle-DB Exporter is down"
    description: "No 'up' metric scraped for 10 minutes."
  • 이 방식은 해당 지표가 없어진 경우를 명시적으로 감지해 알람을 발생시킵니다.

3. 추가 고려사항 및 팁

  • Prometheus의 staleness 처리공식 문서에서 자세히 설명하고 있으니 참고하세요.
    • Exporter 자체가 비정상적으로 데이터를 제공하지 않는지, 네트워크 지연이나 방화벽 이슈가 없는지도 점검하세요.
    • Grafana 등 시각화 도구에서 데이터가 사라지는 것처럼 보여도 실제 Prometheus DB에는 남아있는 경우가 있으니, PromQL 쿼리로 직접 확인하세요.

참고 리소스


요약

  • 가장 좋은 해결책: scrape_interval을 1분 이하로 줄여 데이터 공백을 없애기
    • 대안: Alert 룰에 absent() 함수 활용해 지표 부재 감지
    • 항상 확인: Exporter 상태, 네트워크 환경, PromQL 쿼리 검증
      이렇게 하면 Prometheus 모니터링의 신뢰성과 정확성을 크게 향상시킬 수 있습니다. 필요시 구체적인 prometheus.yml 설정 예시나 Alert 룰 작성법도 추가로 안내해 드릴 수 있습니다.