반응형

Jaeger란 무엇인가?


Jaeger는 분산 추적 시스템(Distributed Tracing System)을 위한 오픈소스 도구입니다. Uber에서 개발되었으며, 현재는 Cloud Native Computing Foundation(CNCF)의 프로젝트로 관리되고 있습니다. Jaeger는 마이크로서비스 아키텍처에서 애플리케이션의 요청 흐름을 추적하고 성능 문제를 분석하는 데 주로 사용됩니다.


  • 이름의 유래: "Jaeger"는 독일어로 "사냥꾼"을 의미하며, 시스템 내에서 복잡한 요청 경로를 "추적"한다는 의미를 담고 있습니다.
  • 핵심 기능: 분산 시스템에서 발생하는 트랜잭션의 시작부터 끝까지의 흐름을 시각화하고, 지연 시간(latency), 오류, 병목 지점을 파악합니다.

Jaeger의 주요 구성 요소


  1. Jaeger Agent:
    • 애플리케이션에 가까이 배치되어 추적 데이터를 수집.
    • UDP를 통해 데이터를 Jaeger Collector로 전송.
  2. Jaeger Collector:
    • 추적 데이터(스팬)를 수집하고 저장소(예: Elasticsearch, Cassandra)에 저장.
    • 데이터 처리 및 집계 역할.
  3. Jaeger Query & UI:
    • 저장된 추적 데이터를 조회하고 웹 UI로 시각화.
    • 사용자가 트레이스와 스팬을 분석할 수 있는 인터페이스 제공.
  4. 저장소(Storage Backend):
    • 추적 데이터를 영구 저장 (예: Elasticsearch, Cassandra, 메모리).
  5. Instrumentation:
    • 애플리케이션에 추가되는 코드(예: OpenTracing/OpenTelemetry API)로, 추적 데이터를 생성.

Jaeger가 하는 일


Jaeger는 **스팬(Span)**과 **트레이스(Trace)**라는 개념을 기반으로 동작합니다:


  • 스팬(Span): 요청의 단일 작업 단위(예: API 호출, DB 쿼리).
  • 트레이스(Trace): 여러 스팬으로 구성된 요청의 전체 흐름.

예를 들어, 사용자가 웹사이트에서 주문을 하면:


  1. 프론트엔드 → 주문 API → 결제 서비스 → DB 호출로 이어지는 요청 흐름을 하나의 트레이스로 기록.
  2. 각 단계(스팬)의 소요 시간, 성공/실패 여부 등을 추적.

Jaeger를 사용하는 이유


1. 분산 시스템의 복잡성 관리

  • 문제: 마이크로서비스 환경에서는 단일 요청이 여러 서비스를 거치며, 어디서 문제가 발생했는지 파악하기 어려움.
  • 해결: Jaeger는 요청의 전체 경로를 시각화해 병목 지점이나 오류를 빠르게 식별.
  • 예시: 주문 처리 중 결제 서비스에서 2초 지연 발생 시 Jaeger UI에서 해당 스팬 확인.

2. 성능 최적화

  • 문제: 특정 API 호출이 느리거나 응답 시간이 길어지는 이유를 찾기 어려움.
  • 해결: Jaeger는 각 스팬의 지연 시간을 분석해 성능 개선 포인트를 제공.
  • 예시: DB 쿼리 스팬이 500ms 걸린다면 쿼리 튜닝 필요.

3. 장애 분석

  • 문제: 시스템 장애 발생 시 원인을 추적하기 위해 여러 서버 로그를 뒤져야 함.
  • 해결: Jaeger는 오류가 발생한 트레이스와 스팬을 상세히 보여줘 디버깅 시간 단축.
  • 예시: "결제 실패" 오류가 특정 서비스에서 발생한 경우 해당 트레이스에서 확인.

