Datadog에서는 기본적으로 XHR/Fetch 등의 요청만 distributed tracing(분산 추적)을 지원한다. 즉, 페이지 로드 후에 요청하는 웹 요청만 trace랑 연결해서 볼 수 있다. 페이지가 서버 사이드 렌더링(SSR) 되는 경우에는 RUM replay에서 해당 백엔드 trace를 바로 확인하기가 어렵고 아이피 등으로 하나 하나 찾아가야만 하는 문제점이 있다.
과거에 trace id를 HTML header에 넣어 document를 지원하려는 시도가 2020년도에 있었지만, 어떤 배경인지는 정확히 몰라도 다시 revert 된 상태이다. 다만, browser-sdk 자체에서는 아직 해당 기능이 살아있어서 HTML에 meta tag로 dd-trace-id, dd-trace-time을 추가해 주면 document 자체도 추적이 가능하기는 하다. 이 글에서는 이 남아있는 기능으로 document 요청을 분산 추적하는 방법을 간단하게 공유하고자 한다.
필자가 사용중인 라이브러리인 Ruby 전용 Datadog 라이브러리인 dd-trace-rb 기준이며, 타 라이브러리도 비슷하게 구현할 수 있을 것이다.
Application Helper에 아래 함수를 추가한다.
def dd_trace_meta_tags
return '' unless Rails.env.production?
span = Datadog::Tracing.active_span
trace_id = span && span.trace_id
return '' unless trace_id
unix_time = DateTime.now.strftime('%Q').to_i
tag_string = %(<meta name="dd-trace-id" content="#{trace_id}" />
<meta name="dd-trace-time" content="#{unix_time}" />)
tag_string.respond_to?(:html_safe) ? tag_string.html_safe : tag_string
end
그리고 layout 파일 내부 header 부분에 dd_trace_meta_tags
코드를 추가해주면 이후로 페이지가 로드될때마다 dd-trace-id가 meta tag로 삽입되면서 document 자체의 분산 추적이 가능해진다.
추후에 라이브러리 기본 기능으로 다시 trace id injection 기능이 추가되었으면 하는 바람이다.
참고 문서
https://github.com/DataDog/browser-sdk/issues/1833#issuecomment-1323695805