트레이스 및 스팬 ID를 사용하여 모든 계층의 스프링 부트 메트릭을 개선합니다.

트레이스 및 스팬 ID를 사용하여 모든 계층의 스프링 부트 메트릭을 개선합니다.
트레이스 및 스팬 ID를 사용하여 모든 계층의 스프링 부트 메트릭을 개선합니다.

스프링 부팅에서 통일 및 추적

분산 시스템으로 작업 할 때는 모든 계층의 관찰 가능성을 보장하는 것이 중요합니다. Spring Boot에서 로그는 이미 추적 ID를 캡처 할 수 있으므로 서비스 전체에서 요청을보다 쉽게 ​​추적 할 수 있습니다. 그러나 이러한 추적 및 스팬 ID를 메트릭에 통합하는 것은 여전히 ​​어려운 일입니다. 📊

성능 문제를 디버깅한다고 상상해 보면 추적 ID로 로그를 볼 수 있지만 특정 메트릭 데이터와 관련이 없습니다. 이 제한은 시스템 동작을 효과적으로 분석하기가 더 어려워집니다. 이 차이를 연결하려면 추적 및 스팬 ID와 함께 다양한 레이어 (레스트 컨트롤러 및 JPA 리포지토리)의 메트릭을 태그하는 방법이 필요합니다.

Prometheus, Grafana 및 Zipkin은 강력한 모니터링 및 추적 기능을 제공합니다. 로그는 요청 흐름에 대한 통찰력을 제공하지만 추적 컨텍스트를 메트릭에 첨부하면 모든 계층의 가시성이 향상됩니다. 즉, 대기 시간, 오류율 및 처리량을 특정 사용자 요청과 상관시킬 수 있습니다.

이 안내서에서는 스프링 부팅을 구성하여 각 애플리케이션 계층의 추적 및 SPAN ID를 메트릭으로 추가하는 방법을 살펴 보겠습니다. REST 엔드 포인트 또는 데이터베이스 상호 작용을 다루 든이 접근법은 전체 스택 관찰 가능성을 달성하는 데 도움이됩니다. 🚀

