관찰 가능성 엔지니어링
OpenTelemetry 시그널 - 분산 추적
분산 추적
- 시스템의 여러 지점에서 생성된 일련의 이벤트 데이터
- 고유한 식별자로 연결되어 있다.
- 각 추적은 전체 시스템에 대한 고유한 요청을 나타낸다.
- 동기와 비동기 요청으로 구분된다.
- 추적에 기록된 각 작업은 스팬( 시스템에서 처리된 작업의 단위 )으로 표기된다.
추적 심층 분석
스팬 컨텍스트
- 추적 ID
- 전체 시스템에서 요청을 식별한다.
- OpenTelemetry의 경우, 추적 ID를 128비트 정수형 값으로 표현한다. 다른 시스템의 경우 64비트 정수형 값으로 표현하고, 정수형 값을 16진수 문자를 포함하는 문자열로 인코딩한다.
- 스팬 ID
- 컨텍스트와 상호 작용한 최종 스팬과 연결된다.
- 하위 스팬이 존재하는 경우, 상위 스팬의 스팬 ID는 부모 식별자로 불린다.
- 64비트 정수형 값으로 표현된다.
- 추적 플래그
- 추적 수준, 샘플링 여부와 같이 추적 관련 추가 정보를 담고 있다.
- 추적 상태
- 벤더 특화 정보를 전달할 목적의 필드
- 개별 벤더가 각자 시스템에 필요로 하는 정보를 전파하여 추적 데이터를 해석하는 것에 도움을 준다.
- 각 벤더 간에도 추적을 공유할 수 있다.
스팬
- 고유 식별자, 부모 스팬의 식별자, 기록된 작업의 이름, 시작/종료 시간을 담고 있는 데이터 구조체
- 단일 메소드 호출 또는 메서드 내에서 호출되는 코드의 일부분
- 추적 내에 존재하는 여러 스팬이 부모-자식 관계로 연결되어 있다.
- 각 자식 스팬은 부모 스팬에 관한 정보를 가지고 있다.
- 추적 내 첫 번째 스팬 = 루트 스팬
- 부모 스팬에 관한 식별자를 가지고 있지 않다.
- KV 형태로 메타 데이터를 포함할 수 있다. (예거. 집킨에서는 tag로 부르고, OpenTelemetry는 attribute로 부른다.)
추가 고려 사항
- 추적 정보를 생성하는 것은 애플리케이션 관점에서 잠재적인 성능 부하가 발생할 수 있는 작업이다.
- 정보의 수집/전송이 애플리케이션의 요청 처리 과정에 포함되어있는 경우, 추가적인 지연이 발생할 수 있다.
- 정보 수집을 위해서는 필연적으로 리소스 할당이 필요하기 때문에 메모리가 과다하게 사용될 수 있다.
- 데이터를 어떤 저장소로 보내는지에 따라 네트워크 대역폭이나 스토리지 용량과 같은 추가 비용이 발생할 수 있다는 점도 고려해야한다.
- 필요한 만큼의 데이터를 샘플링해서 생성되는 데이터의 총량을 줄이면 된다.
- 컨텍스트가 모든 서비스에 정확하게 전파되어야한다.
- 시스템 전반에 추적 ID를 제대로 전파되지 않는다면 요청이 다수의 추적으로 쪼개져서 기록되고, 수집된 정보를 활용하기 어려워서 전혀 도움이 되지않을 수 있다.