한 곳에서 다양한 성능 문제를 조사할 수 있도록 하는 분산 추적은 하이브리드 및 마이크로 서비스 기반 환경을 위한 강력한 진단 툴입니다. 분산 추적은 분산 시스템의 구성 요소에서 발생하는 이벤트 기록을 통합합니다.

이 문서에서는 다뤄지는 내용은 다음과 같습니다.

  • 분산 추적의 정의 및 사용 방법
  • 스팬 및 트랜잭션을 포함한 분산 추적의 구조와 뉴렐릭에서의 예시
  • W3C 트레이스 컨텍스트 표준을 포함해 서비스 간에 트레이스 컨텍스트를 전달하는 방법
  • 헤드 기반 및 테일 기반 트레이스 샘플링의 장단점

분산 추적이란?

분산 추적은 분산 시스템의 다양한 구성요소에서 발생하는 이벤트 기록을 통합합니다. 이러한 이벤트는 웹사이트에서 버튼을 클릭하는 것과 같은 하나의 작업으로 트리거되며 프로세스, 네트워크 및 보안 경계를 아우릅니다. 분산 추적에 대한 이해를 돕기 위해 각 용어를 정의해 보겠습니다.

  • 분산(Distributed)은 애플리케이션의 일부로 요청을 통해 통신하는 독립적인 요소들로 구성된 분산 시스템을 말합니다.
  • 추적(Tracing)은 하나의 서비스에서 다른 서비스로 이동하는 요청의 종단 간 경로를 추적하는 트레이스를 의미합니다.

분산 추적은 통합 애플리케이션 성능 모니터링(APM) 플랫폼에 필수적인 부분으로 메트릭, 로그 및 알림 같은 다른 옵저버빌리티 툴과 통합되어, 전체 애플리케이션 스택의 상태와 성능에 대한 실시간 가시성을 제공합니다. 분산 추적은 두 가지 핵심 정보를 제공합니다.

  • 분산 시스템에서 서비스 요청이 거치는 경로
  • 각 서비스 요청을 완료하는 데 소요된 시간

마이크로서비스 기반 아키텍처를 모니터링할 때, 분산 추적은 오류가 발생한 위치와 성능 저하의 원인을 정확히 찾아내는 데 도움이 됩니다. 다음은 뉴렐릭에서 분산 추적이 작동하는 방식을 보여줍니다.

분산 추적을 실제 운영 환경에서 어떻게 활용할 수 있을까요? 트레이스 자체에근본 원인 분석을 수행하는 데 필요한 모든 관련 데이터가 포함되어 있지만, 추적 툴은 다음과 같은 기능을 제공한다는 측면에서 차별화됩니다.

  • 간편한 배포 및 계측
  • 시각화 및 쿼리
  • 설정 및 유연성

분산 추적의 구조

뉴렐릭에서 분산 추적은 세 가지 유형의 데이터를 수집합니다.

  • 스팬(Span)은 워크플로우의 일부이며, 이름과 시간이 지정된 작업입니다. 스팬 작업의 예로는 데이터 저장소 쿼리, 브라우저 측 상호 작용, 메서드 수준 시간 추적, 다른 서비스에 대한 호출, Lambda 함수 등이 있습니다. 예를 들어, HTTP 서비스의 경우 HTTP 요청이 시작될 때 생성되어 HTTP 서버가 응답을 반환할 때 완료되는 스팬이 필요할 수 있습니다. 스팬 속성에는 기간, 호스트 데이터 등 작업과 관련해 중요한 정보가 포함되어 있습니다.
  • 트랜잭션(Transaction)은 소프트웨어 애플리케이션에서 일어나는 HTTP 요청, SQL 쿼리, 백그라운드 프로세스, 메시지 대기열 활동 같은 논리적 작업의 단위입니다. 뉴렐릭에서 트랜잭션 이벤트에는 앱, 데이터베이스 호출, 트랜잭션 기간, 발생하는 모든 오류에 대한 정보가 포함됩니다.
  • 문맥적 메타데이터(Contextual metadata)는 트레이스 계산과 그 스팬간의 관계를 보여줍니다. 또한 트레이스 기간, 트레이스의 일부인 모든 엔터티, 트레이스의 일부인 엔터티 수, 트레이스 시작 시간(밀리초), 트레이스 내 모든 스팬의 관계를 나타내는 상위/하위 ID를 표시합니다.

스팬에 대한 세부 정보

분산 추적에서 스팬은 수행된 개별 작업 단위와 서비스가 요청을 처리하는 데 소요되는 시간을 나타냅니다. 트레이스는 트리와 같은 구조에 스팬을 캡슐화합니다. 둘 이상의 하위 스팬(child span)상위 스팬(parent span)에 속할 수 있습니다.

