[Prometheus] PromQL
Prometheus๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํ ์ฉ๋๋ก ์์ ๋ง์ Query syntax๋ฅผ ์ ๊ณตํ๋๋ฐ, ๊ทธ๊ฒ ๋ฐ๋ก PromQL์ด๋ค.
Prometheus ๊ธฐ๋ฐ์ผ๋ก ๋์๋ณด๋๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด Grafana์์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ ํ ์ผ์ด ์ข ์ข ์์ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ - ๋จ์ ์กฐํ
PromQL๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ค์บํด์ค๋ ๊ฒ์ด ๋จผ์ ๋ค.
๋ฐ์ดํฐ ์ค์บ, ํํฐ ํํ์์ ์ค๊ดํธ ๋ด์ ํค=๊ฐ ์์ผ๋ก ๊ตฌ์ฑ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์ฟผ๋ฆฌ๋ __name__์ด http_client_duration_milliseconds_count์ธ ๋ฐ์ดํฐ๋ง ํํฐ๋งํด์ค๋ ๊ตฌ๋ฌธ์ด๋ค.
{__name__="http_client_duration_milliseconds_count"}
์ฌ๊ธฐ์ __name__์ metric ์ด๋ฆ์ ๊ฐ๋ฆฌํค๋ ํน์ํ ํ๋๋ค. ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋น๊ตํ๋ฉด ํ
์ด๋ธ๊ณผ ๋๋ฑํ ๋จ์๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์๋ ์๋ค.
http_client_duration_milliseconds_count{}
์ด๊ฑด ๋ฐ๋ก ์ด์ ์ ์ฟผ๋ฆฌ์ ์ ํํ ๋์ผํ ๋์์ ํ๋ค.
๋ณ ์ฐจ์ด๋ ์์ง๋ง ๋ณดํต ์ด๋ฐ ์์ผ๋ก ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
ํํฐ
๋ฉํธ๋ฆญ ์กฐํ์ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด ํํฐ๋ฅผ ๊ฑธ๊ณ ์ถ๋ค๋ฉด, ์ค๊ดํธ ์ ์ ํค=๊ฐ ์์ ์ฐ๊ฒจ๋ฃ์ผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ค๊ดํธ ์ ์ ์ ํํ ์ฉ์ด๋ก๋ Time series selector๋ผ๊ณ ๋ถ๋ฅธ๋ค.
http_server_request_duration_seconds_count{service_namespace="prod", service_name="...-API"}
์ด๋ฌ๋ฉด service_namespace์ด prod๊ณ , service_name์ด API์ธ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ง ์กฐํ๊ฐ ๋๋ค.
์ด์ฒ๋ผ ๊ธฐ๋ณธ์ ์ผ๋ก ์์คํ
์คํ
์ด์ง์ ์์คํ
์ด๋ฆ ์ ๋๋ ํํฐ๋ก ์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ์ด๋ค.
promQL์ ํํฐ ์กฐ๊ฑด์ ์ ํ์ด ์ข ๊ฐํ ํธ์ด๋ค.
๋์๋น๊ต ๊ฐ์ ๋ณต์กํ ์ ์๋ ์กฐ๊ฑด์์ ์ค ์ ์๊ณ , ์ผ์น ๋น๊ต(=), ๋ถ์ผ์น ๋น๊ต(!=), ์ ๊ท์ ๋น๊ต(=), ์ ๊ท์ ๋ถ์ผ์น ๋น๊ต(!) 4๊ฐ ์ ๋๋ง ์ ๊ณต์ด ๋๋ค.
์ ๊ท์ ํํ ์ฒ๋ฆฌ๋ ์ตํต์ฑ์ด ์๋ ํธ์ด๋ค.
env="foo" ๊ฐ์ ์์ผ๋ก ์ฐ๋ฉด, ์์์ ์ผ๋ก env="^foo$"๋ก ํด์ํด์ ํฌํจ ๊ฒ์์ ํด์ค๋ค.
offset
offset์ ์กฐํ ์์ ์ ๊ณผ๊ฑฐ๋ก ๋๋ฆฌ๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ์ ํํ ๋งํ๋ฉด "ํ์ฌ ์๊ฐ"์ ํน์ ์์ ์ผ๋ก ๊ณ ์ ํ๋ค.
ํํฐ ํํ์ ๋ฐ๋ก ์ค๋ฅธํธ์ ๋ถ์ผ ์ ์๋ค.

