프로메테우스 가이드북은 A to Z Metnros (Udemy) — Prometheus | The Complete Hands-On for Monitoring & Alerting를 듣고 작성한 가이드북입니다.
가이드북의 전체 목차 및 인덱싱은 프로메테우스 가이드북 — 소개 페이지를 참고해주세요.
PromQL
Promethues에서는 PromQL을 이용해서 TSDB(Time Series Database)를 제어할 수 있습니다.
PromQL은 단순히 시계열을 선택하는 것 뿐만 아니라 복잡한 쿼리 집계 및 분석과 관련한 기능을 제공합니다.
자료형(Data Type)
PromQL에서는 다음과 같은 자료형들을 제공하고 있습니다.
Instant Vector
Range Vector
Scalar
String
Instance Vector
A set of time series containing a single sample for each time series, all sharing the same timestamp
Prometheus UI에서 prometheus_http_requests_total
을 조회하면 각각의 HTTPS ENDPOINT에 대한 요청값 통계를 볼 수 있습니다.
각각의 요청값들 하나하나가 Instance Vector라고 할 수 있습니다.
Range Vector
A set of time series containing a range of data points over time for each time series.
Prometheus UI에서 prometheus_http_requests_total[1m]
을 조회하면 각각의 HTTPS ENDPOINT에 대한 요청값의 1m
에 대한 범위값을 조회할 수 있습니다.
각각의 요청값들 하나하나가 Instance Vector라고 할 수 있습니다.
Scalar, String
Scalar is a simple numeric floating point vaule.
String is a simple string value; currently unused.
Scalar, String은 각각 15.21, hello와 같은 형태의 값입니다.
그 중에서 String은 Prometheus Official Documents따르면, 많이 사용되지 않는다고 알려져 있습니다.
Selectors & Matchers
특정 매트릭에 실행되는 PromQL 질의는 매우 광범위한 조회를 실행합니다. 따라서 유용한 정보의 조회를 위해서 그 대상과 범위를 제한할 필요가 있습니다.
이러한 기능을 제공해주는 것이 selector
와 matcher
입니다.
Selector 알아보기
기본 PromQL
단일 Selector 사용
복수 Selector 사용
기본 PromQL
process_cpu_seconds_total
을 통해서 사용자의 CPU 관련 매트릭을 조회할 수 있습니다.
예를 들어 다음과 같이 Element=Value
을 반환 받을 수 있습니다.
Elements | Value |
---|---|
process_cpu_seconds_total{ instance=”localhost:9090”, job=”prometheus” } | 28.32 |
process_cpu_seconds_total{ instance=”localhost:9100”, job=”prometheus” } | 0.29 |
단일 Selector 사용
혹은 selector
를 활용한 process_cpu_seconds_total{job=”node_exporter”}
이런 구문으로, 더욱 구체적인 Elements=Value
를 반환 받을 수 있습니다.
Elements | Value |
---|---|
process_cpu_seconds_total{ | 1.04 |
복수 Selector 사용
혹은 복수의 selector
를 활용한 process_cpu_seconds_total{job=”node_exporter”, instance=”localhost:8080”}
과 같은 구문을 사용할 수도 있을 것입니다.
하지만 매칭되는 대상이 없는 경우에는 no_data
를 반환할 것입니다.
Matcher 알아보기
Matcher는 selector와 함께 사용하며, 다양한 조건으로 PromQL에서 작동합니다.
Equality Matchers
=
process_cpu_seconds_total{job="node_exporter"}
Negative Equality Matcher
!=
process_cpu_seconds_total{job!='“node_exporter”}
Regular Expression Matcher
=~
prometheus_http_requests_total{handler=~”/api.*”}
Negative Regular Expression Matchers
!~
prometheus_http_requests_total{handler!~”/api.*”
Selector, Matcher 활용
지금까지 Selector, Matcher를 사용하여 다양한 매트릭 정보를 조회하였습니다. 그리고 이 데이터들은 모두 Instant Vector
에 해당하는 값입니다.
저희는 다음과 같이 Range Vector
를 조회할 수도 있을 것입니다.
proemtheus_http_requests_total{handler=~”/api.*’}[5m]
Operators
PromQL에는 2종류의 Operator가 존재합니다.
Binary Operators
Binary Operators는 두 피연산 대상들에 대한 지정된 계산을 진행하는 Operator입니다.
Arithmetic binary operator
Comparison binary operators
Logical/set binary operators
Aggregation Operators
Aggregation Operators는 수많은 집계 대상들을 합쳐서 집계 연산을 진행하는 Operator입니다.
Arithmetic Binary Operator
아래와 같이 6개의 Arithmetic Binary Operator가 존재합니다.
목적 | 연산자(Operator) |
---|---|
addition | + |
substraction | - |
multiplication | * |
division | / |
modulo | % |
power/exponentitation | ^ |
Arithmetic operator are the symbols that represent arithmetic math operations.
Binary arithmetic operators are defined between scalar/scalar, vector/scalar, vector/vectorvalue pairs.
e.g. node_memory_Active_bytes / 8
Comparison Binary Operators
아래와 같이 6개의 Comparison Binary Operators가 존재합니다.
목적 | 연산자(Operator) |
---|---|
equal | = |
non-equal | != |
greater-than | > |
less-than | < |
greator-or-equal | >= |
less-or-equal | <= |
A comparison operator is a mathematical symbol which is used for comparison.
Comparison operators are defined between scalar/scalar, vector/scalar, vector/vector value pairs.
e.g. process_open_fds > 12
Logical/set Binary Operator
아래와 같이 3개의 Logical/set Binary Operator가 존재합니다.
목적 | 연산자(Operator) |
---|---|
intersection | and |
union | or |
complement | unless |
The logical operators are used to combine simple relational expressions into more complex expressions.
Logical operators are defined only instant vector.
Aggregation Operators
아래와 같이 11개의 Aggregation Operators가 존재합니다.
목적 | 연산자(Operator) |
---|---|
calculate sum over dimensions | sum |
select minimum over dimensions | min |
select maximum over dimensions | max |
calculate the average over dimensions | avg |
calculate population standard deviation over dimensions | stddev |
calculate population standard variance over dimensions | stdvar |
count number of elements in the vector | count |
count number of elements with the same value | count_values |
smallest k elements by same value | bottomk |
largest k elements by sample value | topk |
calculate quantile over dimensions | quantile |
Functions
프로메테우스에는 다양한 내장 함수(Built-in Function)이 있어서 다양한 매트릭 연산을 손쉽게 진행할 수 있습니다.
가장 대표적인 Aggreagtion Operators 외에도 Rate Functions, Predict Function, Time Functions, Transformation Functions, Vector Matching Function 등이 존재합니다.
Rate Function - rate()
rate() - calculates the per-second average rate of increase of the time series in the range vector
Instance Vector 조회
prometheus_http_request_total
Range Vector 조회
prometheus_http_request_total[1m]
Rate(Range Vector) 조회
rate(prometheus_http_request_total[1m])
Rate Function - irate()
irate() - calculates the instant rate of increase of the time series in the range vector
Instance Vector 조회
prometheus_http_request_total
Range Vector 조회
prometheus_http_request_total[1m]
Rate(Range Vector) 조회
irate(prometheus_http_request_total[1m])
Predict Function - change
시작부터 현재까지 node_exporter가 재시작한 횟수 조회하기
change(process_start_time_seconds{job="node_exporter"}[1h])
Predict Function - deriv
프로메테우스 서버(job=“prometheus”)의 물리적 메모리 사용량의 1시간 당 변화율 계산
deriv(process_resident_memory_bytes{job="prometheus"}[1h])
Predict Function - linear
노드 익스포터(job=“node_exporter”)에서 1시간 동안 메모리 사용량 데이터를 기반으로 2시간 후의 예상 메모리 사용량을 메가바이트(MiB) 단위로 예측
predict_linear(
predict_linear(node_memory_MemFree_byes{job="node_exporter"}[1h],
(2 * 60 * 60)/1024/1024
)
OverTime Function - (max|min|avg)_over_time
Aggreagtion Operators에서 배운 여러 연산자들을 *_over_time
앞에 붙여서 사용하는 것으로 각종 Time Function을 사용할 수 있습니다.
max_over_time(node_cpu_seconds_total[1h])
min_over_time(node_cpu_seconds_total[1h])
avg_over_time(node_cpu_seconds_total[1h])
Sort Function - sort, sort_desc
아래와 같이 정렬을 할 수도 있습니다.
sort(node_cpu_seconds_total)
sort_desc(node_cpu_seconds_total)
Time Function - time
아래와 같이 시간 정보를 손쉽게 활용할 수도 있습니다.
time() - process_start_time_seconds{job="node_exporter"}
day_of_week()
day_of_month()