분산 추적에서 스팬을 이해하려면 다음 개념을 알아야 합니다.

  • 트레이스 기간은 트레이스의 총 기간을 말하며, 첫 스팬의 시작부터 마지막 스팬의 완료까지의 시간 길이입니다.
  • 프로세스 엔트리(process entry) 스팬은 백엔드 서비스 또는 Lambda 함수 같은 논리적 코드의 실행에서 첫 번째 스팬을 말합니다.
  • 프로세스 엑시트(process exit) 스팬은 엔트리 스팬의 상위이거나 http. 또는 db., 외부 호출로 시작되는 속성이 있는 스팬입니다.
  • 인프로세스(in-process) 스팬은 내부 메서드 호출 또는 함수를 나타내며, 엑시트 또는 엔트리 스팬이 아닙니다.
  • 클라이언트 스팬은 다른 엔터티 또는 외부 종속성에 대한 호출을 나타냅니다. 현재 두 가지 클라이언트 스팬 유형이 있습니다. 첫 번째 데이터스토어 클라이언트 스팬에는 접두사 db.가 붙은 속성이 있으며, 두 번째 외부 클라이언트 스팬에는 접두사http.가 붙은 속성이 있거나 다른 프로세스에 하위 스팬이 있습니다.

다음은 뉴렐릭 문서 트레이스 데이터의 구조에 포함된 예입니다.

트랜잭션에 관한 세부 정보

트랜잭션은 소프트웨어 애플리케이션의 논리적 작업 단위입니다. 특히 해당 작업 단위를 구성하는 함수 호출과 메서드 호출을 나타냅니다. 애플리케이션 성능 모니터링의 맥락에서, 이는 종종 애플리케이션이 웹 요청을 받는 시점부터 응답이 전송되는 시점까지의 활동을 나타내는 웹 트랜잭션을 의미합니다.

분산 추적에 대한 블로그 게시물에서 에리카 아놀드(Erika Arnold)는 분산 추적이 트랜잭션을 사용하는 세 가지 주요 방법을 설명합니다.

  • 트랜잭션 분석: 추적은 시스템 전체에서 발생하는 트랜잭션을 모니터링하여 성능에 대한 인사이트를 확보합니다. 각 트랜잭션은 성능에 영향을 미치며, 성능이 저하된 서비스는 나머지 서비스에 영향을 미칩니다.
  • 트랜잭션 기록: 추적은 많은 트랜잭션을 따라가는 데 도움이 됩니다. 요청과 함께 서비스로 들어오는 추적 컨텍스트는 다른 프로세스로 전파되고 트랜잭션 데이터에 첨부됩니다. 이 컨텍스트를 사용하여 나중에 트랜잭션들을 서로 연관시킬 수 있습니다. 업계가 모놀리식 애플리케이션에서 마이크로서비스로 이동함에 따라, APM 에이전트를 설치할 수 없는 프로세스의 경계 너머까지 트랜잭션을 추적하는 것이 점점 더 중요해지고 있습니다.
  • 트랜잭션 설명: 추적은 트랜잭션을 측정하는 데 도움이 되며 어떤 트랜잭션이 발생했는지, 얼마나 오래 지속되었는지와 같은 정보를 제공합니다.

서비스 간 트레이스 컨텍스트 전달

트레이스 컨텍스트는 뉴렐릭의 HTTP 헤더 세트를 말하며, 종단 간 추적을 위해 한 서비스에서 다른 서비스로 데이터를 전파합니다. 모니터링 에이전트는 이러한 HTTP 헤더를 서비스의 아웃바운드(발신) 요청에 추가합니다. HTTP 헤더는 소프트웨어 트레이스를 식별하고 다양한 네트워크, 프로세스 및 보안 시스템을 통과하는 동안 식별 정보를 전달합니다. 이러한 헤더에는 다음이 포함됩니다.

  • 각 트레이스 스팬에는 guid 속성이 있습니다. 프로세스에서 마지막 스팬의 guid는 아웃바운드 요청과 함께 전송되므로 수신 서비스의 첫 번째 작업 세그먼트가 이 guidparentId 속성으로 추가할 수 있습니다.
  • parent type은 모바일, 브라우저 또는 Ruby 앱 같은 트레이스 헤더의 소스입니다. 이는 요청에 의해 트리거된 트랜잭션에서 parent.type 속성이 됩니다.
  • timestamp는 페이로드가 생성된 UNIX 타임스탬프를 밀리초 단위로 나타낸 것입니다.
  • traceId는 프로세스 간 경계 및 프로세스 내 경계를 넘을 때 단일 요청을 식별하는 데 사용되는 고유한 ID입니다. 이 ID는 분산 추적에서 스팬들을 연결하는 데 도움이 됩니다.
  • transactionId는 트랜잭션 이벤트의 고유 식별자입니다.
  • priority는 샘플링 한계에 도달했을 때 어떤 데이터를 샘플링할지 결정하는 데 도움이 되는 우선순위 값으로 임의로 생성됩니다.
  • Sampled는 요청에 대해 추적 데이터를 수집해야 하는지 여부를 에이전트에 알려주는 부울 값입니다. 완전한 트레이스를 위해 샘플링된 이러한 트랜잭션에는 sampled 속성에 대한 true 값이 주어지며, 이는 다운스트림으로 전송되어 스팬들을 수집하기 위해 트레이스가 접촉하는 다른 모든 APM 에이전트에 신호를 보냅니니다. 이러한 다운스트림 스팬에도 sampled 속성에 대한 true 값이 주어집니다.

