LabHub
배우기 러닝패스 코스

Grafana — 대시보드는 질문이다 · 대시보드의 비용 · 실습

이 대시보드 하나가 1분에 몇 번을 던지는가

LabHub 에서 이어서 보기

목표

대시보드 하나의 질의 횟수·계열 수·점 개수를 실제로 재어 값을 매기고, 예산을 파일과 검사기로 적은 뒤 그 예산 안에 드는 판을 만들어 제출합니다.

왜 중요한가

대시보드는 공짜로 보인다. 패널을 하나 더 붙이는 일은 클릭 세 번이고 비용은 다른 팀의 Prometheus 에서 발생하기 때문이다. 그래서 대시보드는 언제나 무거워지는 쪽으로만 자란다. 값을 매기는 셈법 자체는 어렵지 않다 — 패널마다 붙은 쿼리를 더하고, 목록을 서버에 물어보는 변수를 더하면 한 번 열 때의 질의 수이고, 여기에 자동 새로고침 주기를 곱하면 분당 질의 수다. 쿼리 열 개에 10초 새로고침이면 1분에 예순 번, 하루에 팔만 번이고, 그 화면을 아무도 보지 않는 밤에도 똑같이 날아간다. 이 숫자를 한 번 세어 본 팀과 세어 보지 않은 팀은 대시보드를 대하는 태도가 달라진다.

단계

1. lab-start-grafana 로 Grafana 를 띄우고, /opt/lab/gfd/gfd-perf/heavy.json고치지 말고 그대로 Grafana 에 올리세요(uid 는 파일에 적힌 gfd-perf, 패널 8개). curl/api/dashboards/db 에 POST 하면 됩니다. 이 대시보드는 이 실습이 끝날 때까지 원본으로 그대로 남겨 둡니다 — 줄인 판은 마지막 단계에서 다른 uid 로 따로 저장합니다.
2. Grafana 에 올라간 대시보드를 내려받아 세세요. /root/gfd-perf/02-count.txtpanels= targets= var_queries= open= 네 줄을 적습니다. panels 는 행(row)을 뺀 패널 수, targets 는 모든 패널의 쿼리 수, var_queriestemplating.listtypequery 인 변수의 수, opentargetsvar_queries 를 더한 값 — 대시보드를 한 번 열 때의 질의 수입니다.
3. 패널마다 붙은 쿼리를 실제로 던져 돌아오는 계열 수를 재세요. 지나간 시각을 하나 골라(지금보다 5분 이상 앞, 6시간 이내) 모든 쿼리를 그 시각의 순간값으로 던집니다. /root/gfd-perf/03-series.txtat= total= top_id= top_series= 네 줄을 적습니다 — at 은 고른 시각의 epoch 초, total 은 대시보드의 모든 쿼리가 돌려주는 계열 수의 합, top_id 는 계열을 가장 많이 돌려주는 패널의 id, top_series 는 그 패널의 계열 수입니다. 가장 무거운 패널의 그래프에 선이 몇 개 그려질지 생각해 보세요.
4. 지나간 구간을 하나 골라(2시간 이상, 끝은 지금보다 앞) 3번 패널의 p95 쿼리를 같은 구간에 step 만 바꿔 두 번 던지세요 — 한 번은 step=15, 한 번은 step=300. /root/gfd-perf/04-points.txtstart= end= points_fine= points_coarse= 네 줄을 적습니다. points_fine 은 step 15 일 때, points_coarse 는 step 300 일 때 계열 하나에 돌아온 점 개수입니다.
5. 대시보드 JSON 의 자동 새로고침 주기를 읽어 /root/gfd-perf/05-rate.txtrefresh= refresh_sec= targets= per_min= 네 줄을 적으세요. refresh 는 JSON 에 적힌 문자열 그대로, refresh_sec 는 그것을 초로 환산한 정수, targets 는 2단계에서 센 쿼리 수, per_mintargets 곱하기 60 / refresh_sec 입니다. 이 실습의 셈법에서는 자동 새로고침이 패널 쿼리만 다시 던지고 변수 질의는 다시 던지지 않는 것으로 봅니다.
6. 3번 패널의 p95 쿼리는 버킷 계열 마흔여덟 개를 읽어 매번 분위수를 계산합니다. /etc/prometheus/rules/gfd-perf.yml 에 그룹 이름 gfd-perf, interval 15초, 레코딩 룰 하나를 두세요 — recordhandler:http_request_duration_seconds:p95, expr 은 3번 패널의 p95 쿼리 그대로입니다. promtool check rules /etc/prometheus/rules/gfd-perf.yml 로 확인한 뒤 curl -X POST http://127.0.0.1:9090/-/reload 로 반영하고, 20초 이상 기다렸다가 promq 'handler:http_request_duration_seconds:p95' 가 값을 돌려주는지 확인하고 다음 단계로 넘어가세요.
7. /root/gfd-perf/budget.txt 에 예산을 다섯 줄로 적으세요 — max_panels=6 max_targets=6 max_var_queries=0 min_refresh_sec=60 max_queries_per_min=6. 그리고 /root/gfd-perf/budget.py 를 만드세요. 예산 파일 경로와 대시보드 JSON 경로를 인자로 받아 위반을 한 줄에 하나씩(B1~B5 로 시작) 출력하고, 위반이 하나라도 있으면 종료 코드 1 로 끝나야 합니다. B1 패널 수 초과 · B2 쿼리 수 초과 · B3 변수 질의 수 초과 · B4 새로고침이 켜져 있는데 주기가 너무 짧음 · B5 분당 질의 수 초과. 원본 /opt/lab/gfd/gfd-perf/heavy.json 에 돌려 다섯 위반이 모두 잡히는지 확인하세요.
8. 원본 gfd-perf 는 그대로 두고, 예산 안에 드는 새 대시보드를 uid gfd-perf-slim 으로 저장하세요. 줄이는 방법은 자유지만 다음 셋은 반드시 들어가야 합니다 — 아무 패널도 쓰지 않는 변수 질의를 없앨 것, 자동 새로고침 주기를 60초 이상으로 바꿀 것, 그리고 p95 패널의 쿼리를 6단계에서 만든 handler:http_request_duration_seconds:p95 로 바꿀 것. 저장한 뒤 그 대시보드를 그대로 내려받아 /root/gfd-perf/fixed.json 에 저장하고(.dashboard 본문만), 7단계의 검사기를 돌려 위반 0 · 종료 코드 0 인 것을 확인하세요. 그리고 /root/gfd-perf/08-review.mdB1= 부터 B5= 까지 다섯 줄로 각 항목을 어떻게 예산 안에 넣었는지 각 30자 이상 적으세요.

참고

단계 8개

  1. 값을 매길 대시보드를 올린다
  2. 한 번 여는 데 질의가 몇 번 날아가는가
  3. 어느 패널이 가장 무거운가
  4. 해상도를 바꾸면 돌아오는 점이 몇 배가 되나
  5. 자동 새로고침을 곱해 분당 질의 수를 낸다
  6. 무거운 계산을 레코딩 룰로 옮긴다
  7. 예산을 적고 그 예산을 검사하는 도구를 만든다
  8. 예산 안으로 줄여 새 판으로 제출한다