์ด๋ฐ ์์ผ๋ก ์ฐ๋ฉด, ์ผ์ฃผ์ผ ์ ์์ ์ ํ์ฌ๋ก ์ก๊ณ , ์ผ์ฃผ์ผ ์ ์์ ๋ 30๋ถ ์ ๊น์ง์ ๋ฒ์๋ฅผ ์กฐํํ๊ฒ ๋๋ค.
Range Vector
PromQL ์ฟผ๋ฆฌ๋ค์ ๋ณด๋ฉด, ๋๊ดํธ ํํ์์ ์์ฃผ ๋ณผ ์ ์๋ค.
์ฝ๊ฒ ๋งํด, ์๊ฐ ๋ฒ์ ํํฐ ๊ฐ์ ๊ฑฐ๋ค.
์ด๊ฑด ๋จ๋
์ผ๋ก ์ฌ์ฉ๋์ง๋ ์๊ณ , ํจ๊ป ์ฌ์ฉ๋๋ ์ง๊ณ ํจ์์ ๋ฐ๋ผ์ ์ ํํ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ค.
์ ๊ธฐ์ 5m๋ 30(์ด ๋จ์) ๊ฐ์ ์๊ฐ ๋จ์ ๊ฐ์ ๋ฃ๋๋ฐ, incrase๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ Grafana์ ์๊ฐ ํํฐ๋ฅผ ์ ์ฉํ๊ธธ ์ํ๋ค๋ฉด ํ๋์ฝ๋ฉํ๋๊ฒ๋ณด๋จ $__range ๋ณ์๋ฅผ ์ฌ์ฉํ๋๊ฒ ํธ๋ฆฌํ๋ค.
increase ํจ์
range vector์ ํจ๊ป ์ฌ์ฉํ๋ค.
range vector๋ฅผ [5m] ๊ฐ์ ์์ผ๋ก ์ฃผ๋ฉด ํ์ฌ ์์ ์์ 5m ์ ๊น์ง์ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
increase(http_server_request_duration_seconds_count{service_namespace="prod", service_name="...-API"}[5m])
๊ทธ๋ฌ๋ฉด ํน์ ๋ฒ์ ๋์์ ์์น ์ฐจ์ด๋ง์ ๊ฐ์ ธ์จ๋ค.
์์ฉ ๋ฒ์๊ฐ ๋์ ๊ธฐ๋ณธ ํจ์ ์ค ํ๋๋ค.
sum ํจ์
sum ํจ์๋ ๋ง ๊ทธ๋๋ก ์ดํฉ์ ์ง๊ณํ๋ ํจ์๋ค. ์ผ๋ฐ์ ์ผ๋ก, ํจ์๋ค์ ๊ทธ๋ฅ ์ค๊ดํธ ํํฐ์ ์์ ๊ฐ์ธ๋ ํํ๋ก๋ ๊ฐ๋จํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
sum(http_server_request_duration_seconds_count{service_namespace="prod", service_name="...-API"})
๊ทผ๋ฐ ์ด๋ ๊ฒ ๋ณด๋ฉด ์๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ์ ์ ๋งคํ๊ณ ,
Grafana Panel์ Stat์ผ๋ก ์ฐ๋๊ฒ ์ข ๋ ์ผ๋ฐ์ ์ด๋ค.

๊ทผ๋ฐ ์ด ์ํ์์ ์๊ฐ ๋ฒ์๋ฅผ ์กฐ์ ํ๋ฉด์ ์์น๋ฅผ ํ์ธํด๋ณด๋ฉด, ๋ญ๊ฐ ์ด์ํ๊ฒ ๋์ ๋ณด์ผ ๊ฒ์ด๋ค.
์๋ํ๋ฉด, sum์ ํ์ฌ ์๊ฐ ๋ฒ์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ํ์๋์ ์์ธ ๊ฐ์๋ฅผ ์ง๊ณํ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ํ์ฌ ์๊ฐ ํํฐ๋ฅผ ๊ณ ๋ คํด์
sum(increase(http_server_request_duration_seconds_count{service_namespace="prod", service_name="...-API"}[$__range]))

Group by
ํน์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฌถ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ ์ฟผ๋ฆฌ๋ span_name(API ์ด๋ฆ)์ ๊ธฐ์ค์ผ๋ก ๋ฉํธ๋ฆญ์ ๊ทธ๋ฃนํํ๋ค.
sum(increase(http_server_request_duration_seconds_count{span_kind="SPAN_KIND_SERVER", service_name="$app", service_namespace="$env", http_route=~"$route"}[$__range])) by(span_name)

์ด๋ฐ ๊ฒฝ์ฐ์๋ chart ๊ณ์ด panel์ด ์ ํฉํ ํธ์ด๋ค.

rate
rate๋ ํน์ ์๊ฐ ๋จ์๋ง๋ค ๋ฉํธ๋ฆญ์ด ๋ช๊ฐ ์์๋์ง๋ฅผ ๋น์จ๋ก ์ธก์ ํ๋ ์ง๊ณ ํจ์๋ค. TPS ๊ฐ์ ๊ฒ์ ํํํ๊ธฐ์ ๊ฐ์ฅ ์ ํฉํ๋ค.
๋ณดํต range vector์ ํจ๊ป ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ฅผ ์ง ๋ค๋ฉด
rate(http_server_request_duration_seconds_count{service_namespace="prod", service_name="...-API"}[1m])
1๋ถ ๋ด์ ๋ช๊ฑด์ง ํธ์ถ๋์๋์ง๋ฅผ ๋ฝ์๋ธ ๋ค์์, ์ด๋น ๊ฐ์๋ฅผ ์ถ์ถํ๋ค.
1๋ถ ์์ ์์ธ ๋ฉํธ๋ฆญ์ด 120๊ฐ๋ผ๋ฉด tps๋ 2๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ด์ธ์๋ ํจ์๋ค์ ๊ฝค ๋ง๋ค. ๋ชจ๋ ๊ฑธ ์ฌ๊ธฐ์ ๋ค ๋ค๋ฃฐ ์๋ ์๊ณ ๊ธฐ๋ณธ์ ์ธ ๊ฒ๋ค๋ง ๋ค๋ค๋ค.
ํจ์๋ค์ ๋ํ ์ ๋ณด๋ฅผ ์ํ๋ค๋ฉด ๋ณ๋ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๊ธธ ๋ฐ๋๋ค.
https://prometheus.io/docs/prometheus/latest/querying/functions/
์ฐธ์กฐ
https://prometheus.io/docs/prometheus/latest/querying/basics/
https://prometheus.io/docs/prometheus/latest/querying/functions/