LabHub
배우기 러닝패스 코스

Grafana — 대시보드는 질문이다 · 표와 변환 — 목록형 질문은 그래프가 아니다 · 실습

순위를 묻는 패널을 표로 옮긴다

LabHub 에서 이어서 보기

목표

선 그래프 넷이 겹친 대시보드를 받아, 순위를 묻는 패널을 표로 옮기고 reduce·organize·joinByField 변환으로 읽을 수 있는 모양을 만듭니다.

왜 중요한가

대시보드가 답해야 하는 질문은 크게 둘이다 — '언제부터 이랬나' 와 '어느 것이 가장 나쁜가'. 앞의 것은 시간에 따른 움직임이라 선 그래프가 맞지만, 뒤의 것은 한 순간의 정렬된 목록이라 선 그래프가 답하지 못한다. 계열 넷의 값이 서로 가까우면 선은 엉키고, 순위를 알려면 한 시각을 골라 값을 넷 읽고 머릿속에서 정렬해야 한다. 여덟 개가 되면 아무도 그 일을 하지 않는다. 표는 그 정렬을 화면이 대신 해 주는 모양이고, 변환은 시계열을 표가 읽을 수 있는 모양으로 바꾸는 도구다. 다만 모든 패널을 표로 바꾸면 더 나빠진다 — 옮길 것은 순위를 묻는 패널뿐이다.

단계

1. lab-start-grafana 로 Grafana 를 띄우고, /opt/lab/gfd/gfd-table/ranking.json고치지 말고 그대로 Grafana 에 올리세요(uid 는 파일에 적힌 gfd-table, 패널 4개). curl/api/dashboards/db 에 POST 하면 됩니다. 올린 뒤 웹 프리뷰 3000번 포트로 한 번 열어 네 패널이 어떻게 보이는지 눈으로 확인해 두세요.
2. 1번 패널은 핸들러 넷의 p95 를 겹쳐 그립니다. 지나간 시각을 하나 골라(지금보다 1시간 이상 앞, 6시간 이내) 그 순간의 p95 를 핸들러마다 재고, /root/gfd-table/02-rank.txtat= rank1= rank2= rank3= rank4= gap= 여섯 줄로 적으세요. at 은 epoch 초, rank1~rank4 는 p95 가 큰 것부터 순서대로 적은 핸들러 이름, gap 은 1등과 4등의 p95 차이(초)입니다.
3. 먼저 표가 몇 줄이 되는지 재세요. 지나간 구간을 하나 골라(1시간 이상, 끝은 지금보다 앞) 1번 패널의 쿼리를 그 구간에 step 60 으로 던지고, /root/gfd-table/03-table.txtstart= end= series= points= rows= 다섯 줄을 적으세요 — series 는 같은 쿼리를 end 시각의 순간값으로 던졌을 때 돌아온 계열 수, points 는 구간 질의가 계열 하나에 돌려준 점 개수, rows 는 둘을 곱한 값입니다. 그리고 5번 패널을 새로 만드세요: typetable, 쿼리는 1번 패널과 같은 것을 formattable 로 두고 구간 질의로(instant 를 참으로 두지 말 것) 던집니다.
4. 5번 패널에 reduce 변환을 붙이세요. transformations 배열에 idreduce 인 항목을 하나 두고, options.modeseriesToRows, options.reducerslastNotNull 하나만 담습니다. 쿼리는 그대로 구간 질의로 둡니다 — 줄이는 일을 변환이 하는지 보려는 것이니까요. 고친 대시보드를 저장하세요.
5. 5번 패널의 transformations 배열에 reduce 뒤로 idorganize 인 항목을 하나 더 붙이세요. options.renameByName 에서 FieldLast * 두 열의 이름을 각각 다른 한국어 이름으로 바꾸고, options.indexByName 으로 그 두 열의 순서를 0 과 1 로 못박으세요. 고친 대시보드를 저장하세요.
6. 6번 패널을 새로 만드세요. typetable, 쿼리는 둘입니다 — refIdA 인 것은 sum by (handler) (rate(http_requests_total{job="shop-api"}[5m])), refIdB 인 것은 1번 패널과 같은 p95 쿼리입니다. 두 쿼리 모두 instant 를 참으로, formattable 로 두세요. 그리고 transformationsidjoinByField 인 항목을 하나 두고 options.byFieldhandler, options.modeouter 로 하세요.
7. 6번 패널의 기본 셀 표시(fieldConfig.defaults.custom.cellOptions.type)는 auto 로 두고, fieldConfig.overridesp95 값 열 하나만 지목하는 덮어쓰기를 하나 추가하세요. 덮어쓰기의 matcher.idbyName, properties 에는 custom.cellOptions(typecolor-background 로)와 thresholds(단계 2개 이상, 마지막 단계는 숫자 문턱) 를 담습니다. 그리고 /root/gfd-table/07-cells.txtrule1= rule2= rule3= 세 줄로 표의 셀에 색을 붙일 때 지켜야 할 규칙을 각 40자 이상, 서로 다르게 적으세요.
8. 2번 패널(핸들러별 5xx 비율)도 순위를 묻는 패널입니다. typetable 로 바꾸고 쿼리는 그대로 둔 채 instant 를 참, formattable 로 하고, organize 변환으로 Time 열을 감추고(excludeByName 에서 Time 을 참으로) 남는 두 열의 이름을 바꾸세요. 4번 패널(전체 요청률)은 손대지 마세요 — 순위를 묻는 패널이 아닙니다. 그리고 지금 올라간 대시보드를 그대로 내려받아 /root/gfd-table/fixed.json 에 저장하고(.dashboard 본문만), /root/gfd-table/08-review.mdR1= 부터 R4= 까지 네 줄로 무엇을 왜 바꿨는지 각 30자 이상 적으세요.

참고

단계 8개

  1. 선 그래프 넷짜리 대시보드를 그대로 올린다
  2. 선 그래프에서 순위를 읽어 본다
  3. 같은 질문을 표로 옮긴다
  4. 변환으로 계열마다 한 숫자만 남긴다
  5. 열 이름과 순서를 사람이 읽을 수 있게 만든다
  6. 두 쿼리를 라벨로 붙여 한 표에 놓는다
  7. 색은 문턱이 있는 열 하나에만 붙인다
  8. 아직 선으로 남은 순위 패널을 표로 바꾼다