Back to Blog
ElasticsearchKibanaDashboardVisualizationLensDiscover

0x06. Kibana 시각화와 대시보드

Kibana를 활용한 데이터 탐색, 시각화 생성, 대시보드 구성, 그리고 운영 모니터링 활용법을 알아본다.

Elasticsearch에 데이터를 저장했다면, 이제 그 데이터를 눈으로 볼 차례다. Kibana는 Elasticsearch의 공식 시각화 플랫폼으로, 코드를 작성하지 않고 데이터를 탐색하고, 차트를 만들고, 대시보드를 구성할 수 있다.


Kibana 기본 구조

Kibana의 주요 기능은 네 가지 영역으로 나뉜다.

기능설명
Discover데이터 탐색과 검색
Visualize / Lens차트와 그래프 생성
Dashboard여러 시각화를 조합한 대시보드
Dev ToolsElasticsearch REST API 직접 실행

Data View (구 Index Pattern)

Kibana에서 데이터를 탐색하려면 먼저 Data View를 생성해야 한다. Elasticsearch 인덱스(또는 인덱스 패턴)를 Kibana에 연결하는 설정이다.

인덱스 패턴: logs-*
타임스탬프 필드: @timestamp

logs-*로 설정하면 logs-2026-02-10, logs-2026-02-11 등 패턴에 맞는 모든 인덱스의 데이터를 하나의 뷰에서 탐색할 수 있다.


Discover: 데이터 탐색

Discover는 Elasticsearch 데이터를 실시간으로 탐색하는 도구이다. 로그 분석과 디버깅의 출발점이다.

기본 탐색

Discover 화면의 구성:

┌─────────────────────────────────────────┐
 [검색 : KQL 또는 Lucene 쿼리]          
├─────────┬───────────────────────────────┤
 필드      히스토그램 (시간별 문서 )     
 목록    │───────────────────────────────│
           문서 목록                      
 @timestamp│  { "level": "ERROR", ...}   
 level     { "level": "INFO", ...}     
 message   { "level": "WARN", ...}     
 service   ...                          
└─────────┴───────────────────────────────┘

KQL (Kibana Query Language)

Discover에서 데이터를 필터링하는 쿼리 언어이다.

# 기본 검색
level: "ERROR"

# AND 조건
level: "ERROR" and service: "order-api"

# OR 조건
level: "ERROR" or level: "WARN"

# 와일드카드
message: "timeout*"

# 범위
response_time > 1000

# NOT
not level: "DEBUG"

# 중첩 필드
user.name: "kim"

필드 필터링

왼쪽 필드 목록에서 필드를 클릭하면 해당 필드의 상위 값 분포를 볼 수 있다. 특정 값을 클릭하여 바로 필터를 추가할 수 있다. + 버튼은 해당 값을 포함, - 버튼은 해당 값을 제외한다.

저장된 검색

자주 사용하는 검색 조건을 저장하여 재사용할 수 있다. 저장된 검색은 대시보드에도 임베드할 수 있다.


Lens: 시각화 생성

Lens는 Kibana의 핵심 시각화 도구이다. 드래그 앤 드롭으로 차트를 만들 수 있으며, 데이터에 맞는 시각화 유형을 자동으로 추천한다.

주요 시각화 유형

Bar Chart (막대 그래프): 카테고리별 비교에 적합하다.

설정 예시:
- X축: service.keyword (Terms)
- Y축: Count of records
- 분할: level.keyword

서비스별 로그 레벨 분포를 한눈에 파악할 수 있다.

Line Chart (선 그래프): 시간에 따른 추이를 보여준다.

설정 예시:
- X축: @timestamp (Date Histogram, 간격: 5분)
- Y축: Average of response_time
- 분할: service.keyword

시간대별 응답 시간 추이를 서비스별로 비교할 수 있다.

Pie Chart (원형 그래프): 비율 분포를 보여준다.

설정 예시:
- 슬라이스: status_code.keyword (Terms, 상위 5개)
- 크기: Count of records

Metric: 단일 숫자 값을 크게 표시한다.

설정 예시:
- : Unique count of user_id
- 라벨: "활성 사용자 수"

Data Table: 집계 결과를 테이블로 표시한다.

설정 예시:
- : service.keyword, level.keyword
- : Count, Average of response_time

Heatmap: 두 차원의 교차 밀도를 색상으로 표현한다.

설정 예시:
- X축: hour_of_day
- Y축: day_of_week
- : Count (색상 강도)

시간대별/요일별 트래픽 패턴을 파악할 수 있다.

Lens 사용 팁

  • 필드를 중앙 영역에 드래그하면 자동으로 적절한 시각화가 추천된다
  • 시각화 유형은 상단에서 언제든 변경할 수 있다
  • Breakdown 기능으로 하나의 차트에 여러 시리즈를 추가한다
  • 필터는 상단 필터 바에서 시각화별로 적용할 수 있다

Dashboard: 통합 뷰

대시보드 구성