명령 사용의 예
OncePerRequestFilter 요청이 수명 주기당 한 번만 처리되도록하는 스프링 부트 필터는 메트릭에 추적 ID를 추가하는 데 유용합니다.
MeterRegistry.counter() 사용자 정의 메트릭 카운터를 생성하고 증분하는 데 사용되므로 마이크로 미터의 트레이스 ID가있는 메트릭 태그를 표시 할 수 있습니다.
TraceContextHolder.getTraceId() 추적 컨텍스트에서 현재 추적 ID를 검색하여 계층 간의 올바른 상관 관계를 보장하는 사용자 정의 유틸리티 방법.
StatementInspector 실행 전에 SQL 쿼리를 수정하고 검사 할 수있는 최대 절전 모드의 인터페이스로 데이터베이스 메트릭 태그에 유용합니다.
fetch("http://localhost:9090/api/v1/query") API를 통해 Prometheus 메트릭 데이터를 가져와 프론트 엔드에 실시간 추적 ID 기반 메트릭을 표시합니다.
response.json() Prometheus API 응답을 JSON 형식으로 구문 분석하여 React에서 메트릭을 쉽게 처리하고 표시 할 수 있습니다.
meterRegistry.counter().increment() 특정 메트릭 카운터를 명시 적으로 증가시켜 각 요청 또는 데이터베이스 쿼리를 추적 ID와 함께 계산할 수 있습니다.
filterChain.doFilter() 체인의 다음 필터에 요청과 응답을 전달하여 메트릭을 추가 한 후 정상적인 요청 처리를 보장합니다.
useEffect(() =>useEffect(() => {}, []) 컴포넌트 마운트에서 한 번 실행되는 반응 후크는 대시 보드가로드 될 때 프로 메테우스 메트릭을 가져 오는 데 사용됩니다.

메트릭에서 추적 ID로 관찰 가능성을 향상시킵니다

최신 분산 시스템에서는 로그와 메트릭을 상관시키는 것이 디버깅 및 성능 모니터링에 중요합니다. 우리가 개발 한 스크립트는 통합에 도움이됩니다 추적 ID 그리고 스팬 ID Spring Boot의 관찰 가능성 스택으로. 첫 번째 스크립트는 사용하는 사용자 정의 필터를 소개합니다 OneperRequestFilter 들어오는 HTTP 요청을 가로 채고 추적 ID를 마이크로 미터 메트릭에 첨부합니다. 이를 통해 모든 HTTP 요청에 해당 트레이스 ID가 포함되어 있습니다. 이 없으면 여러 서비스에서 개별 요청을 추적하는 것은 어려울 것입니다. 문제가 컨트롤러, 서비스 또는 데이터베이스 계층에 있는지 알지 못하고 느린 API 응답 문제를 해결하는 것을 상상해보십시오! 🚀

두 번째 스크립트는 활용하여 지속성 계층에 중점을 둡니다. Hibernate의 stationinspector. 이 구성 요소는 실행 전에 SQL 쿼리를 검사하여 추적 ID를 데이터베이스 상호 작용에 추가 할 수 있습니다. 즉, HTTP 요청뿐만 아니라 생성하는 쿼리도 추적하여 시스템 성능에 대한 전체 스택보기를 제공 할 수 있습니다. 예를 들어, 리포지토리 메소드를 호출하는 엔드 포인트가 느린 쿼리를 초래하면 태그 메트릭이 근본 원인을 식별하는 데 도움이 될 수 있습니다. 사용하여 meterregistry.counter (), 우리는 쿼리가 실행될 때마다 메트릭을 증가시켜 데이터베이스 성능에 대한 완전한 가시성을 보장합니다.

프론트 엔드 측면에서, 우리는 트레이스 ID로 태그 된 Prometheus 메트릭을 가져오고 표시하는 간단한 React 대시 보드를 만들었습니다. 사용 술책() 응용 프로그램이 Prometheus의 데이터를 실시간으로 검색 할 수 있습니다. 사용자가 대시 보드를 열면 추적 ID 당 요청 수가 표시되어 팀이 백엔드 활동과 사용자 동작과 관련이 있습니다. 특정 요청을 디버깅하는 개발자는 추적 ID를 신속하게 찾아서 얼마나 많은 쿼리가 트리거되었는지 확인할 수 있습니다. 이 접근법은 모니터링을 향상시키고 디버깅 세션을 훨씬 더 효율적으로 만듭니다. 📊

궁극적으로 이러한 솔루션은 함께 작동하여 모든 애플리케이션 계층에서 원활한 추적 경험을 만듭니다. Spring Boot의 관측 성 도구를 Prometheus, Grafana 및 Zipkin과 결합하여 전체 모니터링을 달성합니다. 개발자는 이제 진입 지점에서 데이터베이스 쿼리로의 요청을 쉽게 추적 할 수 있습니다. 이것은 시스템 신뢰성을 향상시킬뿐만 아니라 디버깅 시간을 줄입니다. 실제 시나리오에서는 문제가 증가하기 전에 성능 병목 현상을 감지하고 리소스 할당을 최적화하는 데 도움이됩니다. 이러한 관찰 가능성 모범 사례를 구현하면 더 나은 성능, 더 빠른 문제 해결 및 향상된 사용자 경험이 보장됩니다. 🚀

전체 관찰 가능성을 위해 메트릭으로 추적 ID 구현

마이크로 미터 및 Sleuth가있는 스프링 부트를 사용한 백엔드 솔루션

// Import necessary packages
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;
@Component
public class TraceIdMetricFilter extends OncePerRequestFilter {
    private final MeterRegistry meterRegistry;
    public TraceIdMetricFilter(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String traceId = Optional.ofNullable(request.getHeader("traceId")).orElse("unknown");
        meterRegistry.counter("http.requests", "traceId", traceId).increment();
        filterChain.doFilter(request, response);
    }
}

JPA와 함께 추적 ID를 데이터베이스 메트릭에 통합합니다

최대 절전 모수와 마이크로 미터가있는 스프링 부츠를 사용한 백엔드 솔루션

// Import necessary packages
import io.micrometer.core.instrument.MeterRegistry;
import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.springframework.stereotype.Component;
@Component
public class TraceIdStatementInspector implements StatementInspector {
    private final MeterRegistry meterRegistry;
    public TraceIdStatementInspector(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }
    @Override
    public String inspect(String sql) {
        String traceId = TraceContextHolder.getTraceId(); // Assume TraceContextHolder gets the traceId
        meterRegistry.counter("database.queries", "traceId", traceId).increment();
        return sql;
    }
}

프론트 엔드 통합 : 추적 ID 메트릭 표시

React 및 Prometheus API를 사용한 프론트 엔드 구현

import React, { useEffect, useState } from "react";
const MetricsDashboard = () => {
  const [metrics, setMetrics] = useState([]);
  useEffect(() => {
    fetch("http://localhost:9090/api/v1/query?query=http_requests_total")
      .then(response => response.json())
      .then(data => setMetrics(data.data.result));
  }, []);
  return (
    <div>
      <h2>Trace ID Metrics</h2>
      <ul>
        {metrics.map((metric, index) => (
          <li key={index}>{metric.metric.traceId}: {metric.value[1]} requests</li>
        ))}
      </ul>
    </div>
  );
};
export default MetricsDashboard;

스프링 부트 메트릭의 고급 추적 성

우리가 통합을 탐구하는 동안 추적 ID REST 및 데이터베이스 메트릭으로, 또 다른 중요한 측면은 분산 트랜잭션을 모니터링하는 것입니다. 마이크로 서비스 아키텍처에서 단일 사용자 요청은 종종 여러 서비스에 걸쳐있어 요청이 전파되는 방식을 추적하는 데 필수적입니다. Spring Boot는 OpenTelemetry와 같은 도구와 결합하면 각 서비스 상호 작용에 대한 자세한 범위를 캡처 할 수 있습니다. 이를 통해 Frontend UI의 API 및 데이터베이스에 대한 요청이 모두 단일 트레이스에서 상관 관계가 있습니다. 이 없으면 성능 병목 현상을 디버깅하는 것이 훨씬 어려워집니다. 🔍

또 다른 중요한 측면은 비동기 작업에 추적 성을 적용하는 것입니다. 최신 응용 프로그램에서 Kafka 또는 RabbitMQ의 이벤트 중심 동작과 같은 많은 프로세스가 배경에서 실행됩니다. 메시지 대기열에서 추적 ID를 전파하기 위해 Spring Boot를 구성함으로써 비동기 작업조차도 올바르게 추적되는지 확인할 수 있습니다. 예를 들어, 주문이 전자 상거래 시스템에 배치되면 여러 서비스가 재고, 지불 및 알림을 처리합니다. 이러한 단계 중 하나에서 문제가 발생하면 적절한 스팬 전파없이 근본 원인을 추적하는 것은 거의 불가능합니다.

추적을 구현할 때 보안 및 데이터 무결성도 핵심입니다. 트레이스 ID를 외부로 노출하면 제대로 처리하지 않으면 보안 위험이 발생할 수 있습니다. 모범 사례에는 민감한 트레이스 정보 필터링 및 로그 및 메트릭이 실수로 개인 데이터를 노출시키지 않도록하는 것이 포함됩니다. 또한 추적 성을 역할 기반 액세스 제어와 결합하면 공인 직원만이 자세한 추적 정보를 쿼리 할 수 ​​있습니다. 이러한 보안 조치를 구현하면 관찰 가능성이 책임보다는 자산으로 남아 있습니다. 🚀

스프링 부츠 추적성에 대한 자주 묻는 질문

  1. 스프링 부팅 애플리케이션에서 추적을 활성화하려면 어떻게해야합니까?
  2. Spring Boot는 추적을 지원합니다 Spring Cloud Sleuth 그리고 Micrometer. 적절한 종속성을 추가하고 추적 속성을 구성하면 추적 및 스팬 ID를 자동으로 캡처 할 수 있습니다.
  3. 여러 마이크로 서비스에서 추적 ID를 추적 할 수 있습니까?
  4. 예, 사용하여 Zipkin 또는 Jaeger 분산 추적 라이브러리와 함께 추적 ID는 여러 서비스에서 전파 될 수있어 요청 흐름에 대한 전체 가시성을 제공 할 수 있습니다.
  5. 추적 ID를 Kafka 메시지에 어떻게 첨부하려면?
  6. 사용하는 메시지 헤더에 추적 ID를 포함시킬 수 있습니다. KafkaTemplate.send(). 메시지를 소비 할 때 추적 ID를 추출하여 추적 컨텍스트에서 설정하십시오.
  7. Grafana 대시 보드에서 추적 ID를 볼 수 있습니까?
  8. 예, Prometheus와 Grafana를 구성하여 Micrometer tags, Grafana 패널에서 추적 관련 메트릭을 직접 시각화 할 수 있습니다.
  9. 추적 ID 보안을 어떻게 보장합니까?
  10. 추적 정보를 보호하려면 외부 API 및 로그에 추적 ID를 노출하지 마십시오. 사용 log sanitization 로그를 저장하기 전에 민감한 데이터를 필터링하는 기술.

스프링 부트 응용 프로그램에서 관측 성 최적화

모든 계층에서 추적 ID를 구현하면 응용 프로그램 동작에 대한 깊은 통찰력이 제공됩니다. 트레이스 및 SPAN ID로 메트릭을 태그하면 개발자가 엔드 투 엔드 가시성을 얻으므로 느린 요청이나 실패한 서비스를보다 쉽게 ​​진단 할 수 있습니다. Prometheus 및 Grafana와 같은 도구를 사용하면 실시간 모니터링이 향상됩니다.

디버깅 외에도 구조화 된 추적은 성능 최적화를 향상시키는 데 도움이됩니다. 비효율적 인 데이터베이스 쿼리 식별, 마이크로 서비스 대기 시간 추적 및 요청 흐름 분석이 훨씬 간단 해집니다. 추적 기술에 투자하면 더 나은 문제 해결뿐만 아니라 더 부드러운 사용자 경험을 보장합니다. 🔍

메트릭에서 추적 ID를 구현하기위한 소스 및 참조
  1. 스프링 부트의 트레이싱 통합과 마이크로 미터 및 Sleuth 통합에 관한 공식 문서 : 스프링 클라우드 sleuth .
  2. 스프링 부팅 애플리케이션 모니터링을위한 Prometheus 및 Grafana 설정에 대한 안내 : 프로 메테우스 문서 .
  3. Zipkin을 사용하여 분산 추적을위한 모범 사례 : Zipkin 아키텍처 .
  4. 최대 절전 모드 쿼리에서 추적 및 스팬 ID 전파 구현 : 최대 절전 모드 가이드 .