| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- jack 문법
- OTEL
- 피벗 추적
- apm
- 스트리밍 아키텍쳐
- 밑바닥부터 만드는 컴퓨팅 시스템
- APM 만들기
- Terraform
- 컴퓨터 아키텍쳐
- 도커
- 시간 윈도우
- MySQL
- InnoDB
- 추적 데이터 마이닝 파이프라인
- vm머신
- 텀블링 윈도우
- s3
- 실시간 스트리밍 데이터
- 분산추적
- 메모리 세그먼트
- 리눅스
- vm번역기
- 마운트
- 스트리밍 데이터 아키텍쳐
- 스택머신
- 핵심 데이터 모델링
- ec2
- SpanId
- nandtotetris
- 구문 분석
- Today
- Total
이것이 점프 투 공작소
피벗 추적에 대해 알아보자 본문
피벗 추적이란?
분산 추적 시스템 내부의 계측 가능한 한 지점에서 측정값을 정의하고.
다른 지점에서 지정한 그 값을 기반으로 선택,필터링,그룹화 하여 클라이언트에서 전체 시스템을 관측 할 수 있게 하는 기능입니다.
예를 들어 아래 쿼리는 HBase,맵리듀스,HDFS 클라이언트를 실행하는 다른 클라이언트의 요청을 처리하는 HDFS 데이터 노드에 적용되는 쿼리입니다.
즉 분산 시스템 내부에서 "클라이언트가 얼마나 데이터를 읽었는지"를 추적하기 위한 코드입니다.
FROM bytesRead IN DataNodeMetrics.incrBytesRead
JOIN client IN FIRST(ClientProtocols) ON client => bytesRead
GROUP BY client.procName
SELECT cleint.procName, SUM(bytesRead.delta)
쿼리를 한줄씩 해석해 보면,
DataNodeMetrics.incrBytesRead 는 데이터 노드에서 바이트를 읽을 때 발생하는 추적 지점입니다.
이 지점에서 수집된 이벤트를 bytesRead 로 alias 지정합니다.
ClientProtocols는 클라이언트에서 시스템에 요청을 보낼 때 발생하는 지점입니다.
First 함수를 통해 ClientProtocols에 처음 도착한 이벤트를 client라는 alias로 가져오고, 그 요청이 bytesRead 이벤트를 유발했다고 정의합니다.
추적 시스템은 client.traceId == bytesRead.traceId를 기반으로 join합니다.
client안의 정보 안에 procName을 기준으로 데이터를 그룹화하고, 예를 들어 HDFS, Spark, Hive 등 프로세스 이름으로 그룹화 됩니다.
마지막으로 각 그룹별로 유발한 bytesRead.delta, 합계를 구합니다.
피벗 추적 흐름도

피벗 추적 흐름에서 주목할 만한 점은 컨텍스트 전파가 이루어 질 때,
최초 발생하는 추적 포인트에 피벗 추적에 필요한 데이터((traceId, procName 등))를 배기지에 저장해 전파합니다.
이후 이벤트가 발생하는 시점에 실제 집계에 필요한 데이터를 추출 후 배기지에 넣습니다.
최종적으로 배기지는 튜플로 전환 후 프론트에 전달되어 집계 후 원하는 쿼리 결과를 보여줍니다.
마무리
APM의 피벗 추적의 구현에 대해서는 책에서도 많이 다루지 않고 논문을 확인하라고 하는데,
아무래도 실제 APM을 만들 때 피벗 추적에 대해 더 공부 후 추가 포스팅을 해야겠습니다.
'APM만들기' 카테고리의 다른 글
| 피쳐 추출 시스템에 대해 알아보자 (0) | 2025.08.29 |
|---|---|
| 분산추적의 샘플링에 대해서 알아보자 (0) | 2025.07.18 |
| 분산추적에서 다른 프로세스, 외부 서비스간 전파는 어떻게 이루어질까 (0) | 2025.06.29 |
| OpenTelemetry 프로젝트를 보며 공부하는 분산추적의 핵심요소들 (0) | 2025.06.20 |