LabHub
배우기 러닝패스 코스

マイクロサービスアーキテクチャ

相関IDの伝播を検証する

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

W3C traceparent 를 손으로 만들어 3단 서비스 체인에 전파하고, 로그를 트레이스 ID 로 조인해 요청 하나의 경로를 복원한다.

왜 중요한가

분산 추적을 "세 번째 신호라서 필요하다"고 설명하면 도입이 실패합니다. 정확히 어떤 질문에 답하는지를 알아야 합니다. 열 개 서비스의 p99 가 전부 정상인데 사용자 화면은 2초 걸리는 상황 — 여기서 메트릭은 원리적으로 무력합니다. 집계값이라 개별 요청의 경로를 복원할 수 없기 때문입니다. 한 요청에서 4ms 짜리 쿼리가 340번 실행되는 N+1 문제도 메트릭에는 절대 보이지 않습니다. 개별 쿼리가 빠르기 때문입니다. 이 실습은 SDK 없이 헤더 세 조각만으로 그 경로를 복원해 봄으로써, 나중에 OpenTelemetry 를 붙일 때 무엇이 실제로 일어나는지 알고 붙이게 만듭니다.

단계

  1. /opt/app/chain.py 로 게이트웨이(8120), 주문(8121), 재고(8122) 세 서비스를 띄운다. GET http://127.0.0.1:8120/order 가 200 을 준다.
  2. /root/trace/gen.py 로 traceparent 를 만들어 /root/trace/tp.txt 에 한 줄 저장한다. 00-<32hex>-<16hex>-01 형식이어야 한다.
  3. 그 헤더로 게이트웨이를 호출한다. 세 서비스가 각각 /root/trace/svc-<이름>.logtrace_id=<값> 을 남기고 세 값이 모두 같아야 한다.
  4. 각 로그에 span_id=<16hex>parent_span_id=<16hex> 도 남긴다. 세 서비스의 span_id 는 서로 달라야 한다.
  5. /root/trace/join.sh 로 세 로그에서 같은 trace_id 의 줄만 뽑아 /root/trace/joined.log 에 시각 순으로 3줄 남긴다.
  6. /opt/app/brokenchain.sh 를 실행하면 8123/8124/8125 에 두 번째 체인이 뜨고 그중 한 서비스가 헤더를 버린다. 각 서비스는 /root/trace/broken-<이름>.logsvc=<이름> in_trace=<값> out_trace=<값> 을 남긴다. 들어온 트레이스 ID 와 내보낸 트레이스 ID 가 다른 서비스를 찾아 그 이름을 /root/trace/broken.txt 에 한 줄로 적는다.
  7. /root/trace/selftime.txtslowest=<서비스명> total_ms=<정수>self_ms=<정수> 두 줄을 적는다. self 는 전체에서 자식 구간을 뺀 값이다.

참고

3단 체인 서비스 띄우기

/opt/app/chain.py 로 게이트웨이(8120), 주문(8121), 재고(8122) 세 서비스를 띄운다. GET http://127.0.0.1:8120/order 가 200 을 준다.

/opt/app/chain.py 는 인자로 받은 포트에 뜨고 다음 홉 주소를 환경변수로 받습니다. 게이트웨이, 주문, 재고 순서로 세 개를 띄우세요.

traceparent 헤더 만들기

/root/trace/gen.py 로 traceparent 를 만들어 /root/trace/tp.txt 에 한 줄 저장한다. 00-<32hex>-<16hex>-01 형식이어야 한다.

버전 2자리, 트레이스 ID 32자리, 스팬 ID 16자리, 플래그 2자리를 하이픈으로 잇습니다. 전부 소문자 16진수여야 합니다.

끝단까지 같은 트레이스 ID 전달하기

그 헤더로 게이트웨이를 호출한다. 세 서비스가 각각 /root/trace/svc-<이름>.logtrace_id=<값> 을 남기고 세 값이 모두 같아야 한다.

각 서비스가 받은 헤더에서 트레이스 ID 만 그대로 넘기고 자기 로그에 남기게 하세요.

홉마다 스팬 ID 바꾸기

각 로그에 span_id=<16hex>parent_span_id=<16hex> 도 남긴다. 세 서비스의 span_id 는 서로 달라야 한다.

부모 스팬 ID 자리에는 자기 스팬 ID 를 넣어 보냅니다. 세 로그의 스팬 ID 가 모두 달라야 정상입니다.

세 로그를 트레이스 ID 로 조인하기

/root/trace/join.sh 로 세 로그에서 같은 trace_id 의 줄만 뽑아 /root/trace/joined.log 에 시각 순으로 3줄 남긴다.

서비스별 로그 파일을 트레이스 ID 로 걸러 시각 순으로 이어 붙입니다. 조인 결과가 정확히 3줄이어야 합니다.

전파가 끊긴 서비스 찾기

/opt/app/brokenchain.sh 를 실행하면 8123/8124/8125 에 두 번째 체인이 뜨고 그중 한 서비스가 헤더를 버린다. 각 서비스는 /root/trace/broken-<이름>.logsvc=<이름> in_trace=<값> out_trace=<값> 을 남긴다. 들어온 트레이스 ID 와 내보낸 트레이스 ID 가 다른 서비스를 찾아 그 이름을 /root/trace/broken.txt 에 한 줄로 적는다.

일부러 헤더를 버리는 서비스가 하나 있습니다. 트레이스 ID 가 바뀌는 지점을 찾으면 됩니다.

자체 소요 시간 계산하기

/root/trace/selftime.txtslowest=<서비스명> total_ms=<정수>self_ms=<정수> 두 줄을 적는다. self 는 전체에서 자식 구간을 뺀 값이다.

전체 지속 시간에서 자식 스팬들의 시간을 뺍니다. 가장 느린 구간과 자체 소요 시간이 다른 곳일 수 있습니다.