Grafana 입문 5편 — Dashboard · Panel · Variable 깊이

2026-05-18Grafana 입문에서 운영까지

Grafana 입문 5편. Dashboard · Panel · Variable 깊이 — 15+ Panel 종류 (Time series · Stat · Gauge · Bar · Pie · Table · Heatmap · Histogram · Logs · Trace · Geomap · State Timeline · Status History · Node Graph · Candlestick · Canvas · News · Text), Variable 의 7 type (Query · Custom · Constant · Datasource · Interval · Ad hoc · Text Box) 의 cascading dropdown, Transformation 의 26 종, Annotation 의 자동화 (CI/CD · Loki query · GitHub release), Library Panel · Dashboard JSON, Folder · Permission · Public Dashboard · Reporting. Dashboard 의 production-ready 패턴.

📚 Grafana 입문에서 운영까지 · 5편 — Dashboard · Panel · Variable 깊이

이 글은 Grafana 입문에서 운영까지 시리즈 5편이에요. 4편 Tempo 까지가 데이터 인프라 였다면 5편은 데이터 시각화 의 자리.

이번 글의 범위

Dashboard 는 Grafana 의 얼굴 이라, 같은 데이터라도 디자인에 따라 사용성 · 신뢰도 가 크게 갈려요.

자리 자산
Panel 15+ 종 시각화
Variable 7 type 의 dropdown (cascading)
Transformation Panel 의 data 변형 26 종
Annotation event 표시 자동화
운영 Library Panel · Folder · Permission · Public · Reporting

Panel 종류 — 15+ 종

시계열 시각화

1. Time Series (가장 흔함)
   - 선 차트
   - 여러 series 같은 시간축
   - threshold · area fill · gradient

2. Bar Chart
   - 카테고리 별 막대
   - 시계열 X (시간 무관 데이터)

3. Histogram
   - 분포 시각화
   - bucket 별 빈도

4. Heatmap
   - 시간 × 값 의 밀도
   - latency 분포 의 시계열 변화 최적

5. State Timeline
   - 시간 별 상태 (UP · DOWN · DEGRADED)
   - boolean · enum 시각화

6. Status History
   - 비슷 하지만 더 단순
   - 0/1 또는 상태 의 시간 변화

7. Candlestick
   - 금융 차트 (open · high · low · close)
   - trading dashboard 용

단일 값 시각화

8. Stat
   - 큰 숫자 한 개
   - sparkline (작은 trend)
   - 색상 threshold

9. Gauge
   - 게이지 (속도계 같은)
   - 0 ~ max 의 시각

10. Bar Gauge
   - 가로 막대 progress
   - 여러 metric 비교 (CPU · 메모리 · 디스크)

11. Pie Chart
   - 비율
   - 카테고리 별 share

표 · 텍스트

12. Table
   - 행/열 데이터
   - 셀 stylign · conditional formatting

13. Logs
   - Loki · Elasticsearch 의 로그 표시
   - tail · search · level filter

14. Text
   - Markdown · HTML
   - dashboard 의 설명 · 링크

15. News
   - RSS feed
   - Grafana Labs 의 announcements 자동

특수

16. Trace (Distributed Tracing)
   - Tempo · Jaeger 의 trace view
   - timeline · service graph

17. Geomap
   - 지도 위 데이터
   - region 별 KPI

18. Node Graph
   - 노드 + 엣지 (의존성 그림)
   - Tempo Service Graph 와 결합

19. Canvas
   - 자유 디자인
   - 도형 · 이미지 · 동적 텍스트
   - architecture diagram 의 live data

20. Annotations List
   - 모든 annotation 의 리스트
   - 최근 배포 · incident 추적

21. Alert List
   - 활성 alert 목록

22. Dashboard List
   - 다른 dashboard 의 링크
   - portal 페이지 용

Panel 선택 가이드

시계열 metric → Time Series
단일 KPI    → Stat
범위 의식     → Gauge · Bar Gauge
분포        → Histogram · Heatmap
상태        → State Timeline · Status History
로그        → Logs
표 데이터     → Table
지도        → Geomap
의존성       → Node Graph
설명/링크     → Text · Dashboard List

