Prometheus를 활용한 모니터링 시스템에서 데이터 수집만큼 중요한 것이 바로 수집된 데이터를 분석하고 시각화하는 능력이다. 이를 가능하게 하는 것이 바로 **PromQL(Prometheus Query Language)**이다. PromQL은 시계열 데이터를 실시간으로 선택하고 집계할 수 있는 강력한 기능형 쿼리 언어다. 본 글에서는 입문자가 반드시 알아야 할 PromQL의 기본 문법부터 핵심 데이터 타입, 그리고 실무에서 자주 사용되는 연산자까지 상세히 다룬다.

목차

  1. PromQL의 기본 개념과 데이터 타입
  2. 시계열 선택자(Selectors) 활용법
  3. 범위 벡터(Range Vectors)와 시간 오프셋
  4. 주요 산술 및 논리 연산자 이해
  5. 입문자를 위한 필수 함수(Rate, Sum 등) 분석
  6. 결론: 효율적인 쿼리 작성을 위한 조언

1. PromQL의 기본 개념과 데이터 타입

PromQL은 일반적인 SQL(관계형 데이터베이스)과는 완전히 다른 구조를 가진다. 표 형태의 데이터를 조회하는 대신, 시간에 따라 변화하는 메트릭 이름과 라벨(Label)의 조합을 조회한다. PromQL에서 반환하는 데이터 타입은 크게 네 가지로 나뉜다.

  • Instant Vector (인스턴트 벡터): 동일한 시점에서 각 시계열에 대해 단일 샘플 값을 가지는 집합이다. 가장 흔히 사용되며 그래프의 한 점을 구성한다.
  • Range Vector (범위 벡터): 특정 시간 범위 동안의 데이터 포인트들을 포함하는 집합이다. 주로 rate()와 같은 함수 내에서 계산용으로 사용된다.
  • Scalar (스칼라): 단순한 숫자 값이다.
  • String (문자열): 현재는 거의 사용되지 않는 단순 문자열 값이다.

2. 시계열 선택자(Selectors) 활용법

가장 기본적인 쿼리는 메트릭 이름 그 자체다. 하지만 수많은 데이터 중 원하는 것만 골라내기 위해서는 ‘라벨 선택자’를 사용해야 한다. 중괄호 {} 안에 조건을 입력하여 데이터를 필터링한다.

  • 일치 연산자 (=): 특정 라벨과 정확히 일치하는 데이터 선택. (예: http_requests_total{status="200"})
  • 불일치 연산자 (!=): 특정 라벨과 일치하지 않는 데이터 선택.
  • 정규표현식 일치 (=~): 정규식을 사용하여 복수 조건 선택. (예: method=~"GET|POST")
  • 정규표현식 불일치 (!~): 정규식 조건에 해당하지 않는 데이터 선택.

3. 범위 벡터(Range Vectors)와 시간 오프셋

현재 시점의 값뿐만 아니라 과거의 추이를 분석하기 위해서는 범위 벡터를 사용해야 한다. 쿼리 뒤에 대괄호 []를 붙여 시간을 지정한다.

  • 범위 선택: node_cpu_seconds_total[5m]는 최근 5분간의 모든 데이터 포인트를 가져온다.
  • 시간 오프셋 (offset): 과거 특정 시점의 데이터를 조회할 때 사용한다. http_requests_total offset 1d는 정확히 하루 전의 데이터를 조회한다.

4. 주요 산술 및 논리 연산자 이해

PromQL은 벡터 간의 연산을 지원한다. 이를 통해 원시 데이터를 가공하여 의미 있는 정보로 변환할 수 있다.

  • 산술 연산: +, -, *, /, %, ^를 사용할 수 있다. 예를 들어, 바이트 단위 데이터를 메가바이트로 변환하려면 mem_usage_bytes / 1024 / 1024와 같이 작성한다.
  • 비교 연산: ==, !=, >, <, >=, <=를 사용하여 특정 조건에 맞는 시계열만 필터링한다. 이는 Alerting Rule을 만들 때 핵심적으로 사용된다.
  • 논리 연산: and, or, unless를 통해 여러 메트릭 조건을 결합할 수 있다.

5. 입문자를 위한 필수 함수 분석

단순한 값 조회보다 더 중요한 것이 함수를 통한 데이터 가공이다. 입문 단계에서 가장 많이 쓰이는 함수는 다음과 같다.

rate() 함수

카운터(Counter) 메트릭의 초당 증가율을 계산한다. 예를 들어 rate(http_requests_total[5m])는 지난 5분 동안 초당 평균 몇 건의 요청이 들어왔는지 보여준다. 카운터 데이터는 반드시 rateirate를 거쳐야 의미 있는 그래프가 된다.

sum() 집계 연산자

여러 시계열의 합계를 구한다. sum(http_requests_total)은 모든 서버에서 발생하는 전체 요청 수의 합을 반환한다. 특정 라벨별로 묶어서 보고 싶다면 by 구문을 추가한다. (예: sum by (status) (http_requests_total))

6. 결론: 효율적인 쿼리 작성을 위한 조언

PromQL 입문자가 가장 많이 하는 실수는 라벨 필터링 없이 너무 방대한 데이터를 한꺼번에 조회하는 것이다. 이는 Prometheus 서버에 부하를 줄 뿐만 아니라 원하는 결과를 찾기 어렵게 만든다.

효율적인 쿼리를 위해서는 1) 가능한 구체적인 라벨을 사용하고, 2) 카운터 메트릭에는 항상 rate 함수를 적용하며, 3) 복잡한 쿼리는 단계적으로 작성하여 결과를 확인하는 습관을 지녀야 한다. 본 가이드에서 다룬 기초를 바탕으로 실제 Grafana 대시보드나 Prometheus 웹 UI에서 다양한 쿼리를 연습해 보길 권장한다.

댓글 남기기