분산 환경에서 W3C 트레이스 컨텍스트 표준의 사용

환경에서 여러 툴이 사용되고 있는 경우는 어떨까요? 트레이스 컨텍스트가 표준화되지 않으면, 트레이스들이 상호 연관될 수도 없고 여러 공급업체 툴 간에 전파될 수도 없습니다. 여러 미들웨어 서비스와 클라우드 플랫폼이 사용되는 분산 환경에서는 이러한 문제가 중요합니다. W3C 트레이스 컨텍스트 표준은 "트레이스 컨텍스트 전파 데이터 교환을 위해 보편적으로 합의된 형식"을 정의합니다.

이 표준은 다음을 제공하여 상호 운용성 문제를 개선합니다.

  • 개별 트레이스 및 요청에 대한 고유 식별자
  • 여러 추적 툴이 단일 트랜잭션에 참여할 때 트레이스가 손상되는 것을 방지하고 공급업체별 트레이스 데이터를 전달하기 위해 합의된 메커니즘
  • 중개자, 플랫폼 및 하드웨어 공급업체가 지원할 수 있는 업계 표준

이 표준을 준수하려면 추적 툴은 traceparenttracestate 헤더를 전파하여 트레이스 컨텍스트와 상호 작용해야 합니다. 뉴렐릭은 이 두 가지 필수 헤더를 송수신하는 W3C 뉴렐릭 에이전트를 사용해 이를 구현합니다. 이 에이전트는 또한 이전 뉴렐릭 에이전트의 헤더를 송수신합니다. 뉴렐릭이 지원하는 트레이스 컨텍스트는 다음과 같습니다.

  • W3C traceparent는 전체 트레이스(트레이스 ID) 및 호출 서비스(스팬 ID)를 식별합니다.traceparent 헤더는 이동 가능하며 길이가 고정된 포맷으로 트레이스 그래프에서 들어오는 요청의 위치를 설명합니다. 모든 추적 툴은 traceparent를 설정해야 합니다. 툴이 tracestate의 공급업체별 정보에만 의존하는 경우에도 마찬가지입니다.
  • W3C tracestate는 공급업체별 정보를 가지고 이동하며 트레이스가 있었던 위치를 추적합니다.tracestate 헤더는 이름/값 쌍 세트로 표시되는 공급업체별 데이터로 traceparent확장합니다.Tracestate에에 정보를 저장하는 것은 선택 사항입니다.
  • 뉴렐릭 독점 헤더는 이전 뉴렐릭 에이전트와의 하위 호환성을 유지하는 데 사용되는 고유한 헤더입니다.

다음은 뉴렐릭 문서 애플리케이션 간에 트레이스 컨텍스트가 전달되는 방법에 포함된 예시 시나리오입니다. 요청이 OpenTelemetry 트레이서, W3C 트레이스 컨텍스트 표준을 사용하는 뉴렐릭 에이전트 및 W3C 트레이스 컨텍스트 표준 이전의 이전 뉴렐릭 에이전트에 접촉할 때 흐름을 보여줍니다.

요청이 세 가지 에이전트 유형에 닿을 때 헤더의 흐름을 보여주는 분산 추적 다이어그램

트레이스 샘플링: 헤드 기반 및 테일 기반

트레이스 샘플링은 분산 추적에서 수집 및 저장되는 트레이스 데이터의 양을 줄이는 데 사용되는 기술입니다. 트레이스 데이터를 샘플링하면 분산 추적과 관련된 오버헤드가 줄어들고 시스템 성능에 대한 대표적인 샘플을 얻을 수 있습니다. 헤드 기반과 테일 기반의 두 가지 트레이스 샘플링 방법이 있습니다.

