개요
인턴 때부터 Grafana 작업을 하면서 Metrics, TSDB, PromQL 관련 내용들을 개인 노션에 쭉 작성했는데, 블로그에도 새로운 카테고리를 생성하고 정리하는 공간을 만들었다. 요즘 Alert Rule을 세팅하는 작업을 하고 있는데, 노션 문서를 자주 참고하게 되어서 아예 블로그로 올려버리기로 결심!
1. 시계열 기반 모니터링
시간의 변화에 따라 축적된 데이터들을 수집, 저장, 분석, 알람하는 시스템
예를 들어서.. Prometheus는 다음과 같은 일을 한다.
- 15초마다 /metrics 에 접속해서 현재 상태값 긁어오기
- 수집한 메트릭을 시간과 함께 저장
- PromQL 쿼리를 통해 과거 1시간 평균 rate같은 걸 분석
1.1 운영 시스템에서 시계열 데이터
- 과거에 무슨 일이 있었는지?
- 변화 추이는 어떠한지?
- 어제보다 CPU가 더 많이 사용되는가?
- 5분 요청량이 급증/급락 했는가?
- 등등…
시간의 흐름을 기반으로 서비스를 운영한다.
2. TSDB(Time Series Database)
RDB는 레코드 중심(row-based) 데이터라서 시간 순으로의 수많은 데이터를 다루기 어렵다.
- TSDB는 데이터를 table 형식이 아니라 아래와 같이 저장한다.
- metric_name: node_cpu_seconds_total labels: {mode="user", instance="web-1"} timestamps: [10:00:00, 10:00:01, 10:00:02, ...] values: [23.5, 25.1, 22.8, ...]
3. Prometheus
3.1 Prometheus는 시계열 기반의 모니터링 시스템 (문서)
- Prometheus Server: Scraping, TSDB, PromQL
- Exporter: 매트릭을 내보내는 앱 or 에이전트 → 이 Exporter를 node에 접근해서 설치하는 건가?
- metric + label 조합을 하나의 시계열로 간주한다. 따라서, 아래 두 개는 다른 시계열이다.
- http_requests_total{method="GET", status="200"} http_requests_total{method="POST", status="500"}
3.2 Prometheus 동작 흐름
- Pull 기반 수집: endpoint에 직접 가서 /metrics 데이터를 긁어온다.
- Time Series: 내부 TSDB에 메트릭을 시간 기준으로 저장
- PromQL로 쿼리: 매트릭 조회, 시각화
3.3 What is Prometheus not? (아티클)
- 프로메테우스는 로깅 시스템이 아니라, 메트릭 수집용 도구다.
- cpu 사용률, 에러율, 요청 수와 같은 숫자 중심 지표를 수집한다.
- 메트릭은 Prometheus, 로그는 Loki/ELK/CloudWatch Logs 등으로 분리
- long-term DB를 지원하지 않는다.
3.4 Prometheus Storage (문서), (alice님 블로그)
- Prometheus는 시계열 데이터 조각(chunk)를 메모리에 유지한다.
- storage.local.path 라는 플래그로 수집한 시계열 데이터를 디스크에 저장한다.
3.5 Prometheus Metric Type (문서)
- Counter: 항상 증가하는 값(단조 증가), 재시작 시 0으로 리셋
- increase: 내부적으로는 rate() * seconds로 계산
- rate: 1초당 얼마나 증가했는지
- Gauge: 현재 메모리 사용량과 같은 증감값, 시스템 자원 상태
- Histogram
4. Chunk Data와 Metrics Data의 차이
- Metric은 측정 대상을 나타내는 이름 + 라벨 조합으로, aws_cloudfront_requests같이 수집한 덩어리다.
- Chunk는 각 시계열에 대해서 일정 시간 동안의 값을 묶어서 저장한 덩어리다.
- 예를 들어서, http_requests_total{method="GET", status="200"} 라는 메트릭의 데이터가 있다고 했을 때 chunk는 다음과 같다.
- chunk 1: [10:00:00 → 100, 10:00:15 → 110, 10:00:30 → 125, ...] chunk 2: [12:00:00 → 500, 12:00:15 → 530, ...]
모르는 걸 찾는 위주로 쓰다보니까 정리가 안된 부분이 많긴 한데 🥹 주말에 정리 좀 해봐야겠따....
tmi : PromQL을 잘 정리해서 써보는 것이 꼭 달성하고 싶은 목표 중 하나