4. 서비스 간 의존성 파악

  • 문제: 복잡한 마이크로서비스 환경에서 서비스 호출 관계를 문서화 없이 알기 어려움.
  • 해결: Jaeger는 의존성 그래프를 생성해 서비스 간 상호작용을 시각화.
  • 예시: 프론트엔드가 주문, 결제, 배송 서비스와 어떻게 연결되는지 한눈에 확인.

5. 실시간 모니터링

  • 문제: 시스템 상태를 실시간으로 파악하려면 별도 모니터링 도구 필요.
  • 해결: Jaeger는 실시간으로 트레이스를 수집하고 UI로 보여줌.
  • 예시: 트래픽 급증 시 요청 처리 속도 변화 모니터링.

6. 오픈소스와 표준 지원

  • 이유: Jaeger는 OpenTracing과 OpenTelemetry를 지원하며, 무료로 사용 가능.
  • 장점: 다양한 언어(Java, Python, Go 등)와 프레임워크(Spring Boot 등)에 쉽게 통합.

 

Jaeger 실습

1) Jaeger 서버

- jaeger 다운로드 및 압축 해제

wget https://github.com/jaegertracing/jaeger/releases/download/v1.66.0/jaeger-2.3.0-linux-amd64.tar.gz

tar zxvf jaeger-2.3.0-linux-amd64.tar.gz

 

- 폴더 이동 후 실행

cd jaeger-2.3.0-linux-amd64

./jaeger

 

- 클라이언트에서 접속 가능하도록 bind address 환경 변수 변경

export JAEGER_LISTEN_HOST=0.0.0.0

 

- 16686포트로 접속



2) 백엔드(Spring) 서버

- Spring Boot 애플리케이션에서 Jaeger 분산 추적 시스템을 설정하는 코드 작성

 

JaegerConfig.java

package com.example.jaeger.config;

import io.jaegertracing.Configuration;
import io.jaegertracing.internal.JaegerTracer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class JaegerConfig {
    @Bean
    public JaegerTracer jaegerTracer() {
        Configuration.SamplerConfiguration samplerConfig = Configuration.SamplerConfiguration.fromEnv().withType("const").withParam(1);

        Configuration.SenderConfiguration udpSender = Configuration.SenderConfiguration.fromEnv().withAgentHost("[Jaeger Server IP]");

        Configuration.ReporterConfiguration reporterConfig= Configuration.ReporterConfiguration.fromEnv().withLogSpans(true).withSender(udpSender);

        Configuration config = new Configuration("My Project").withSampler(samplerConfig).withReporter(reporterConfig);

        return config.getTracer();
    }
}
Jaeger의 JaegerTracer 객체를 Spring 빈으로 등록하여 애플리케이션에서 추적 데이터를 생성하고 Jaeger 서버로 전송할 수 있도록 합니다.
SamplerConfiguration:
  • 샘플링은 추적할 요청의 비율을 결정합니다. 모든 요청을 추적하면 성능에 부담을 줄 수 있으므로 샘플링 전략이 중요합니다.
SenderConfiguration:
  • 추적 데이터를 Jaeger로 전송하는 방법을 정의합니다.
ReporterConfiguration:
  • 추적 데이터를 어떻게 보고(report)할지 설정합니다.

3) 전체 동작

  1. Spring 초기화:
    • 애플리케이션 시작 시 JaegerConfig가 스캔되고, JaegerTracer 빈이 생성.
  2. 추적 설정:
    • 모든 요청을 추적(const 샘플러).
    • 추적 데이터를 192.0.2.45:6831(Jaeger Agent)로 전송하고 로그에도 기록.
  3. 사용:
    • 컨트롤러나 서비스에서 JaegerTracer를 주입받아 추적 시작.

 

요약 

