LabHub
배우기 러닝패스 코스

Grafana — 대시보드는 질문이다 · 변수와 반복 — 복사 대신 드롭다운 · 실습

대시보드 네 벌을 드롭다운 하나로 접는다

LabHub 에서 이어서 보기

목표

대상마다 복사된 대시보드 네 벌을 직접 만들어 고칠 자리가 몇 군데인지 센 뒤, 질의 변수와 여러 값 선택, 전체 선택, 패널 반복, 의존 변수로 그것을 대시보드 하나로 접습니다. 마지막에는 펼쳐지는 패널 수를 세어 상한을 정하고, 낡은 복사판을 합친 뒤 같은 답이 나오는지 증명합니다.

왜 중요한가

대시보드가 망가지는 가장 흔한 길은 복사다. 복사본은 원본이 고쳐질 때 따라 고쳐지지 않고, 화면은 멀쩡해서 누구도 그 사실을 모른다. 변수는 그 복사를 드롭다운 하나로 바꾼다. 다만 변수를 넣는 일은 선언 한 줄로 끝나지 않는다. 여러 값을 고를 수 있게 하는 순간 값들이 정규식으로 펼쳐지므로 쿼리의 매처도 함께 바뀌어야 하고, 패널 반복을 켜면 화면에 그려지는 패널 수가 옵션 수만큼 곱해진다. 편리함과 비용이 같은 손잡이에 붙어 있는 셈이라, 반복을 쓰는 대시보드에는 펼쳐지는 패널 수의 상한을 함께 정해 두어야 한다. 이 실습은 그 손잡이를 한 번씩 돌려 보고 숫자로 확인한다.

단계

1. lab-start-grafana 로 Grafana 를 띄우고, /opt/lab/gfd/gfd-variables/copy-template.json__UID____ROUTE__ 를 바꿔 가며 네 벌을 올리세요. uid 는 gfd-vars-c1 부터 gfd-vars-c4 까지이고 __ROUTE__ 자리에는 /api/orders, /api/search, /api/users, /healthz 를 하나씩 넣습니다. 그리고 /root/gfd-variables/01-copies.txt 에 세 줄을 적으세요 — dashboards= 는 태그가 gfd-vars-copy 인 대시보드 수, panels_per_dashboard= 는 그중 한 벌의 패널 수, edit_sites= 는 쿼리를 한 번 고칠 때 손대야 하는 자리 수(둘의 곱)입니다.
2. uid 가 gfd-vars 인 대시보드를 새로 만드세요. route 라는 이름의 query 타입 템플릿 변수가 있어야 하고, 그 변수는 label_values(http_requests_total, handler) 로 값을 읽어 옵니다. 패널은 하나이고 쿼리는 handler="$route" 로 좁힌 5xx 비율입니다. 그리고 그 변수가 실제로 얻는 값들을 /root/gfd-variables/02-values.txt 에 한 줄에 하나씩 적으세요.
3. route 변수의 여러 값 선택(multi)과 전체 선택(includeAll)을 켜고, 패널 쿼리에서 핸들러를 고르는 매처를 handler="$route" 에서 handler=~"$route" 로 바꾸세요. 그리고 /root/gfd-variables/03-interp.txtroute_all= 로 시작하는 한 줄을 적으세요 — 네 값이 모두 선택됐을 때 Prometheus 쿼리 안에서 $route 자리에 들어가는 문자열 그대로입니다(괄호와 세로막대를 포함합니다).
4. 5xx 비율 패널에 repeat 을 걸어 route 의 선택된 값마다 패널이 한 장씩 생기게 하세요. repeatDirection 은 가로(h), maxPerRow 는 2 로 둡니다. 패널 제목에는 $route 가 들어가야 어느 경로의 그림인지 알 수 있습니다.
5. code 라는 두 번째 query 변수를 더하세요. 쿼리는 label_values(http_requests_total{handler=~"$route"}, status) 이고 refresh 는 시간 범위가 바뀔 때도 다시 읽는 값(2)으로 둡니다. templating.list 에서 routecode 보다 앞에 있어야 합니다. 그리고 $route$code둘 다 쓰는 패널 하나와, 변수를 하나도 쓰지 않는 전체 요청률 패널 하나를 더해 패널을 셋으로 만드세요. 마지막으로 /root/gfd-variables/05-order.txtorder= 로 시작하는 줄(변수 이름을 templating.list 순서대로 쉼표로 이은 것)과 reason= 으로 시작하는 줄(순서를 그렇게 두어야 하는 이유, 40자 이상)을 적으세요.
6. code 변수도 여러 값 선택(multi)을 켜고, $route$code 를 함께 쓰는 패널에 repeat: code 를 걸어 반복 패널을 둘로 만드세요. 그리고 /root/gfd-variables/06-cost.tsv 에 변수마다 한 줄씩, templating.list 순서대로 탭으로 나눈 네 칸 <변수이름> <옵션수> <그 변수로 반복되는 패널 수> <둘의 곱> 을 적으세요. 이어서 /root/gfd-variables/06-cap.txt 에 세 줄을 적습니다 — static_panels= 는 반복이 걸리지 않은 패널 수, expanded_total= 은 곱의 합에 그 수를 더한 값, max_expanded= 는 이 대시보드에 두기로 정한 상한(지금 값 이상의 정수)입니다.
7. /opt/lab/gfd/gfd-variables/legacy.json 은 같은 패널이 핸들러 값만 바꿔 네 번 붙어 있는 낡은 대시보드입니다. 이것을 uid 가 gfd-vars-new 인 대시보드 하나로 합쳐 올리세요. 조건은 셋입니다 — 패널은 정확히 하나, 그 패널은 여러 값 질의 변수로 반복되고, 쿼리는 그 변수로 좁혀집니다. 변수는 label_values(http_requests_total, handler) 로 값을 읽어 오고 여러 값 선택과 전체 선택이 켜져 있어야 합니다.
8. /root/gfd-variables/08-proof.tsv 에 네 줄을 적으세요. 각 줄은 탭으로 나눈 두 칸 <핸들러 값> <합친 패널의 쿼리에서 변수를 그 값으로 바꾼 PromQL> 입니다. 네 줄의 첫 칸은 http_requests_totalhandler 라벨 값 넷이고, 둘째 칸에는 변수 기호($)가 남아 있으면 안 됩니다. 채점기는 각 줄의 쿼리와 legacy.json 의 같은 핸들러 패널 쿼리를 같은 순간에 던져 값이 같은지 봅니다.

참고

단계 8개

  1. 복사본이 몇 벌인지 세는 것부터
  2. 값 목록을 데이터에서 읽어 오는 변수
  3. 여러 값을 고르는 순간 매처가 바뀐다
  4. 패널 반복 — 대상 수만큼 패널이 생긴다
  5. 변수가 변수에 기댈 때 — 순서와 갱신
  6. 펼쳐지는 패널 수를 세고 상한을 정한다
  7. 복사판 네 패널을 변수 하나로 합친다
  8. 합친 패널이 원래 네 패널과 같은 답을 내는가