프로메테우스로 지표를 수집했으면, 해당 지표를 사용하기 위해서는 PromQL을 사용해야 한다. mysql에서 query를 사용하는 것과 비슷한데, 문법과 값들이 조금씩 다르다. 하나씩 알아보자.

 

PromQL 타입

 

mysql에서 int, string 같은 자료형이 있듯이 PromQL에도 guage, counter, summary, histogram 4가지의 자료형이 존재한다. 예와 함께 살펴보자.

 

Gauge

 

특정 시점의 값을 표현하는 타입이고, 예시로는 cpu, 메모리 사용량의 현재 시점이 있다. 말했듯이 검색 시점에서 값들을 의미한다. 

 

 

Counter

 

현재 시점까지의 누적된 값을 표현하는 타입이고, 예시로는 gc를 수행하는데, 걸린 시간을 누적값을 가지고 있는 것을 볼 수 있다. 

 

 

 

Summary

 

구간 내에 있는 메트릭 값의 빈도를 측정하는 메트릭으로, 0 ~ 1 사이의 값을 가진다. 여기서는 quantile 값의 0.99이고, 오른쪽의 값이 있을 때 0.99만큼은 값만큼의 시간이 걸린다.라고 생각하면 된다. 예시로 본 사진은 scrape_jon = application, quantile=0.99일 때 0.000670417이라는 스크랩 풀을 동기화하는 데 걸린 시간이다. 현재 값들은 모두 동일한 것을 알 수 있다. 

 

 

Histogram

 

미리 정의한 구간 내에 있는 메트릭 값의 빈도를 측정하는데, Summary의 낮은 레벨의 데이터 타입이라고 이해하기 쉽다. 예시로 보는 사진은 지난 5분간 관찰된 prometheus_http_request_duration_seconds_bucket 메트릭에 대한 99번째 백분위수(99th percentile) HTTP 요청 지연 시간을 볼 수 있다.

 

 

레이블 매치

 

job을 생성할 때 relabel_configs로 레이블들을 새로 정의하여 원하는 값을 필터링하는 데 사용할 수 있다. 예시는 JVM 메모리 사용량을 보려고 할 때 Heap 영역만 보고 싶다고 가정하자. 

 

레이블을 사용하지 않으면, 관심 없는 nonheap이 조회되게 된다. 

 

 

heap 영역만 보고 싶기에 area 레이블의 heap을 조건으로 추가해 주면 된다.

 

 

이진 연산자

 

일반적인 산술, 비교, 논리/집합 연산자를 제공한다. 하나씩 살펴보자.

 

산술 

 

수학에서 사용하는 +, -, *, / 등 산술 연산자를 사용할 수 있다. 예를 들어서 disk의 여유 공간을 확인하고 싶은데, 아래와 같이 bytes로 보여 한눈에 파악하기 어렵다. 이때 1024*1024로 나누면 MB로 볼 수 있다.

 

 

값에 1024/1024를 해주면 된다.

 

 

비교

 

==, >=,!=와 같은 비교 연산자를 사용할 수 있다. 예시로 jvm 버퍼 메모리의 바이트 사용량을 보고 싶은데 0 이하는 보고 싶지 않은 값이라고 가정하자. 

 

 

> 0 연산자를 붙여주면, 0 이하의 값들은 필터링 돼서 나오지 않는다. 

 

 

 

집계

 

집계 연산자는 by (레이블) 사용하는데, mysql query인 group by랑 유사하다. 

jvm의 메모리 사용량을 area의 heap과 nonheap으로 그룹핑해서 보고 싶다고 가정하자. 

 

 

이때 집계 연산자를 사용해야지 by(레이블)를 사용할 수 있다. area로 그룹핑했을 때 메모리 사용량의 합계를 조회할 수 있다. 

 

 

이밖에도 sum, min, max, count, bottomk(밑에서 k 개), topk(위에서 k개)와 같은 집계 연산자를 제공한다. 

 

인스턴스 벡터, 레인지 벡터

 

인스턴스 벡터는 우리가 guage, counter와 같이 특정 시점에 대한 값을 하나 조회한다. 반면에 레인지 벡터는 인스턴스 벡터가 모여서 구간을 보여준다. 인스턴스 벡터와 레인지 벡터 예시를 보자.

 

 

 

3m = 3분이라는 범위를 줬을 때 현재 시점을 기준으로 3분 동안 스크랩한 데이터를 보여준다. 현재 1분마다 스크랩을 설정해 놔서 3개가 나온 것을 볼 수 있다. 

 

특정 시점 데이터 조회

 

특정 시점 즉 내가 원하는 시점에 대한 데이터를 볼 수 있는 문법이 있다. Offset time과 @유닉스 시간이다. 

 

offset time의 경우 현재 시점에서 k 시간만큼 전 데이터를 조회한다. 아래의 예시는 3분 전의 jvm 메모리 사용량을 조회하는 것을 볼 수 있다.

 

 

 

@유닉스 시간은 내가 원하는 시점의 값을 조회할 수 있다. 해당 시간은 임의로 넣은 예시이다.

 

 

 

이 밖의 함수들로 abs, ceil, floor같이 값을 변환하는데, 다양한 함수들을 제공해 주므로 사용하기만 하면 된다. 

 

지금까지 PromQL의 베이스가 되는 것들을 알아봤다. 다음은 알람과 레코딩을 포스팅할 예정인데, 알람은 특정 메트릭이 임계값을 넘었을 때 알림을 발생하는 것이고, 리코딩은 조회할 것을 축약어로 사용할 수 있도록 미리 지정하는 것이다. 

 

+++

 

JVM 애플리케이션 모니터링 지표 예시 

애플리케이션 혹은 인스턴스마다 구분 지을 수 있는 레이블을 지정해주는 것을 디폴트로 한다.

 

jvm_memory_bytes_used {area="heap"}

- Heap이 사용하는 메모리 사용량을 모니터링할 수 있다.

jvm_gc_pause_seconds_max

- GC에 걸린 최대 시간을 수집하는 지표로, action 레이블로 minor, major GC를 선택할 수 있다.

jvm_threads_current

- 애플리케이션에서 활성화된 스레드 개수인데, 비정상적으로 많이 만들어지는지 확인해 볼 수 있다.