Grafana — 대시보드는 질문이다 · 표와 변환 — 목록형 질문은 그래프가 아니다 · 이론
순위를 묻는 질문은 선 그래프가 못 받는다
한 줄 요약
"어느 것이 가장 나쁜가" 는 순위를 묻는 질문이고, 순위는 선 그래프가 대답하지 못한다. 표와 변환이 그 질문을 받는 도구다.
왜 이게 필요했나
장애 회의에서 가장 자주 나오는 질문은 둘 중 하나다. "언제부터 이랬나" 와 "어느 것이 가장 나쁜가". 앞의 것은 시간에 따른 움직임을 묻고, 뒤의 것은 한 순간의 목록을 묻는다. 그런데 대시보드는 대개 앞의 것만 답할 수 있는 모양으로 만들어져 있다.
핸들러 넷의 p95 를 한 패널에 겹쳐 그려 놓았다고 하자. 값이 0.216 · 0.219 · 0.229 · 0.233 처럼 서로 가까우면 네 선은 계속 엉킨다. 어느 선이 어느 핸들러인지 범례에서 색을 찾아 맞춰야 하고, 순위를 알려면 마우스를 한 시각에 올려 값 넷을 읽고 머릿속에서 정렬해야 한다. 여덟 개가 되면 아무도 그 일을 하지 않는다. 그냥 "다 비슷해 보이네" 하고 넘어간다.
이건 그리기 취향의 문제가 아니다. 질문의 모양과 답의 모양이 어긋난 것이다. 순위를 묻는 질문의 답은 정렬된 목록이고, 정렬된 목록을 보여 주는 모양은 표다.
어떻게 동작하나
Grafana 에서 시계열을 표로 옮기는 일은 세 겹으로 나뉜다. 첫째는 질의다. 같은 PromQL 이라도 순간값 질의(instant)로 던지면 계열마다 값이 하나씩 오고, 구간 질의(range)로 던지면 계열마다 점이 수십에서 수백 개씩 온다. Prometheus 데이터소스의 쿼리 편집기에는 이 둘을 고르는 자리와 결과를 무슨 모양으로 받을지 고르는 자리가 따로 있다([Prometheus 쿼리 편집기 문서](https://grafana.com/docs/grafana/latest/datasources/prometheus/query-editor/)). 대시보드 JSON 에서는 쿼리마다 instant 와 format 두 열쇠로 남는다.
구간 질의를 표에 그대로 부으면 줄 수가 계열 수에 점 개수를 곱한 만큼이 된다. 계열 넷에 두 시간을 60초 간격으로 보면 4 곱하기 121, 484줄이다. 아무도 읽을 수 없다. 그래서 둘째 겹이 필요하다 — 변환이다.
| 변환 | 하는 일 | 표에서의 효과 |
| --- | --- | --- |
| reduce | 계열 하나를 숫자 하나로 줄인다 | 484줄이 4줄이 된다 |
| organize | 열을 감추고 이름을 바꾸고 순서를 정한다 | Field 가 핸들러 가 된다 |
| joinByField | 두 쿼리의 결과를 공통 열로 붙인다 | 지연과 요청률이 한 줄에 온다 |
reduce 는 "계열마다 한 숫자" 를 만든다. 마지막 값을 고르면 "지금", 최댓값을 고르면 "이 구간의 최악" 이다. 셋째 겹은 표시다. 표의 셀에는 색이나 막대를 붙일 수 있는데([표 시각화 문서](https://grafana.com/docs/grafana/latest/visualizations/panels-visualizations/visualizations/table/)), 여기에 규칙이 하나 있다. 색은 문턱이 있는 숫자 열에만 붙인다. 핸들러 이름 열까지 색이 칠해지면 색이 아무 뜻도 없는 장식이 되고, 그 순간 다른 곳의 진짜 빨강도 같이 힘을 잃는다. 그래서 색은 패널 기본값이 아니라 그 열 하나를 지목하는 덮어쓰기로 붙인다.
두 쿼리를 한 표에 붙이는 일도 자주 필요하다. "느린 핸들러가 트래픽도 많이 받는가" 는 지연 하나만으로도, 요청률 하나만으로도 답할 수 없다. 둘을 핸들러 이름으로 붙여 한 줄에 놓아야 비로소 눈이 관계를 본다.
현장에서 만나는 모습
결제 팀의 상태 대시보드에는 엔드포인트 열두 개의 p99 가 한 패널에 겹쳐 있었다. 사고가 나면 사람들은 그 패널을 열고 "뭔가 올라갔네" 까지만 말했다. 어느 엔드포인트인지 알아내는 데 매번 3분씩 걸렸다. 같은 쿼리를 순간값으로 던져 표로 바꾸고 p99 로 내림차순 정렬해 두자, 다음 사고에서는 화면을 연 지 5초 만에 이름이 나왔다. 쿼리는 한 글자도 바뀌지 않았다.
반대 방향의 실수도 있다. 전체 요청률처럼 시간에 따른 움직임을 묻는 패널까지 표로 바꾸면 더 나빠진다. 숫자 하나로는 어제와 같은지 알 수 없다. 표로 옮길 것은 순위를 묻는 패널뿐이다.
이 환경에서 판정할 수 있는 것과 없는 것
변환은 서버가 아니라 브라우저에서 계산된다. 그래서 이 파드에서는 변환이 적용된 표가 실제로 어떻게 보이는지를 볼 방법이 없다. 이미지 렌더러 플러그인도 없다. 대신 판정은 두 가지로 한다 — 대시보드 JSON 모델에 적힌 transformations·type·options 와 쿼리의 instant·format, 그리고 그 쿼리를 데이터소스로 실제로 던져 나온 값이다. 열 너비나 색이 눈에 어떻게 보이는지는 결국 웹 프리뷰로 3000번 포트를 열어 한 번 봐야 한다.
다음 실습에서 할 것
선 그래프에서 순위를 읽으려는 일을 한 번 직접 해 본다 — 지나간 한 시각을 못박고 핸들러 넷의 p95 를 내림차순으로 적어 보면, 그 일이 왜 눈으로 안 되는지 숫자로 드러난다. 그다음 같은 질문을 표로 옮기고, 구간 질의가 표에서 몇 줄이 되는지 재어 본 뒤 reduce 로 줄이고 organize 로 열을 정리한다. 두 쿼리를 joinByField 로 붙여 한 표에 놓고, 색은 문턱이 있는 열 하나에만 덮어쓰기로 붙인다. 마지막에는 아직 선 그래프로 남아 있는 순위 패널을 직접 표로 바꿔 제출한다.