스팬 - 분산 추적의 핵심 개념 📊
분산 추적은 마이크로 서비스 기반 아키텍처에서 애플리케이션 성능 모니터링에 매우 중요합니다. 스팬에 대해 자세히 알아보기 전에 분산 추적에 대해 간략하게 살펴보겠습니다.
분산 추적이란 무엇입니까?
마이크로서비스 아키텍처에서 사용자 요청은 사용자에게 필요한 것을 제공하기 전에 수백, 심지어 수천 개의 서비스를 통해 이동합니다. 종종 단일 서비스 유지 관리를 담당하는 엔지니어링 팀은 시스템이 전체적으로 어떻게 작동하는지에 대한 가시성이 없습니다.
가상 전자 상거래 애플리케이션의 마이크로서비스 아키텍처
분산 추적은 특정 서비스가 분산 소프트웨어 시스템에서 전체의 일부로 수행되는 방법에 대한 통찰력을 제공합니다. 여기에는 사용자 요청을 추적하기 위해 호스트, 서비스 및 프로토콜을 통해 전달되는 각 사용자 요청과 함께 추적 컨텍스트를 전달하는 작업이 포함됩니다.
이러한 요청은 스팬으로 분류되며 전체 요청은 추적으로 표시됩니다.
What are spans in distributed tracing?
In distributed tracing, a user request or a transaction is represented by a trace. Traces are broken down into multiple spans. Spans represent a single logical operation within a trace. For example, a function call during a user request can be represented by a span.
분산 추적의 스팬
스팬이란 무엇입니까?
추적의 각 작업 단위는 범위로 표시됩니다. 추적은 시작부터 완료까지 요청에 대한 전체 프로세스를 나타냅니다. 아래 그림은 여러 범위로 구성된 하나의 트레이스를 보여줍니다.
아래 표시된 예에서 요청은 프런트엔드 웹 클라이언트에서 시작됩니다. 첫 번째 범위는 요청에 소요된 총 시간을 표시하는 상위 범위입니다.
상위 범위는 하위 범위를 형성하는 네 가지 서비스, 즉 다음을 호출합니다.
그런 다음 이러한 범위는 자체 하위 범위를 추가로 가질 수 있습니다.
프런트엔드 웹 클라이언트에서 시작된 요청을 보여주는 샘플 추적입니다.
상위 범위:
루트 스팬이라고도 하는 상위 스팬은 전체 요청의 엔드투엔드 대기 시간을 캡슐화합니다. 보다 명확하게 설명하기 위해 전자 상거래 웹 사이트에서 장바구니에 제품을 추가하는 것을 사용자 요청으로 정의하겠습니다. 상위 스팬은 최종 사용자가 버튼을 클릭한 이벤트부터 장바구니에 제품이 추가되기까지 걸린 시간을 측정합니다. 일부 오류가 발생하면 상위 스팬도 종료될 수 있습니다.
하위 범위:
하위 스팬은 상위 스팬에 의해 트리거되며 함수 호출, DB 호출, 다른 서비스 호출 등이 될 수 있습니다. 위에서 언급한 예에서 하위 스팬은 해당 항목의 사용 가능 여부를 확인하는 함수일 수 있습니다. 하위 범위는 요청의 각 구성 요소에 대한 가시성을 제공합니다.
추적의 모든 스팬을 결합하면 전체 수명 주기에서 요청이 어떻게 수행되었는지에 대한 자세한 정보를 얻을 수 있습니다.
스팬은 무엇으로 구성되어 있습니까?
스팬에는 스팬이 속한 요청을 고유하게 식별하는 스팬 컨텍스트가 포함됩니다. 스팬은 가용성 및 성능 문제를 디버깅하는 데 사용할 수 있는 요청, 오류 및 기간 메트릭을 제공할 수 있습니다.
작업에 더 많은 컨텍스트를 제공하기 위해 스팬 속성을 추가할 수도 있습니다. 스팬 속성은 스팬이 추적하는 특정 작업에 대한 추가 컨텍스트를 스팬에 제공하는 데 사용할 수 있는 키-값 쌍입니다.
SigNoz과 같은 APM 도구에서 선택한 범위의 세부 정보를 살펴보겠습니다.
스팬 속성: SigNoz에서 캡처한 스팬과 관련된 세부 정보
기본 범위의 예
OpenTelemetry 계측 라이브러리를 사용하여 기본 범위를 만드는 예를 살펴보겠습니다. OpenTelemetry 원격 측정 데이터(로그, 측정항목 및 추적)의 생성, 수집 및 관리 표준화를 목표로 하는 API, SDK, 라이브러리 및 통합 집합입니다.
Java에서 기본 범위를 만드는 예(출처: OpenTelemetry 문서)
Span span = tracer.spanBuilder("my span").startSpan();
// put the span into the current Context
try (Scope scope = span.makeCurrent()) {
// your use case
...
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR, "Change it to your error message");
} finally {
span.end(); // closing the scope does not end the span, this has to be done manually
}
스팬 속성 추가 예
Span span = tracer.spanBuilder("/resource/path").setSpanKind(SpanKind.CLIENT).startSpan();
span.setAttribute("http.method", "GET");
span.setAttribute("http.url", url.toString());
OpenTelemetry에 대해 자세히 알아보기:
OpenTelemetry Collector: architecture and configuration guide
Reference
이 문제에 관하여(스팬 - 분산 추적의 핵심 개념 📊), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/signoz/spans-a-key-concept-of-distributed-tracing-4idg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)