여러 시각화를 하나의 화면에 배치하여 운영 대시보드를 만든다.

대시보드 구성 예시 (서비스 모니터링):

┌──────────────────────┬──────────────────────┐
   요청  (Metric)    에러율 (Metric)      
├──────────────────────┴──────────────────────┤
  시간별 요청  추이 (Line Chart)              
├─────────────────────────────────────────────┤
  서비스별 에러 비율 (Bar Chart)                
├──────────────────┬──────────────────────────┤
  상태코드 분포       응답시간 상위 엔드포인트  
  (Pie Chart)        (Data Table)            
└──────────────────┴──────────────────────────┘

대시보드 기능

시간 범위 선택: 상단의 타임피커로 전체 대시보드의 시간 범위를 일괄 변경한다. "Last 15 minutes", "Last 24 hours", 또는 커스텀 범위를 지정할 수 있다.

자동 새로고침: 10초, 30초, 1분 등 간격으로 대시보드를 자동 갱신한다. 실시간 모니터링에 필수이다.

필터 연동: 하나의 시각화에서 특정 값을 클릭하면, 해당 필터가 대시보드 전체에 적용된다. 예를 들어 에러 막대를 클릭하면 다른 모든 차트도 에러만 표시한다.

드릴다운: 차트에서 특정 데이터 포인트를 클릭하여 더 상세한 대시보드나 Discover 화면으로 이동할 수 있다.


실전: 로그 모니터링 대시보드

인덱스 구조

// 로그 문서 구조
{
  "@timestamp": "2026-02-12T10:30:00.000Z",
  "level": "ERROR",
  "service": "order-api",
  "message": "Connection timeout to database",
  "response_time": 5023,
  "status_code": 500,
  "endpoint": "/api/orders",
  "user_id": "user-123",
  "trace_id": "abc-def-123"
}

핵심 시각화 구성

1. 에러율 게이지

시각화 유형: Metric
집계: Count where level: "ERROR" / Count of all * 100
라벨: "에러율 (%)"
임계값: > 5% 빨간색, > 1% 노란색

2. 서비스별 응답시간 백분위

시각화 유형: Line Chart
X축: @timestamp (5분 간격)
Y축: Percentile of response_time (p50, p95, p99)
분할: service.keyword

p50(중간값), p95, p99를 함께 보면 응답시간의 분포를 정확히 파악할 수 있다. p50은 정상인데 p99가 높다면 일부 요청에서만 지연이 발생하는 것이다.

3. 에러 로그 테이블

시각화 유형: Saved Search (Discover)
필터: level: "ERROR"
컬럼: @timestamp, service, message, trace_id
정렬: @timestamp 내림차순

에러 발생 시 trace_id로 전체 요청 흐름을 추적할 수 있다.


Dev Tools: API 직접 실행

Kibana의 Dev Tools > Console에서 Elasticsearch REST API를 직접 실행할 수 있다. 인덱스 관리, 매핑 확인, 쿼리 테스트에 유용하다.

// 인덱스 목록
GET _cat/indices?v

// 매핑 확인
GET /logs-*/_mapping

// 검색 쿼리 테스트
GET /logs-*/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "level": "ERROR" } },
        { "range": { "@timestamp": { "gte": "now-1h" } } }
      ]
    }
  },
  "aggs": {
    "by_service": {
      "terms": { "field": "service.keyword" }
    }
  }
}

// 클러스터 상태
GET _cluster/health

// 노드 리소스
GET _cat/nodes?v

자동완성과 구문 강조를 지원하여 curl보다 편리하다.


Alerting: 알림 설정

Kibana는 조건 기반 알림(Alerting) 기능을 제공한다. 특정 조건이 충족되면 Slack, 이메일, PagerDuty 등으로 알림을 보낸다.

알림 규칙 예시

규칙: 에러율 급증 알림
조건: 최근 5분간 level: "ERROR" 비율이 10% 초과
액션: Slack 채널 #alerts에 메시지 전송
빈도: 1분마다 체크, 알림  30분 쿨다운
규칙: 응답시간 저하 알림
조건: response_time의 p95가 3000ms를 초과
액션: PagerDuty 인시던트 생성
빈도: 5분마다 체크

알림은 대시보드 모니터링의 보완재이다. 사람이 대시보드를 24시간 지켜볼 수 없으므로, 이상 징후를 자동으로 감지하여 알려주는 것이 중요하다.


정리

  • Discover는 데이터 탐색과 로그 검색의 출발점이며, KQL로 빠르게 필터링한다
  • Lens는 드래그 앤 드롭으로 다양한 시각화를 생성하는 핵심 도구이다
  • Dashboard는 여러 시각화를 조합하고, 필터 연동과 자동 새로고침으로 실시간 모니터링을 지원한다
  • Dev Tools에서 Elasticsearch API를 직접 테스트하고 클러스터를 관리한다
  • Alerting으로 이상 징후를 자동 감지하여 알림을 보낸다