KPI(핵심 성과 지표) 는 여기서 처음 나오는데, 시험 함정도 같은 자리에 있어요. 모든 panel 을 다 쓰려고 덤비지 마세요. Time Series + Stat + Table 만으로 80% 의 사용 case 가 풀리고 나머지는 특수 case 일 뿐이에요.

Variable — Dynamic Dashboard

Variable 의 7 Type

1. Query
   - datasource 에서 자동 옵션
   - 예: label_values(up, instance) → 모든 instance

2. Custom
   - 직접 입력 (comma separated)
   - 예: dev, staging, prod

3. Constant
   - 고정값 (URL 에 안 노출)
   - 예: API_KEY 같은 secret

4. Data source
   - datasource 자체를 dropdown
   - 같은 dashboard 가 여러 env 의 datasource

5. Interval
   - 시간 간격 ($__interval)
   - 1m, 5m, 10m, 30m, 1h, 6h, 12h, 1d
   - rate · increase 의 window 동적

6. Ad hoc filter
   - dashboard 의 모든 panel 에 자동 filter 추가
   - 사용자가 dropdown 에 임시 filter

7. Text Box
   - 자유 입력
   - search · filter 의 임시 값

Cascading Dropdown (Chain)

Cascading dropdown 은 이전 variable 의 선택값이 다음 variable 의 query 에 들어가는 사슬 구조에요.

$environment → Custom: dev, staging, prod
$cluster     → Query: label_values(up{env="$environment"}, cluster)
$namespace   → Query: label_values(up{env="$environment", cluster="$cluster"}, namespace)
$pod         → Query: label_values(up{env="$environment", cluster="$cluster", namespace="$namespace"}, pod)

이렇게 environment → cluster → namespace → pod 순서로 좁혀가야 사용자가 의미 있는 범위만 골라볼 수 있어요.

Multi-Value · All

Variable 옵션:
  - Multi-value:    여러 값 선택 가능
  - Include All:    "전체" 옵션
  - Custom all value: "전체" 의 의미 (예: ".*" regex)

Panel 의 Query 안 변수

# Multi-value 처리 — regex 자동
rate(http_requests_total{
  env="$environment",
  service=~"$service",  ← 여러 값 선택 시 자동 regex
  cluster="$cluster"
}[$__interval])

# All 의 처리
rate(http_requests_total{
  service=~"${service:regex}"  ← regex format
}[$__interval])

Variable Format Modifier

${variable}              기본 — 값 그대로
${variable:regex}        regex format (multi-value 처리)
${variable:csv}          comma-separated
${variable:json}         JSON array
${variable:queryparam}   URL parameter format
${variable:text}         사용자 보이는 텍스트

Transformation — Panel Data 변형

Transformation 의 자리

Query 결과 → Transformation → Visualization

용도:
  - 여러 query 결과 결합
  - 값 계산 (rate · diff · percentage)
  - 컬럼 rename
  - filter · group · sort

26 종 Transformation

구조 변형:
  - Add field from calculation
  - Concatenate fields
  - Convert field type
  - Extract fields
  - Filter data by query
  - Filter data by values
  - Filter fields by name
  - Group by
  - Group to nested table
  - Heatmap
  - Histogram
  - Join by field
  - Join by labels
  - Labels to fields
  - Limit
  - Merge
  - Organize fields (rename · reorder · hide)
  - Outer join
  - Partition by values
  - Reduce
  - Rename by regex
  - Rows to fields
  - Series to rows
  - Sort by
  - Spatial operations
  - Time series to table

실전 예 1: Multiple datasource join

Query A: Prometheus 의 RPS by service
Query B: Loki 의 error rate by service

Transformation:
  - Join by field (service)
  - 결과: RPS + error_rate 같은 행

여기서 RPS(초당 요청 수) 가 첫 등장이라 풀어둬요.

실전 예 2: Add field from calculation

Query: http_requests (count) · http_errors (count)

Transformation: Add field from calculation
  Mode: Binary operation
  Field: error_rate
  Expression: http_errors / http_requests * 100