헤드 기반 샘플링

헤드 기반 샘플링은 트레이스의 시작 부분에서 수집 및 저장할 트레이스를 무작위로 선택합니다. 스토리지 및 성능 문제를 피하면서 대표적인 활동 샘플을 캡처하는 데 사용됩니다. 분산 추적에서 모니터링되는 첫 번째 서비스인 트레이스 오리진은 추적할 요청을 임의로 선택하고, 이 결정은 해당 요청에 의해 영향을 받는 다운스트림 서비스로 전파되어, 추적 툴에서 트레이스의 모든 스팬을 사용할 수 있도록 합니다.

여기에는 적응형 샘플링이 포함됩니다. 적응형 샘플링은 헤드 기반 샘플링에 적용되는 기술로 APM 에이전트가 트랜잭션 처리량의 변화에 기반해 수집하는 트랜잭션 수의 한도를 조정합니다. 한도가 분당 10개 트레이스인 경우, 에이전트는 1분 동안 수집된 10개의 트레이스를 분산하여 시간 경과에 따른 대표 샘플을 얻습니다. 속도는 트랜잭션 처리량의 변화에 따라 달라지므로, 이전 분에 100개의 트랜잭션이 있었다면 에이전트는 비슷한 수의 트랜잭션을 예상하고 추적할 트랜잭션 10개 중 1개를 선택합니다.

테일 기반 샘플링

헤드 기반 샘플링과 달리, 테일 기반 샘플링의 트레이스 보존 결정은 트레이스의 모든 스팬이 테일 끝에 도달한 후에 수행됩니다.

헤드 기반 샘플링과 테일 기반 샘플링의 장단점

 

헤드 기반 샘플링

테일 기반 샘플링

장점

  • 트랜잭션 처리량이 적은 애플리케이션에 적합합니다.
  • 빠르고 간편하게 시작하고 실행할 수 있습니다.
  • 혼합된 모놀리식 및 마이크로서비스 환경에 적합합니다.
  • 애플리케이션 성능에 거의 또는 전혀 영향을 주지 않습니다.
  • 낮은 비용으로 서드파티 툴에 트레이스 데이터를 전송할 수 있는 솔루션입니다.
  • 통계 샘플링이 분산 시스템에 대한 적절한 투명성을 제공합니다.
  • 트레이스의 100% 관찰하고 분석할 수 있습니다.
  • 트레이스가 완전히 완료된 후에 샘플링을 합니다.
  • 오류나 특징이 없는 속도 저하가 있는 트레이스를 보다 빠르게 시각화해줍니다.

단점

  • 트레이스가 무작위로 샘플링됩니다.
  • 샘플링은 트레이스의 경로가 여러 서비스를 통해 완전히 완료되기 전에 수행되므로 어떤 트레이스에 문제가 발생할 수 있는지 미리 알 수 없습니다.
  • 처리량이 많은 시스템에서는 오류나 비정상적인 레이턴시가 있는 트레이스가 샘플링에서 누락될 수 있습니다.
  • 샘플링 소프트웨어를 실행하려면 게이트웨이, 프록시 및 위성이 추가로 필요할 수 있습니다.
  • 경우에 따라 서드파티 소프트웨어를 관리하고 확장하려면 추가 작업이 필요합니다.
  • 더 많은 데이터를 전송 및 저장하는 데 추가 비용이 발생합니다.

Choosing a distributed tracing tool

Selecting the right distributed tracing tools is paramount for achieving clear visibility into application performance. A distributed tracing tool should offer more than just data collection; it should empower engineers by transforming raw data into actionable insights. When choosing such a tool, consider the following:

  • Transparency in performance claims: Ensure the tool provides accurate and honest insights about its performance capabilities.
  • Straightforward pricing: Look for clear, no-fluff pricing models that align with your usage needs and offer real value.
  • Actionable insights: Choose a tool that turns data into practical, empowering insights, facilitating informed decision-making.
  • Comprehensive language support: The tool should support a wide range of programming languages to accommodate diverse development environments.
  • Scalability: Opt for a solution that can efficiently scale with your infrastructure as it grows and evolves.
  • Real-time visualization: It's crucial to have a tool that offers real-time visualizations of your system’s health for immediate insights.
  • Alignment with team needs: The tool should resonate with your team's unique operational requirements and foster an environment conducive to learning and innovation.
  • Streamlined troubleshooting: Prioritize tools that simplify the process of identifying and resolving performance issues.
  • Continuous learning and optimization: Look for features that encourage ongoing system optimization and learning opportunities for the team.