모니터링 스터디의 마지막 여정입니다. 지금까지 우리는 프로메테우스를 통해 시스템 곳곳의 데이터를 수집하고, PromQL로 의미를 추출하는 방법을 배웠습니다. 이제 이 데이터를 '한눈에' 파악할 수 있도록 시각화하는 방법을 배울 차례입니다. Grafana는 단순히 그래프를 그리는 도구를 넘어, 데이터를 탐색하고 인사이트를 발견하는 강력한 '관제 센터'를 구축하게 해줍니다.
이번 장의 목표는 정적인 대시보드를 넘어, 템플릿 변수(Template Variables)를 활용하여 사용자와 상호작용하는 동적(Dynamic) 대시보드를 만드는 것입니다.
Grafana의 동작은 매우 간단합니다.
Configuration > Data Sources > Add data source)이제 4대 골든 시그널을 시각화하는 기본 패널들을 만들어보며 감을 익혀봅시다.
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) - Time series 패널 사용
sum(rate(http_requests_total[5m])) - Time series 패널 사용
sum(rate(http_requests_failed_total[5m])) / sum(rate(http_requests_total[5m])) - Gauge 또는 Stat 패널 사용
100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) - Time series 패널 사용
만약 서비스 A, B, C를 위한 대시보드를 각각 만들어야 한다면 끔찍할 겁니다. 템플릿 변수는 이런 반복 작업을 없애주는 마법 같은 기능입니다. 대시보드 상단에 드롭다운 메뉴를 만들어, 사용자가 원하는 값을 선택하면 대시보드 전체가 그 값에 맞춰 동적으로 변경됩니다.
템플릿 변수는 프로그래밍에서 사용하는 '함수의 파라미터'와 같습니다. function drawChart(job) { ... } 라는 함수를 만들어두면, drawChart("service-A"), drawChart("service-B") 처럼 파라미터만 바꿔서 재사용할 수 있습니다. 템플릿 변수 $job을 만들면, 패널의 쿼리에서 이 변수를 사용하여 동적으로 대상을 바꿀 수 있습니다.
$job, $instance 변수 만들기대시보드 설정(오른쪽 위 톱니바퀴) > Variables > Add variable 로 이동하여 아래와 같이 변수를 만들어봅시다.
$job 변수 만들기
jobQuerylabel_values(up, job) (up 메트릭에서 job 레이블의 모든 고유 값을 가져옵니다)$instance 변수 만들기 (연동형)
instanceQuerylabel_values(up{job=~"$job"}, instance) (위에서 선택된 $job에 속한 instance 레이블 값만 가져옵니다)
이제 대시보드 상단에 job과 instance를 선택할 수 있는 드롭다운 메뉴가 생겼습니다. 패널의 PromQL 쿼리를 아래와 같이 수정하면, 드롭다운 선택에 따라 그래프가 실시간으로 바뀝니다.
# 수정 전
sum(rate(http_requests_total{job="my-app"}[5m]))
# 수정 후
sum(rate(http_requests_total{job=~"$job", instance=~"$instance"}[5m]))
=~ 연산자는 무엇인가요?
PromQL에서 =~는 '정규식 매치'를 의미합니다. Grafana 변수에서 'Multi-value'나 'All' 옵션을 활성화하면, 변수값은 (value1|value2|...) 형태의 정규식으로 확장됩니다. 따라서 = 대신 =~를 사용해야 여러 값을 동시에 필터링할 수 있습니다.
템플릿 변수의 진정한 힘은 '반복' 기능과 만났을 때 발휘됩니다. "선택된 모든 인스턴스에 대해 각각의 CPU 사용률 그래프를 보여줘" 와 같은 요구사항을 단 하나의 패널 설정으로 구현할 수 있습니다.
방법:
avg by (instance) (rate(node_cpu_seconds_total{instance="$instance", mode="idle"}[1m])) 처럼 작성합니다. (여기서는 단일 선택을 가정하여 = 사용)instance 변수를 선택합니다.Horizontal 또는 Vertical을 선택합니다.
이제 대시보드 상단의 $instance 드롭다운에서 여러 인스턴스를 선택하면, 그 수만큼 CPU 그래프 패널이 자동으로 생성되어 나열됩니다. 로우(Row) 전체에 반복 설정을 적용하면 관련된 패널 그룹 전체를 동적으로 생성할 수도 있습니다.
모든 대시보드를 처음부터 만들 필요는 없습니다. 세상에는 이미 훌륭한 개발자들이 만들어 공유한 수많은 대시보드들이 있습니다.
Dashboards > Import 로 이동하여 ID를 붙여넣으면 거의 모든 설정이 자동으로 완료됩니다.중요한 것은 단순히 Import해서 사용하는 데 그치지 않고, 내부의 PromQL 쿼리를 분석하고 우리 팀의 환경에 맞게 수정(Customize)하여 완전히 내 것으로 만드는 과정입니다. 이 과정 자체가 훌륭한 PromQL 학습이 됩니다.
Q: "Grafana의 템플릿 변수를 사용해본 경험이 있나요? 어떤 문제를 해결했나요?"
A: "네, 템플릿 변수는 대시보드의 재사용성을 극대화하는 데 필수적이었습니다. 예를 들어, 여러 마이크로서비스를 모니터링하기 위해 $service_name이라는 변수를 만들었습니다. 그리고 패널들의 쿼리에서 {job=~"$service_name"} 과 같이 이 변수를 사용했습니다. 덕분에 서비스별로 대시보드를 따로 만들 필요 없이, 대시보드 상단의 드롭다운 메뉴에서 원하는 서비스를 선택하기만 하면 해당 서비스의 Latency, RPS, Error Rate 등을 한 번에 볼 수 있었습니다. 이는 대시보드 관리 비용을 획기적으로 줄여주었고, 새로운 서비스가 추가될 때도 별도의 대시보드 작업 없이 모니터링을 즉시 시작할 수 있게 해주었습니다."
Q: "쿠버네티스 환경처럼 Pod IP가 계속 변하는 동적인 환경에서, 특정 Pod의 상세 메트릭을 보고 싶을 때 대시보드를 어떻게 구성하시겠어요?"
A: "이런 동적 환경에서는 연쇄적인 템플릿 변수와 반복 패널 기능이 매우 유용합니다. 먼저, $namespace 변수를 만들어 네임스페이스를 선택하게 하고, 그 다음 $pod 변수를 label_values(kube_pod_info{namespace=~"$namespace"}, pod) 쿼리를 사용하여 선택된 네임스페이스에 속한 Pod 목록만 동적으로 가져오도록 만듭니다. 마지막으로, CPU, 메모리, 네트워크 사용량을 보여주는 패널들을 하나의 로우(Row)로 묶고, 이 로우 자체에 'Repeat for $pod' 설정을 적용합니다. 이렇게 하면 사용자가 드롭다운에서 특정 Pod들을 선택했을 때, 선택된 각 Pod에 대한 상세 메트릭 패널 그룹이 자동으로 생성되어 펼쳐지므로 매우 효율적인 분석이 가능합니다."
Q: "Grafana의 `$__rate_interval` 변수에 대해 아시나요? 어떤 장점이 있나요?"
A: "네, $__rate_interval은 Grafana가 제공하는 내장 변수로, 현재 대시보드에서 보고 있는 시간 범위(Time range)와 그래프의 해상도(픽셀)를 고려하여 rate() 함수에 가장 적합한 시간 간격을 동적으로 계산해주는 변수입니다. 예를 들어, 1주일 범위를 볼 때는 [5m] 정도로 넓게, 5분 범위를 확대해서 볼 때는 [15s] 정도로 좁게 자동으로 조절됩니다. 쿼리에 rate(metric[$__rate_interval])처럼 하드코딩된 시간 대신 이 변수를 사용하면, 사용자가 그래프를 확대/축소할 때마다 불필요하게 데이터가 누락되거나 과도하게 평균화되는 것을 방지하고 항상 최적의 해상도로 데이터를 볼 수 있는 장점이 있습니다."