→ 차트 의 새 열 (계산된 error percentage)

실전 예 3: Organize fields

Query 결과:
  __name__: http_requests_total
  job: api
  instance: 10.0.0.1
  method: GET
  status: 200
  Value: 1234

Transformation: Organize fields
  - hide __name__
  - rename instance → server
  - reorder: job, server, method, status, Value

Annotation — Event 표시

Annotation 의 자리

Time Series chart 위 의 세로 선 + 라벨:
  - 배포 시각
  - Incident 시각
  - Feature flag 변경
  - 외부 event

→ "이 spike 가 일어난 시각 = 배포 직후" 즉시 인식

Annotation 의 종류

1. Built-in (시스템 표준)
   - Alert annotation (alert state change)
   - Annotations & Alerts datasource

2. Dashboard 의 Annotation Query
   - datasource 의 query
   - 예: Loki 의 deploy event
   - 예: Prometheus 의 alert state

3. 수동 입력
   - dashboard UI 의 "Add annotation"
   - 사용자가 클릭 + 메모

자동화 예 1: CI/CD 의 배포 annotation

CI/CD(지속 통합·지속 배포) 파이프라인이 배포 직후에 annotation 을 던지게 만들어두면 차트가 자동으로 표시해줘요.

# GitHub Actions 의 배포 직후
curl -X POST http://grafana:3000/api/annotations \
  -H "Authorization: Bearer $GRAFANA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tags": ["deploy", "production"],
    "text": "Deploy v1.2.3 by '"$USER"' — '"$COMMIT_MSG"'",
    "time": '"$(date +%s)"'000
  }'

자동화 예 2: Loki query annotation

Dashboard > Settings > Annotations:
  Name: Deploys
  Datasource: Loki
  Query: {app="ci-deploy"} | json | event="deploy_completed"
  Tags: $.tags
  Text: $.message

이렇게 걸어두면 모든 배포 event 가 모든 차트에 자동 표시 돼요.

자동화 예 3: GitHub Release annotation

# Grafana > Plugins > GitHub datasource
- Datasource: GitHub
- Query: releases of repo "company/app"
- Time field: published_at
- Text: "{{ name }} — {{ author }}"

Library Panel — 재사용

Library Panel 의 자리

표준 panel 을 *여러 dashboard 에서 재사용*:
  - 한 번 만들면 reuse
  - 한 곳 변경 = 모든 사용 dashboard 에 자동 반영

사용 case

- "Top 5 slow endpoints" panel
  → 여러 service 의 dashboard 에 동일 사용

- "Cluster health overview" panel
  → 모든 dashboard 의 head 에 동일

- "Recent deploys" panel
  → 모든 production dashboard

표준 dashboard 의 일관성 자동 + 유지보수 단순

변환

Panel 우상단 메뉴 > Library panels > Create library panel

이후:
  - 다른 dashboard 에서 "Add from library"
  - 같은 panel 즉시 추가

Dashboard JSON — Import · Export

JSON 구조

{
  "title": "Service Dashboard",
  "tags": ["api", "production"],
  "timezone": "browser",
  "panels": [
    {
      "id": 1,
      "type": "timeseries",
      "title": "RPS",
      "gridPos": {"x": 0, "y": 0, "w": 12, "h": 8},
      "datasource": "Prometheus",
      "targets": [
        {"expr": "rate(http_requests_total[5m])"}
      ]
    }
  ],
  "templating": {
    "list": [
      {"name": "service", "type": "query", "query": "label_values(service)"}
    ]
  }
}

Import 의 방법

1. UI Import:
   Dashboards > Import > JSON file 또는 ID

2. Grafana Marketplace:
   ID 입력 (예: 1860 = Node Exporter Full)
   → 자동 다운로드 + 등록

3. API:
   POST /api/dashboards/db
   - JSON payload
   - overwrite · folder 지정

Marketplace 의 활용

인기 dashboard ID:
  - 1860 — Node Exporter Full (Linux/Server)
  - 7587 — Spring Boot 2.1
  - 11378 — Argo CD
  - 13332 — Kubernetes / Views / Global
  - 17345 — Kafka Exporter Overview
  - 14584 — MySQL Database 의 detailed

