Where Distributed Tracing Breaks
Quiz: Instrumenting Outbound Calls
한국어 원문으로 표시합니다.
하류 팀은 p99 가 20밀리초라 하고 우리 클라이언트는 300밀리초로 잰다. 가장 먼저 의심할 것은?
- 두 팀의 시계가 어긋나 스팬 시각이 밀린 것
- 서버 스팬 밖에 있는 구간 — 대기열·직렬화·전송·풀 대기가 차이를 만든 것
- 샘플링 비율이 달라 서로 다른 요청 집합을 재고 있는 것
- 히스토그램 버킷 경계가 달라 같은 값이 다르게 계산된 것
커넥션 풀에서 연결을 얻은 뒤에 CLIENT 스팬을 시작하면 트레이스에 어떤 증상이 나타나는가?
- 자식 스팬이 부모보다 늦게 시작해 순서가 뒤집혀 보인다
- 같은 스팬이 두 번 기록되어 호출 수가 부풀려진다
- 자식 스팬을 다 더해도 루트 스팬의 시간이 설명되지 않는 빈 구간이 생긴다
- 클라이언트 스팬과 서버 스팬의 부모-자식 관계가 끊어진다
클라이언트 타임아웃이 120밀리초인데 서버 일감이 400밀리초였다. 덤프에는 무엇이 남는가?
- 같은 트레이스에 120밀리초짜리 CLIENT 스팬과 400밀리초짜리 SERVER 스팬이 함께 남는다
- CLIENT 스팬만 남고 서버는 취소 신호를 받아 스팬을 만들지 않는다
- SERVER 스팬이 부모보다 길어 SDK 가 그 스팬을 버린다
- 두 스팬 모두 120밀리초로 잘려 기록된다
사용자가 탭을 닫아 끊긴 호출의 스팬 상태를 ERROR 로 올리면 무엇이 문제인가?
- ERROR 상태는 샘플러가 언제나 버려서 그 스팬이 저장되지 않는다
- status_message 가 비어 있으면 SDK 가 상태를 UNSET 으로 되돌린다
- 부모 스팬까지 ERROR 로 전파되어 트레이스 전체가 실패로 표시된다
- 오류율이 사용자의 이탈에 따라 출렁여 그 지표로 건 경보가 쓸모없어진다
나가는 호출의 대상을 스팬 속성으로 적을 때 server.address 에 pricing-7d9f-abcde:8080 을 그대로 넣으면?
- 파드가 바뀔 때마다 값이 달라져 집계 대상이 갈라지고 시계열이 늘어난다
- 속성 값에 콜론이 들어가 SDK 가 그 속성을 버린다
- 서버 스팬과 값이 달라져 두 스팬의 부모-자식 관계가 끊어진다
- 주소가 길어 스팬 속성 길이 상한에 걸려 잘린다
한 요청이 같은 하류를 여섯 번 부른 사실을 상류 트레이스에서 보려면 무엇이 필요한가?
- 하류 서비스의 SERVER 스팬에 호출자 이름을 속성으로 붙인다
- 나가는 호출마다 CLIENT 스팬을 만들고 대상과 연산을 저카디널리티 속성으로 붙인다
- 루트 스팬의 이름에 호출 횟수를 넣어 이름으로 구분되게 한다
- 하류 호출을 한 번으로 합쳐 보내고 응답을 나누어 쓴다