같은 대시보드를 여러 대상에 재사용하려면 쿼리에 박힌 값을 변수로 빼야 한다. Grafana 의 변수는 대시보드 상단의 드롭다운으로 노출되고 쿼리·패널 제목·링크 어디에서나 $name 으로 참조된다. 시간 관련 값은 변수가 아니라 Grafana 가 미리 정의한 매크로로 다룬다.
Dashboard settings → Variables → New variable 에서 만든다.
| 타입 | 쓰임 |
|---|---|
| Query | 데이터 소스에 질의해 목록을 만든다. 가장 많이 쓴다 |
| Custom | 값을 직접 쉼표로 나열한다 |
| Constant | 고정값. 드롭다운에 노출하지 않고 쿼리에서만 쓴다 |
| Interval | 1m,5m,1h 처럼 집계 구간을 고르게 한다 |
| Data source | 같은 대시보드를 여러 데이터 소스에 쓰게 한다 |
| Ad hoc filters | 사용자가 임의의 레이블 필터를 붙이게 한다 (Prometheus · Loki 등) |
| Text box | 자유 입력 |
Prometheus 에서 목록을 만드는 함수는 label_values() 와 query_result() 다.
label_values(node_uname_info, instance)
label_values(kube_pod_info{namespace="$namespace"}, pod)
두 번째처럼 다른 변수를 참조하면 연쇄 변수가 된다. 앞의 변수를 바꾸면 뒤의 목록이 다시 만들어진다.
기본은 $name 이지만, 변수 이름 뒤에 글자가 바로 붙는 자리에서는 경계를 명시해야 한다.
$instance 기본
${instance} 뒤에 문자가 이어질 때
${instance:raw} 따옴표 없이 원본 그대로
[[instance]] 옛 문법. 새로 쓰지 않는다
여러 값을 고를 수 있게 하려면 변수 설정에서 Multi-value 를 켜고, 쿼리에서는 정규식으로 받는다. All 옵션을 켜면 .* 로 치환되게 Custom all value 를 지정할 수 있다.
node_cpu_seconds_total{instance=~"$instance"}
= 가 아니라 =~ 인 점이 중요하다. 다중 선택 시 Grafana 는 값을 a|b|c 로 이어 붙이므로 정규식 연산자여야 매칭된다.
현재 시각과 선택된 시간 범위는 변수가 아니라 매크로로 들어온다. 데이터 소스마다 이름이 다르다.
SQL 계열(MySQL · PostgreSQL · Microsoft SQL Server) 에서 쓰는 것들이다.
SELECT $__timeGroup(ts, $__interval) AS time, avg(value) AS value
FROM metrics
WHERE $__timeFilter(ts)
GROUP BY 1
ORDER BY 1;
| 매크로 | 치환 결과 |
|---|---|
$__timeFilter(col) |
col BETWEEN <from> AND <to> 형태의 조건 |
$__timeFrom() |
선택 범위의 시작 시각 |
$__timeTo() |
선택 범위의 끝 시각 |
$__interval |
패널 폭에 맞춰 Grafana 가 고른 집계 간격 |
$__interval_ms |
같은 값을 밀리초로 |
$__timeGroup(col, interval) |
시간 버킷 그룹핑 구문 |
Prometheus 계열에서는 $__interval · $__range · $__rate_interval 을 쓴다. rate() 의 구간에는 $__rate_interval 을 쓰는 것이 안전하다 — 스크레이프 주기를 반영해 최소 구간을 보장하므로, 범위를 넓혔을 때 그래프가 비는 일이 줄어든다.
sum(rate(http_requests_total{job="$job"}[$__rate_interval]))
대시보드의 시간 범위는 보통 now-6h ~ now 로 상대 지정한다. 이때 "현재 시각"은 $__timeTo() 다. 범위와 무관하게 진짜 현재 시각이 필요하면 쿼리 언어 쪽 함수(SQL 의 now() · current_timestamp, PromQL 의 time())를 쓴다. 두 값은 대시보드를 과거 구간으로 옮기는 순간 달라지므로 혼용하지 않는다.
시간대도 주의한다. Grafana 는 브라우저 시간대로 렌더링하는 것이 기본이고 데이터 소스는 UTC 로 저장하는 경우가 많다. 대시보드 설정에서 시간대를 고정해 두면 보는 사람마다 다른 시각이 나오는 문제를 피할 수 있다.