[Prometheus - Grafana] - 3 프로메테우스 메트릭과 라벨
Prometheus Metric
Prometheus 에서 메트릭을 수집하는 방법은 대표적으로 크게 2가지가 있습니다.
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;
@Service
public class SampleService {
private final MeterRegistry meterRegistry;
public SampleService(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
public void doSomething() {
meterRegistry.counter("my_custom_counter", "type", "sample").increment();
}
}
- Client Library를 통한 메트릭 수집
- ⇒클라이언트에서 직접 메트릭 생성 (EX Spring에 직접 prometheus관련 코드 작성)
- ⇒내부 정보 메트릭을 직접 수집 할 수 있음, 대신 직접 구현 해야하며 클라이언트에 영향을 줄 가능성 有
# 다운로드
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xvf node_exporter-*.tar.gz
cd node_exporter-*
# 실행
./node_exporter
- Exporter를 통한 메트릭 수집
- 시스템(데이터베이스, 서버, 메시지 큐 등)의 메트릭을 변환하여 Prometheus에서 수집할 수 있도록 해주는 독립적인 프로그램
일반적으로 분산된 환경에서의 Prometheus는 Exporter를 사용한 수집방식을 사용하고있습니다.
Prometheus Metric 타입 4가지
Prometheus의 Metric에는 4가지 타입이 있고 각각의 특징이 있습니다.
Counter
Counter 타입은 가장 많이 수집되는 유형의 메트릭 타입. 이 타입은 모니터링하는 이벤트의 누적 개수 혹은 크기를 표현. 일반적으로 이 타입은 rate 함수와 같이 사용하여, 다음 이벤트를 추적하는데 많이 사용된다.
- 초당 요청 개수
- 초당 상태 코드 개수
- 초당 요청 실패율
- 초당 요청 성공률
Gauge
Gauge 타입은 "현재 상태"를 표현하는 메트릭 타입이다. Counter 타입과 달리 증가도 가능하고 감소도 가능하다. 이 타입의 예는 다음과 같다.
- 현재 커넥션 개수
- 현재 동작하는 스레드 개수
- 현재 메모리 사용량
- 업타임 시간
Summary
Summary 타입은 시스템 성능을 이해할 때 필요한 메트릭들을 표현한다. 이 타입의 예는 다음과 같다.
- 지연 시간
- 응답 시간
Histogram
Histogram은 Summary랑 비슷한데, "분위수"에 대한 개념이 추가된다. 이는 각 사용자 경험에 대해 추론할 때 매우 유용하게 쓰인다.
Summary와 Histogram의 차이
Summary : 내가 알아서 집계 해 줄게
Histogram : 집계 방식 커스터마이징 가능
다만 Exporter를 활용 하는 경우 Summary 및 Histogram은 많지 않음.
Prometheus Label
Label은 Prometheus의 아주 강력한 기능 중 하나이며, 메트릭 값을 효율적으로 사용할수 있게 해 줍니다.
Label은 키-값 쌍으로 이루어져 있으며, Prometheus가 시계열 데이터를 식별하는데 "메트릭 이름"과 더불어서 사용합니다.
예를들어 다음과같이 http rquest관련 매트릭이 있다고 하면,
http_request_status_code_200 1
http_request_status_code_201 4
http_request_status_code_301 6
http_request_status_code_404 7
http_request_status_code_400 4
http_request_status_code_500
만약 다음과 같이 request 번호 앞자리별로 count를 세려고 하면 곤란해 집니다.
- 2xx (응답 성공)
- 3xx (응답 성공 - 리다이렉션)
- 4xx (응답 실패 - 사용자 오류)
- 5xx (응답 실패 - 서버 오류)
30개가 넘는 상태코드를 다 만들어서 집계할 순 없을 것입니다.
이때 프로메테우스는 다음과 같이 Label 기능을 제공하여 집계하기 편하도록 구성되어 있습니다.
http_request{ status_code="200" } 1
http_request{ status_code="201" } 4
http_request{ status_code="301" } 6
http_request{ status_code="404" }
http_request{ status_code="400" }
http_request{ status_code="500" }
그리고 다음과같이 쿼리를 작성하면 쉽게 집계가 가능합니다. (200대)
sum(rate(http_request{status_code=~"2.."}[5m]))
이러한 Prometheus의 라벨기능을 활용하여 다양한 검색 쿼리를 작성할 수 있습니다.