Jaeger는 분산 시스템에서 요청 흐름을 추적하고, 성능 문제를 빠르게 파악하며, 시스템의 투명성을 확보하기 위해 사용됩니다. Jaeger를 사용하면 문제 진단 시간을 단축하고, 서비스 간 상호작용을 이해할 수 있으며 성능 최적화 및 안정성 향상에 도움이 됩니다. 또한, 마이크로서비스, 클라우드 네이티브 애플리케이션 등의 환경에서 사용하는 것이 적합합니다.

 

 

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[MSA] OpenFeign  (0) 2025.02.27
[Java] 동시성 제어하는 네가지 방법  (1) 2025.02.25
[Log] Log 중앙화  (0) 2025.02.21
[Trace] 핀포인트(Pinpoint)  (0) 2025.02.21
[Kafka] Kafka 실행 실습  (0) 2025.02.17
반응형

핀포인트(Pinpoint)란?

Pinpoint는 애플리케이션 성능 모니터링(APM, Application Performance Monitoring)을 위한 오픈소스 도구입니다. 주로 분산 시스템에서 애플리케이션의 성능 문제를 추적하고 분석하는 데 사용됩니다. Pinpoint는 특히 요청 흐름(request tracing)을 시각화하고, 병목 지점을 식별하며, 실시간 모니터링을 제공하는 데 강점을 가지고 있습니다. 한국의 네이버(Naver)에서 개발했으며, 현재는 오픈소스 프로젝트로 GitHub에서 관리되고 있습니다.
 

핀포인트의 주요 기능

  • 분산 추적(Distributed Tracing):
    • 마이크로서비스 환경에서 하나의 요청이 여러 서비스를 거치는 경로를 추적합니다.
    • 예: 사용자 요청 → 프론트엔드 → 백엔드 API → 데이터베이스 호출 과정을 시각화.

  • 실시간 모니터링:
    • 애플리케이션의 응답 시간, 처리량, 오류율 등을 실시간으로 확인.

  • 성능 분석:
    • 느린 요청이나 오류가 발생한 지점을 정확히 파악.
    • 메서드 레벨까지 세부적으로 성능 데이터 제공.

  • 시각화:
    • 웹 기반 대시보드로 트랜잭션 흐름도, 서버 상태, 통계 등을 표시.

  • 경량 에이전트:
    • 애플리케이션에 추가되는 Pinpoint 에이전트가 성능에 미치는 영향을 최소화.

 

핀포인트의 구성 요소

  1. Pinpoint Agent:
    • 모니터링 대상 애플리케이션(Java 기반)에 설치.
    • 애플리케이션의 요청 데이터(호출 스택, 시간 등)와 같은 성능 관련 지표를 수집해 Collector로 전달.
  2. Pinpoint Collector:
    • 에이전트로부터 수집된 데이터를 받아 HBase에 저장.
    • ZooKeeper로 데이터 조정 및 클러스터 관리.
  3. Pinpoint Web:
    • 저장된 데이터를 웹 UI로 시각화.
    • 사용자 인터페이스를 통해 모니터링 및 분석 제공.
  4. HBase:
    • Pinpoint의 백엔드 데이터베이스.
    • 수집된 추적 데이터와 통계를 저장.
  5. ZooKeeper:
    • Collector와 Web 간 데이터 동기화 및 클러스터 상태 관리.

 

사용 사례 및 장 단점

 

사용 사례

  • 대규모 서비스: 네이버, 쿠팡 등 트래픽이 많은 환경에서 사용.
  • 마이크로서비스: 서비스 간 호출 분석.
  • 장애 분석: 느린 응답이나 오류 원인 파악.

장점

  • 코드 수정 최소화: 에이전트를 붙이는 것만으로 모니터링 가능.
  • 상세 추적: 메서드 단위까지 분석.
  • 오픈소스: 무료로 사용 가능, 커뮤니티 지원.

단점

  • 설정 복잡성: HBase, ZooKeeper 등 의존성 설치 필요.
  • 리소스 사용: 대규모 데이터 처리 시 서버 부하 증가.

 

실습 방법

1) 저장소 및 Web 서버 설정

 

1. 자바 설치

apt update

apt install -y openjdk-8-jdk

 

2. HBase 다운로드 및 압축 해제

wget https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz

tar zxvf hbase-1.2.7-bin.tar.gz

 

