이것이 점프 투 공작소

피벗 추적에 대해 알아보자 본문

APM만들기

피벗 추적에 대해 알아보자

겅겅겅 2025. 8. 3. 22:57

피벗 추적이란?

분산 추적 시스템 내부의 계측 가능한 한 지점에서 측정값을 정의하고.

다른 지점에서 지정한 그 값을 기반으로 선택,필터링,그룹화 하여 클라이언트에서 전체 시스템을 관측 할 수 있게 하는 기능입니다.

 

예를 들어 아래 쿼리는 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을 만들 때 피벗 추적에 대해 더 공부 후 추가 포스팅을 해야겠습니다.