설치:
  Dashboards > New > Import
  → ID 입력 (예: 1860)
  → Datasource 선택 → Import

Folder · Permission · Public Dashboard

Folder 의 조직

표준 folder 구조:
  /
  ├─ Infrastructure
  │   ├─ Kubernetes
  │   ├─ AWS
  │   └─ Network
  ├─ Applications
  │   ├─ API
  │   ├─ Frontend
  │   └─ Worker
  ├─ Business
  │   ├─ Revenue
  │   ├─ Marketing
  │   └─ Customer
  └─ Personal
      └─ <user>

Permission 의 layer

Permission 의 적용:
  1. Organization (전체)
  2. Folder (folder 안 모든 dashboard)
  3. Dashboard (개별)

Role:
  - Admin (모든 변경)
  - Editor (생성 · 수정)
  - Viewer (보기만)

Team 의 permission:
  - 팀 = 사용자 그룹
  - folder 에 team permission
  - 사용자 의 team 의 자동 권한

Public Dashboard (Public Sharing)

Dashboard > Share > Public dashboard:
  - 공개 URL 생성
  - 인증 없이 접근 가능
  - 일부 panel 만 공개 (filter)
  - Time range · Variable 의 lock

용도는 status page (uptime · incidents), 외부 stakeholder · customer, SLA(서비스 수준 협약) dashboard 같은 자리에 어울려요. 다만 PII(개인식별정보) · 내부 metric 이 새지 않도록 봐야 하고, 공개 URL = anyone with link 라는 점도 잊지 마세요.

Reporting — PDF Export

자동 Report

Grafana Enterprise · Cloud Pro:
  - Dashboard → PDF 자동 export
  - Schedule (매일 · 매주 · 매월)
  - Email 자동 발송

용도:
  - 주간 KPI 보고 (CFO · CEO)
  - 월간 review 자료
  - 회의 자료 자동 생성

Setup

Reporting > New report:
  - Dashboard 선택
  - Time range (last week · last month · 사용자 정의)
  - Schedule (cron)
  - Email recipients
  - PDF · CSV · panel image

Dashboard as Code

Grafonnet (Jsonnet)

// grafonnet 의 dashboard 정의
local g = import 'github.com/grafana/grafonnet/main.libsonnet';

g.dashboard.new('Service Dashboard')
+ g.dashboard.withVariables([
    g.dashboard.variable.query.new('service', 'label_values(service)')
    + g.dashboard.variable.query.withDatasource('Prometheus'),
  ])
+ g.dashboard.withPanels([
    g.panel.timeSeries.new('RPS by service')
    + g.panel.timeSeries.queryOptions.withTargets([
        g.query.prometheus.new(
          'Prometheus',
          'sum(rate(http_requests_total[5m])) by (service)'
        )
      ])
    + g.panel.timeSeries.gridPos.withW(12) + g.panel.timeSeries.gridPos.withH(8),
  ])

Terraform Grafana Provider

terraform {
  required_providers {
    grafana = {
      source = "grafana/grafana"
    }
  }
}

provider "grafana" {
  url  = "https://grafana.company.com"
  auth = var.grafana_token
}

resource "grafana_dashboard" "service_dashboard" {
  config_json = jsonencode({
    title = "Service Dashboard"
    panels = [
      # ...
    ]
  })
}

resource "grafana_alert_rule_group" "api_alerts" {
  name   = "API Alerts"
  folder_uid = grafana_folder.alerts.uid
  interval_seconds = 60

  rule {
    name = "HighErrorRate"
    # ...
  }
}

장점

- Git 의 dashboard 변경 history
- PR review 의 dashboard 변경
- staging · production 의 일관성
- 재해 복구 (재현 가능)
- 일괄 변경 (여러 dashboard 동시 update)

함정 정리

사고 1: 한 dashboard 에 panel 너무 많음

원인 — 30+ panel 한 페이지 → 가독성 0 + 로딩 느림.

해결목적 별 분리 (Overview · Detailed · Debug). 한 dashboard = 한 stakeholder · 한 사용 case.