3. HBase 환경 변수 수정

 

vi ./hbase-1.2.7/conf/hbase-env.sh

------------------------------------------------------

# 28번 라인 수정
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

# 44, 47, 48 라인 주석 처리 
# export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:Per    mSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheS    ize=256m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_    OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:Reserv    edCodeCacheSize=256m"

 

4. HBase 실행

./hbase-1.2.7/bin/start-hbase.sh
  • HBase 마스터와 리전 서버를 시작. 이 과정에서 ZooKeeper도 함께 시작됨(기본적으로 HBase 1.2.7은 번들 ZooKeeper 포함).

5. HBase 테이블 생성 스크립트 다운로드 및 테이블 생성

wget https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase

./hbase-1.2.7/bin/hbase shell ./hbase-create.hbase
  • Pinpoint에서 제공하는 HBase 테이블 생성 스크립트(hbase-create.hbase)를 다운로드
  • 이 스크립트는 Pinpoint가 데이터를 저장할 HBase 테이블을 정의 및 생성 (예: ApplicationTraceIndex, AgentStat 등)

6. Pinpoint Collector 다운로드 및 실행

wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.3.3/pinpoint-collector-boot-2.3.3.jar

nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.3.3.jar > collector.log 2> collector-error.log &
  • nohup: 프로세스가 터미널 종료 후에도 백그라운드에서 계속 실행되도록 함.
  • java -jar: JAR 파일을 실행.
  • -Dpinpoint.zookeeper.address=localhost: JVM 속성으로 ZooKeeper 주소를 localhost로 설정 (기본 포트 2181 가정).
  • > collector.log: 표준 출력을 collector.log 파일로 리다이렉트.
  • 2> collector-error.log: 표준 에러를 collector-error.log로 리다이렉트.
  • &: 백그라운드에서 실행.

7. Pinpoint Web 다운로드 및 실행

wget https://github.com/pinpoint-apm/pinpoint/releases/download/v2.3.3/pinpoint-web-boot-2.3.3.jar

nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.3.3.jar > web.log 2> web-error.log &

 

 

8. 8080 포트로 Pinpoint Web 접속

 

 

2) Agent 설정

 

1. 자바 설치

apt update

apt install -y openjdk-17-jdk

 

2. Pinpoint Agent다운로드 및 압축해제

wget https://repo1.maven.org/maven2/com/navercorp/pinpoint/pinpoint-agent/3.0.1/pinpoint-agent-3.0.1.tar.gz

tar zxvf pinpoint-agent-3.0.1.tar.gz

 

3. Pinpoint Agent 환경 설정에서 collector IP 주소 변경

vi ./pinpoint-agent-3.0.1/profiles/release/pinpoint.config

----------------------------------------------------

#23번 라인 수정
profiler.transport.grpc.collector.ip=[Pinpoint Collector IP Adress]

 

4. Pinpoint Agent와 함께 배포한 백엔드 서버(java) 실행

java -jar \
  -javaagent:/root/pinpoint-agent-3.0.1/pinpoint-bootstrap-3.0.1.jar \
  -Dpinpoint.agentId=my-project \
  -Dpinpoint.applicationName=spring-server \
backend-ver-SNAPSHOT.jar

 

요약

Pinpoint는 분산 시스템의 성능을 모니터링하고 요청 흐름을 추적하는 도구로, HBase와 ZooKeeper를 활용해 데이터를 저장하고 시각화합니다. 애플리케이션 성능 문제를 쉽게 파악하고 싶을 때 유용하며, 특히 Java 기반 시스템에서 강력한 기능을 발휘합니다.

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Trace] Jaeger  (0) 2025.02.21
[Log] Log 중앙화  (0) 2025.02.21
[Kafka] Kafka 실행 실습  (0) 2025.02.17
[Spring] 환경 변수 설정  (0) 2025.02.15
[Spring] @Component와 @Bean의 차이점  (0) 2025.02.15

+ Recent posts