PromQL은 Prometheus Query Language의 약자로 말그대로 prometheus를 사용하고자 할 때 필요한 쿼리 언어이다. QL이 붙어있기 때문에 SQL과 유사할 줄 알았지만, 꼭 그렇지는 않다. SQL을 알고 있더라도 사용하는데에는 큰 도움이 되지는 않았다고 느끼지만, 그래도 배우기 어렵지 않으며 사용하기 편하게 만들어졌다. PromQL을 사용하여, Prometheus의 데이터를 조작, 필터링, 집계 등의 작업을 수행할 수 있다.

Data type

SQL의 쿼리 결과가 테이블인 것처럼, PromQL의 쿼리 결과는 기본적으로 time series, 즉 시계열 데이터로 생각하면 된다. 쿼리 결과는 총 4가지의 데이터 타입이 존재한다.

  • Instant Vector: 시간별로 하나의 값을 갖는 시계열의 집합
  • Range Vector: 시간별로 정해진 시간 구간의 데이터 값을 갖는 시계열의 집합
  • Scalar: 단일 float 값
  • String: 단일 string 값, 현재 사용 X

Range Vector를 설명 그래도 이해하기에는 약간 애매함이 있었는데, 다른 쿼리나 함수를 활용하기 위한 서브쿼리의 결과물로 이해하는 것이 빠를 것이다. 왜냐하면 PromQL에서는 그래프를 그리고자 할 때에는 반드시 Instant Vector를 얻어야 한다. PromQL도 SQL과 마찬가지로 서브쿼리를 지원하기 때문에, Range Vector 결과 값에 rate 등의 함수를 활용하여서 원하는 Instante Vector를 얻은 후에 그래프를 그릴 수 있게 된다.

Query Example

prometheus 환경을 아직 구축하지 못하였거나, 데이터가 마땅치 않은 경우에는 아래 데모사이트에서 PromQL을 사용해볼 수 있다.

기본적으로 아무 처리 없이 쿼리할 경우에는 타임스탬프의 하나의 값만을 갖는 Instanct Vector를 반환하게 된다. 이는 그래프로 바로 활용할 수 있는 데이터이다. prometheus_http_requests_total 만 사용한다면 모든 시계열 데이터를 쿼리할 수 있으며 (SQL에서 SELECT * FROM table 과 같은 느낌) 뒤에 handler, job, code, instance 등을 명시하여 원하는 데이터 만을 골라낼 수 있다.

prometheus_http_requests_total{handler="/api/v1/query_range", job="prometheus"}

Range Vector

그렇지만 뒤에 [5m]과 같이 range를 명시해준다면, Range Vector을 얻을 수 있다. 이 경우 5분 구간에 위치하는 모든 레코드를 가져오게 되며, [5m:1m]와 같이 표시해준다면, 5분 구간 동안 1분 간격으로 레코드를 가져오게 된다. 시간 단위는 밀리세컨드(ms), 부터 년(y) 단위까지 사용할 수 있다. 윤초(leap second)와 윤일(leap day)는 무시되며 1년은 무조건 365일로 계산된다고 나와 있다.

prometheus_http_requests_total{handler="/api/v1/query_range", job="prometheus"}[5m]

바로 그래프를 그리려 한다면, 오류가 나오는 모습을 확인할 수 있다.

PromQL에서 사용할 수 있는 다양한 함수들은 공식 documention에서 확인할 수 있다.