사고 2: Variable chain 없이 광범위 query

원인 — Variable 없이 모든 service 의 모든 instance query → slow + 정보 과부하.

해결cascading variable. 사용자가 좁혀서 의미 있는 panel.

사고 3: Transformation 너무 복잡

원인 — 10+ transformation 의 chain → 디버그 어렵 + 성능 저하.

해결query 의 datasource 단계 에서 (SQL · PromQL) 처리 가능 시 그렇게. Transformation = 마지막 단계.

사고 4: Annotation 의 noise

원인 — 너무 많은 annotation (모든 ci event · 모든 metric change) → 차트 의 세로 선 폭주.

해결의미 있는 event 만 (production deploy · incident · feature release). filter 의식.

사고 5: Library Panel 안 사용 → drift

원인 — 같은 panel 의 dashboard 마다 copy-paste → 일관성 깨짐 → 한 곳 만 변경.

해결Library Panel 의식. 표준 panel = library.

사고 6: Public Dashboard 의 PII 누출

원인 — internal metric (user_id · 회사 secret) 의 panel 이 Public Dashboard 에 포함.

해결Public 전 의 review + Public 의 filter · lock + 내부 dashboard 와 분리.

사고 7: Folder · Permission 의 무관리

원인 — 모든 사용자 = Editor → 임의 dashboard 만들기 · 변경 → governance X.

해결Folder 별 permission + Team-based access + Personal folder 분리.

사고 8: Marketplace dashboard 의 무수정 사용

원인 — ID 1860 import → 우리 metric naming convention 과 다름 → panel 모두 빈값.

해결import 후 datasource · query 의 fix + 우리 환경에 맞춤.

사고 9: Dashboard JSON 의 hand editing

원인 — JSON 직접 편집 → syntax error → import 실패.

해결UI 사용 + export 후 git commit + Grafonnet · Terraform 의 IaC(Infrastructure as Code).

사고 10: Time range 너무 광범위

원인 — Default time range = "last 30 days" → 모든 panel 의 query 가 30일 scan → 매우 느림.

해결Default = "last 1 hour" + 필요 시 사용자가 확장. 명시 default.

운영 권장 패턴

Pattern 1: Production Dashboard 4 layer

1. Overview Dashboard
   - 전사 KPI (활성 사용자 · 매출 · SLO)
   - 가장 추상 · CEO 대상

2. Service Dashboard (per service)
   - 한 service 의 RED metric (Rate · Errors · Duration)
   - Tempo Service Graph
   - 최근 alert
   - Owner team 대상

3. Cluster Dashboard
   - Kubernetes overview
   - Node · Pod 의 resource
   - Infrastructure team 대상

4. Business Dashboard
   - Funnel · cohort · retention
   - 비즈니스 metric
   - Product · Marketing 대상

SLO(서비스 수준 목표) 가 여기서 처음 나와요. 6편에서 깊이 다룰 키워드.

Pattern 2: Variable 의 표준

모든 production dashboard 의 표준 variable:
  $environment  = prod / staging / dev  (Custom)
  $cluster      = us-east-1 / asia-northeast3 / eu-west-1  (Query)
  $namespace    = (dropdown based on environment + cluster)  (Query)
  $service      = (dropdown based on namespace)  (Query)
  $interval     = 1m / 5m / 10m / 30m / 1h  (Interval, 자동 $__interval)

이 cascading chain 으로 사용자가 의미 있게 좁혀가는 흐름 이 만들어져요.

Pattern 3: Annotation 의 표준 source

표준 annotation 3종:
  1. Production Deploys (CI/CD API call)
  2. Incidents (Loki query → severity=critical 의 incident)
  3. Feature Flags (Statsig · LaunchDarkly 의 webhook → Grafana API)

→ 모든 production dashboard 의 자동 표시

Pattern 4: Library Panel 의 표준 panel

표준 Library Panel:
  - "Service Health Overview" (RPS · Error rate · p99 latency 한 panel)
  - "Recent Deploys" (last 5 deploy 의 timestamp · author · commit)
  - "Active Alerts" (현재 fire 중인 alert 리스트)
  - "SLO Status" (error budget · burn rate)
  - "Cluster Resource" (CPU · 메모리 · 디스크)

