pinpoint - dapper, 분산 추적에 대해
pinpoint와 dapper
Google Dapper는 구글이 개발한 대규모 분산 시스템을 위한 추적 시스템이다.
MSA에서 성능 문제를 진단하고, 시스템 내부에서 발생하는 복잡한 트랜잭션들을 추적하는 데 사용된다.
Dapper는 분산 시스템의 성능 분석 및 모니터링을 가능하게 하며, 추적 데이터를 활용해 문제를 해결하는 데 도움을 준다는 점에서, Pinpoint가 이를 모델로 사용한 이유를 조금은 알 것 같았다.
Dapper에 대해 : 분산 추적
Dapper는 분산 시스템 내의 모든 마이크로서비스 간의 요청과 응답을 추적한다.
각 요청에는 고유한 식별자(Trace ID)가 할당되어, 서비스 간을 이동하면서 해당 요청을 추적할 수 있다.
HTTP 요청이 존재하는 상황이라고 가정 : HTTP Header 에 메타 데이터를 추가
HTTP Header : 분산 환경에 대한 기본적인 정보와 각각 요청의 상관관계를 분석할 수 있도록 하는 최소한의 정보를 추가
1. Node 1 에서 요청이 시작한다면? Node 1, 시간, Endpoint 와 같은 데이터를 헤더에 추가하고 Node 2로 전달
2. 이후 Node 2 에서도 Node 2 의 정보를 추가하고 다음 노드로 전달한다.
고유 식별자 (Trace ID - Pinpoint에서는 TxId)
각 트랜잭션은 고유한 식별자(Trace ID)를 가진다.
이 식별자는 트랜잭션이 시작될 때 생성되며( 단일 트랜잭션에서 분산 시스템 간에 주고받은 메시지의 ID를 의미한다 ), 트랜잭션이 시스템의 다른 부분을 통과할 때 계속 전달된다.
Pinpoint에서는 : TransactionId, SpanId 및 ParentSpanId로 구성된 키 컬렉션을 의미함.
TransactionId는 메시지 ID를 나타내며 SpanId와 ParentSpanId는 모두 RPC의 상위-하위 관계
스팬(Span)
RPC(원격 프로시저 호출) 추적의 기본 단위.
RPC 메시지 수신 시 처리된 작업의 ID로, RPC가 노드에 도착할 때 생성
각 서비스 호출을 스팬이라는 단위로 나눈다. (트랜잭션의 각 부분은 '스팬'으로 나타난다)
스팬은 서비스의 특정 작업을 나타내며, 시작 시간, 종료 시간, 메타데이터, 자식 스팬의 식별자 등을 포함한다.
각 스팬은 부모 스팬의 ID를 참조하여 트랜잭션 내에서의 위치를 알 수 있다.
ParentSpanId(pSpanId)
RPC를 생성한 상위 범위의 SpanId를 의미한다.
노드가 트랜잭션의 시작점인 경우 상위 범위가 없으며, 이러한 경우 -1 값을 사용하여 해당 범위가 트랜잭션의 루트 범위임을 나타낸다.
컨텍스트 전파
서비스 간의 요청과 응답에는 추적 컨텍스트가 포함되어 있다. 이 컨텍스트는 요청을 따라 다니면서 다음 서비스에 추적 정보를 전달한다.
- 트랜잭션의 각 단계에서 에이전트는 Trace ID와 현재 스팬의 정보를 추적 컨텍스트에 포함시킨다.
- 이 컨텍스트는 HTTP 헤더, RPC 호출 등을 통해 다음 서비스나 노드로 전달된다.
- 이를 통해 후속 요청이나 작업이 동일한 트랜잭션의 일부로 인식된다.
경량화
Dapper는 성능에 최소한의 영향을 주도록 설계되었다. 매우 적은 양의 데이터만을 수집하고, 비용이 많이 드는 작업은 피한다.
데이터 저장 및 분석
에이전트는 트랜잭션과 관련된 모든 데이터(시작 시간, 종료 시간, 메소드 호출 등)를 수집하고 중앙 저장소로 전송한다.
이 데이터는 트랜잭션이 시스템을 통과하는 경로를 시각화하고 성능 문제를 분석하는 데 사용된다.
중앙 저장소는 에이전트가 설치된 Tomcat과 같은 개별 서버나 애플리케이션과는 다르다.
이는 분산 추적 시스템에서 에이전트들이 수집한 데이터를 저장하는 중앙집중식 데이터베이스 또는 저장소를 의미한다.
ref
https://pinpoint-apm.github.io/pinpoint/techdetail.html
https://www.elastic.co/kr/blog/distributed-tracing-opentracing-and-elastic-apm