모놀리식 시절의 디버깅은 스택 트레이스 한 장이면 끝났다. 함수가 함수를 부르고, 예외가 터지면 호출 스택이 위에서 아래로 한 줄씩 찍혔다. 그런데 그 모놀리스를 수십 개의 마이크로서비스로 쪼개고, API Gateway 뒤에 Lambda가 붙고, 그 Lambda가 다른 Lambda를 부르고, 그 사이에 DynamoDB와 SQS와 외부 HTTP API가 끼어드는 순간 "스택 트레이스"라는 개념 자체가 무너진다. 하나의 사용자 요청이 프로세스 경계를, 네트워크를, 비동기 큐를 넘나들며 흩어지기 때문이다. "이 요청이 왜 3초나 걸렸는가"라는 질문에 답하려면, 흩어진 작업 조각들을 다시 하나의 인과 사슬로 꿰어야 한다. 그 꿰는 일이 분산 추적(distributed tracing)이고, AWS X-Ray는 그 모델을 AWS 생태계 위에 구현한 것이다.
오늘은 X-Ray를 단순히 "Service Map 보는 도구"로 보지 않고, 그 밑에 깔린 인과 모델을 판다. Trace가 왜 트리(tree)가 아니라 방향성 비순환 그래프(DAG)에 가까운지, Trace ID가 어떻게 프로세스 경계를 넘어 컨텍스트를 전파하는지, X-Ray의 세그먼트 모델이 Google Dapper 논문에서 어떻게 유래했고 OpenTelemetry의 span 모델과 어떻게 다른지, Annotation과 Metadata의 인덱싱 차이가 검색 엔진의 역인덱스 비용과 어떻게 연결되는지를 본다