나의 잡다한 노트 및 메모

wide series와 long series 본문

DevOps/grafana

wide series와 long series

peanutwalnut 2025. 8. 27. 14:43

Grafana에서 말하는 wide serieslong series는 데이터 프레임 형태를 어떻게 표현하느냐의 차이

Grafana Alerting에서의 series 타입

  • Long series
    구조: time | metric | value (세로로 라벨 붙은 시계열)
    → Prometheus, Loki, MySQL/PG 플러그인 등 대부분이 이 형식을 반환합니다.
    → Alerting v2 엔진(Expressions)에서 Reduce → Threshold 같은 “시리즈 단위 평가”를 할 때는 Long series가 기본입니다.
    → 여기서는 metric(string) 필드를 라벨로 쓰고, value를 숫자로 평가합니다.
  • Wide series
    구조: time | seriesA | seriesB | … (가로로 여러 값 컬럼)
    → 여러 시리즈를 한 행에 붙여놓은 구조.
    → Alerting v2에서 Math 같은 “여러 시리즈 간 연산”을 할 때는 Wide series를 요구합니다.
    → 예: A - B 같은 계산식은 Long series에서는 불가능, Wide series여야 합니다.

1. Long series (일반적인 시계열 형식)

  • 컬럼 구조: time | metric | value
  • 각 행이 “시간 + 라벨(metric) + 값”으로 쌓입니다.
  • 예시:
  • time                                                                                                               metric                                  value

      

    2025-08-27 10:00:00 idx101 12
    2025-08-27 10:00:00 idx102 7
    2025-08-27 10:01:00 idx101 13
    2025-08-27 10:01:00 idx102 8

→ 이 방식은 시계열 DB/SQL 쿼리에서 자연스럽게 나오고, Grafana에서 시리즈별로 그려주기 쉽습니다.
→ Alerting v2(Expressions)에서는 보통 이 형태를 받아서 Reduce → Threshold로 처리합니다.

 

2. Wide series (가로 확장된 시계열)

  • 컬럼 구조: time | seriesA | seriesB | seriesC ...
  • 한 행에 같은 시간대의 여러 metric 값이 가로로 들어갑니다.
  • 예시:
  • time                                                                                                                                 idx101            idx102

     

    2025-08-27 10:00:00 12 7
    2025-08-27 10:01:00 13 8

→ 이 형식은 여러 시리즈를 동시에 수학 연산(Math) 등에 넣을 때 필요합니다.
→ 예: seriesA - seriesB 같은 계산은 wide series가 아니면 불가능합니다.


3. 용어 정리

  • time: 타임스탬프 (시계열 기준 축)
  • metric: 시리즈를 구분하는 라벨/이름 (idx, hostname, job 등)
  • value: 해당 metric이 time 시점에서 가지는 수치 값

 

wide series는 (여러 값 필드를 한 프레임에 가로로 가진 형태)

 

Grafana 알림은 보통 time, metric, value 형태의 time series로 주고 그 다음 Reduce → Threshold만 쓰면 됩니다.

 

format이 time series라면 now() as time 이라는 시계열용 시간 컬럼을 필수로 넣어줘야함.

SELECT
  NOW() AS time,  -- 시계열용 시간 컬럼(필수)
  req.idx AS metric,  -- 라벨로 쓰일 컬럼
  MIN(TIMESTAMPDIFF(MINUTE, req.reg_dt, NOW())) AS value
FROM tbl_ssts_req_distribution req
JOIN tbl_ssts_transfer t ON req.idx = t.tblSstsReqDistributionIdx
WHERE req.queue = 'out'
  AND TIMESTAMPDIFF(MINUTE, req.reg_dt, NOW()) > 5
GROUP BY req.idx
ORDER BY req.idx DESC;

 

SELECT
  CAST(req.idx AS CHAR) AS idx,
  MIN(TIMESTAMPDIFF(MINUTE, req.reg_dt, NOW())) AS waiting_minutes
FROM tbl_ssts_req_distribution req
JOIN tbl_ssts_transfer t
  ON req.idx = t.tblSstsReqDistributionIdx
WHERE req.queue = 'out'
GROUP BY req.idx
HAVING waiting_minutes > 5
ORDER BY req.idx DESC;

이거 같은 경우는 cast가 없을 때는 wide series를 기대한다면서 에러가 발생했는데 cast를 붙이니 잘 동작함.

그 이유는 라벨 컬럼을 숫자가 아니라 문자열 타입으로 받아야 long series로 인식하기 때문이라고 한다.

즉, 라벨로 쓸 컬럼은 항상 문자열이어야 하며, 숫자 타입인 채로 보내면 그라파나가 그 칼럼을 값 필드로 오인할 수 있다고 한다.

그래서 아래 중 하나로 “문자열화” 하는 게 안전합니다.

  • CAST(req.idx AS CHAR) AS metric
  • CONCAT('', req.idx) AS metric
  • CONCAT('idx_', req.idx) AS metric ← 라벨 충돌 방지에도 좋음

 

 

 

 

'DevOps > grafana' 카테고리의 다른 글

Grafana Alloy란?  (0) 2025.11.16
Series  (0) 2025.08.27
False Alarm (오탐)  (0) 2025.08.19
웹훅  (0) 2024.08.20
Grafana에서 Legend  (0) 2024.08.08