나의 잡다한 노트 및 메모
wide series와 long series 본문
Grafana에서 말하는 wide series와 long 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 |