→ 모든 service dashboard 가 위 5 panel 의 *동일 view*

Pattern 5: Folder 의 permission 자동

# Terraform
resource "grafana_folder" "backend_team" {
  title = "Backend Team"
}

resource "grafana_folder_permission" "backend_team_permission" {
  folder_uid = grafana_folder.backend_team.uid

  permissions {
    role       = "Viewer"
    permission = "View"
  }
  permissions {
    team_id    = grafana_team.backend.id
    permission = "Edit"
  }
}

Pattern 6: 자동 PDF Report

매주 월요일 09:00 KST:
  - "Overview Dashboard" 의 last week → PDF
  - CEO · CFO · Engineering Lead 의 이메일

매일 09:00 KST:
  - "Service Health" 의 last 24h → PDF
  - 모든 service Owner 의 이메일

매월 1일:
  - "Business Dashboard" 의 last month → PDF
  - Board · Investor 의 자료

시험 직전 한 번 더 — Dashboard 압축 노트

Panel 종류 (15+)

  • 시계열 — Time Series · Bar Chart · Histogram · Heatmap · State Timeline · Status History · Candlestick
  • 단일 값 — Stat · Gauge · Bar Gauge · Pie Chart
  • 표 · 텍스트 — Table · Logs · Text · News
  • 특수 — Trace · Geomap · Node Graph · Canvas · Annotations List · Alert List · Dashboard List
  • 80% 사용 = Time Series + Stat + Table

Variable 7 Type

  • Query · Custom · Constant · Datasource · Interval · Ad hoc filter · Text Box
  • Cascading dropdown (chain)
  • Multi-value · Include All
  • Format modifier (${var:regex} · ${var:csv} · ${var:json})

Transformation (26종)

  • Add field from calculation · Filter · Group by · Join · Organize fields · Rename · Sort · ...
  • query 단계 처리 가능하면 그렇게 (transformation = 마지막)

Annotation

  • Built-in (alert state · annotations datasource)
  • Dashboard 의 annotation query (Loki 의 deploy event)
  • 수동 입력
  • 자동화 — CI/CD API call · Loki query · GitHub release

Library Panel

  • 한 panel 재사용
  • 한 곳 변경 = 모든 dashboard 반영
  • 표준 panel (Service Health · Recent Deploys 등)

Dashboard JSON

  • Import (UI · Marketplace ID · API)
  • Marketplace (1860 = Node Exporter · 13332 = Kubernetes)
  • import 후 datasource · query fix

Folder · Permission

  • Organization · Folder · Dashboard 의 3 layer
  • Role — Admin · Editor · Viewer
  • Team-based access

Public Dashboard

  • 공개 URL · 인증 없음
  • PII · secret 누출 의식
  • status page · 외부 customer

Reporting

  • PDF · CSV · image
  • Schedule (cron) · email 자동
  • Enterprise · Cloud Pro

Dashboard as Code

  • Grafonnet (Jsonnet)
  • Terraform Grafana Provider
  • Git history · PR review · staging/prod 일관성

사고

  • Panel 너무 많음 (목적 분리)
  • Variable chain 없음 (광범위 query)
  • Transformation 너무 복잡
  • Annotation noise (filter)
  • Library Panel 안 사용 (drift)
  • Public Dashboard PII 누출
  • Folder permission 무관리
  • Marketplace 무수정 (datasource mismatch)
  • JSON 직접 편집 (syntax error)
  • Time range 너무 광범위

패턴

  • Production Dashboard 4 layer (Overview · Service · Cluster · Business)
  • 표준 Variable (env · cluster · namespace · service · interval)
  • 표준 Annotation 3종 (Deploy · Incident · FeatureFlag)
  • 표준 Library Panel 5종
  • Folder permission 자동 (Terraform)
  • 자동 PDF Report (주간 · 일간 · 월간)

공식 문서: Grafana Dashboards · Variables 에서 더 깊은 spec 을 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!