분산 추적(APM) 모범 사례¶
필수 조건¶
계정 등록: 공식 웹사이트 https://guance.com/에서 계정을 등록하고, 등록된 계정/비밀번호로 로그인합니다.
Datakit 설치¶
명령어 가져오기¶
[통합] 모듈을 클릭하고 [DataKit]를 선택한 후, 운영체제 및 시스템 유형에 맞는 설치 명령어를 선택합니다.
설치 실행¶
Datakit 설치 명령어를 복사하여 모니터링 대상 서버에서 직접 실행합니다.
- 설치 디렉터리 /usr/local/datakit/
- 로그 디렉터리 /var/log/datakit/
- 주 설정 파일 /usr/local/datakit/conf.d/datakit.conf
- 플러그인 설정 디렉터리 /usr/local/datakit/conf.d/
Datakit 설치가 완료되면 Linux 호스트 기본 플러그인이 기본으로 활성화됩니다. DF – 인프라 – 내장 보기에서 확인할 수 있습니다.
| 수집기 이름 | 설명 |
|---|---|
| cpu | 호스트의 CPU 사용량 수집 |
| disk | 디스크 점유율 수집 |
| diskio | 호스트의 디스크 IO 수집 |
| mem | 호스트의 메모리 사용량 수집 |
| swap | Swap 메모리 사용량 수집 |
| system | 호스트 운영체제 부하 수집 |
| net | 호스트 네트워크 트래픽 수집 |
| host_process | 호스트에서 상주(10분 이상 실행)하는 프로세스 목록 수집 |
| hostobject | 호스트 기본 정보(운영체제 정보, 하드웨어 정보 등) 수집 |
| docker | 호스트의 컨테이너 객체 및 컨테이너 로그 수집 |
[인프라] 모듈을 클릭하여 Datakit이 설치된 모든 호스트 목록 및 호스트명, CPU, 메모리 등의 기본 정보를 확인합니다.
[호스트명]을 클릭하면 해당 호스트의 상세 시스템 정보, 통합 실행 상태(해당 호스트에 설치된 모든 플러그인), 내장 보기(호스트)를 확인할 수 있습니다.
[통합 실행 상태]에서 임의의 플러그인 이름을 클릭하고 [모니터링 보기]를 클릭하면 해당 플러그인의 내장 보기를 확인할 수 있습니다.
분산 추적(APM) 모니터링 시나리오 확인¶
guance에 로그인하여 특정 프로젝트 워크스페이스로 이동한 후, 애플리케이션 성능 모니터링(APM)을 클릭하여 확인합니다.
분산 추적(APM) 소개¶
APM은 Application Performance Management(애플리케이션 성능 관리) 의 약자로, 인터넷 발전과 함께 파생된 모니터링 기술입니다. 처음 등장한 목적은 인터넷 사용자의 높은 동시성과 대규모 트래픽으로 인한 애플리케이션 성능 병목 문제를 해결하기 위한 것이었습니다. 개발 및 운영 관점에서 애플리케이션의 계층별 호출 로직을 투명하게 만들어 기업 내부에서 신속하게 장애를 파악하고 MTTR(Mean Time to Repair, 평균 장애 복구 시간)을 단축하여 전반적인 사용자 경험을 향상시키는 데 중점을 둡니다. 본질적으로 APM은 NPM(네트워크 성능 모니터링), 로그 등의 배포 방식과 큰 차이가 있으며, 적용 시나리오도 약간 다릅니다. APM의 배포 방식은 일반적으로 침투적(바이트코드 삽입 또는 AOP)인 반면, 로그 및 NPM은 사용자 코드에 침투할 필요가 없는 경우가 많습니다. APM은 주로 개발 및 운영팀이 시스템의 전반적인 실행 상태, 정상 정도, 외부 API, 데이터베이스 호출, 더 나아가 세분화된 코드 및 메서드 호출의 리소스 소비 또는 이상 문제를 확인하는 데 사용되며, 애플리케이션 측면의 시스템 성능 및 안정성 보장에 중점을 둡니다. NPM의 주요 적용 시나리오는 네트워크 링크 측의 지연, 패킷 손실, 패킷 캡처 및 분석이며, 특정 애플리케이션 내의 코드 성능 분석은 포함하지 않습니다. 로그는 알려진 문제 처리, 비즈니스 로그에 더 중점을 두며, 구체적인 코드 품질 분석도 다루지 않습니다.
분산 추적 관련 용어 설명:
| 키워드 | 설명 |
|---|---|
| 서비스 | service_name이며, Trace 모니터링 추가 시 사용자 정의 가능 |
| 리소스 | 애플리케이션에서 단일 독립 접근 요청을 처리하는 요청 진입점 |
| 지속 시간 | 응답 시간으로, 애플리케이션이 요청을 수신한 시점부터 응답을 반환할 때까지의 전체 요청 과정 |
| 상태 | 상태는 OK와 ERROR로 구분되며, 오류에는 오류율 및 오류 수가 포함 |
| Span | 단일 메서드 호출의 전체 프로세스를 Trace 링크라고 하며, Trace는 여러 개의 Span 단위로 구성 |
DF는 공식적으로 Opentracing 프로토콜을 지원하는 모든 APM 모니터링 도구를 지원합니다. 예를 들어 시장에서 널리 사용되는 Skywalking, Zipkin, Jaeger, Ddtrace 등이 있으며, 구체적인 연동 방식도 기존 오픈소스 모니터링 도구의 연동 방식과 동일합니다. 즉, 원래 코드에 관련 모니터링 파일을 추가하거나 임포트(예: Java에 Jar 패키지 임포트)한 후 datakit에서 해당 inputs를 활성화하면 링크 데이터를 DF 플랫폼으로 전송할 수 있습니다. 또한 로그, 메트릭, 인프라 데이터와 연관 분석하여 통합 모니터링 및 운영 개발을 실현하고 전반적인 문제 해결 효율성을 높일 수 있습니다.
분산 추적(APM) 수집 관련 설정¶
datakit.conf에서 분산 추적 inputs 활성화¶
###########--------Linux 환경---------##########
$ cd /usr/local/datakit/conf.d/
###########--------Windows 환경-------##########
$ C:\Program Files\datakit\conf.d
## 서로 다른 모니터링 도구를 사용하려면 서로 다른 conf 파일을 활성화해야 합니다. 한 가지 도구만 사용하는 경우 해당 conf 파일만 복사하여 활성화하면 됩니다. 이 문서에서는 ddtrace를 사용합니다.
#############----------skywalking----------###########
$ cd /traceSkywalking
$ cp traceSkywalking.conf.sample traceSkywalking.conf
#############----------skywalking----------###########
#############------------jaeger------------###########
$ cd /traceJaeger
$ cp traceJaeger.conf.sample traceJaeger.conf
#############------------jaeger------------###########
#############------------zipkin------------###########
$ cd /traceZipkin
$ cp traceZipkin.conf.sample traceZipkin.conf
#############------------zipkin------------###########
#############------------ddtrace------------###########
$ cd /ddtrace
$ cp ddtrace.conf.sample ddtrace.conf
#############------------zipkin------------###########
## 파일 복사 후 vim으로 편집 모드에 진입하여 inputs의 주석을 해제합니다.
## 예시: ddtrace tags 관련 주석은 필요에 따라 활성화하여 비즈니스 또는 기타 관련 태그를 추가할 수 있습니다.
$ vim ddtrace.conf
$ [inputs.ddtrace]
$ path = "/v0.4/traces"
$ # [inputs.ddtrace.tags]
$ # tag1 = "tomcat"
$ # tag2 = "tag2"
$ # tag3 = "tag3"
$ wq!
## datakit 재시작
###########--------Linux 환경---------##########
$ datakit --restart
###########--------Windows 환경-------##########
## 마우스 우클릭 → 작업 관리자 → 서비스 → datakit → 다시 시작
애플리케이션 분산 추적(APM) 연동 관련 단계¶
ddtrace 에이전트 다운로드 주소
- Python: https://github.com/DataDog/dd-trace-py
- Golang: https://github.com/DataDog/dd-trace-go
- NodeJS: https://github.com/DataDog/dd-trace-js
- PHP: https://github.com/DataDog/dd-trace-php
- Ruby: https://github.com/DataDog/dd-trace-rb
- C# (dotnet): https://github.com/DataDog/dd-trace-dotnet
- C++: https://github.com/DataDog/dd-opentracing-cpp
- Java: https://github.com/DataDog/dd-trace-java
ddtrace 관련 환경 변수(시작 매개변수) 설명
Ddd.env: 사용자 정의 환경 유형 (선택 사항)
Ddd.service.name: 사용자 정의 애플리케이션 이름 (필수 항목) 이 설정 후에도 데이터가 표시되지 않으면 name을 제거해 보세요.
Ddd.agent.port: 데이터 업로드 포트(기본 9529) (필수 항목)
Ddd.version: 애플리케이션 버전 (선택 사항)
Ddd.trace.sample.rate: 샘플링 비율 설정(기본값은 전체 샘플링) (선택 사항)
Ddd.service.mapping: 현재 애플리케이션이 호출하는 redis, mysql 등에 이 매개변수로 별칭을 추가하여 다른 애플리케이션이 호출하는 redis, mysql과 구분할 수 있습니다. (선택 사항)
Ddd.host: 데이터 전송 대상 IP, 기본값은 로컬호스트 localhost (선택 사항)
자세한 설정은 Datadog 공식 문서를 참조하세요.
Java(ddtrace) 연동:¶
- [ddtrace-agent]를 다운로드합니다. 0.80.0 버전을 권장합니다.
애플리케이션 환경과 동일한 디렉터리에 배치합니다.
(Datakit 1.6 버전부터 ddtrace-java-agent는 datakit에 기본 내장되어 있으며, 디렉터리는 /usr/local/datakit/data/입니다.)
2. 기존 애플리케이션 시작 스크립트에 ddtrace.jar 시작 매개변수를 추가합니다. 다음과 같은 필드를 추가합니다: -javaagent:/xxx/ddtrace.jar -Ddd.env=xxx -Ddd.service.name=xxx -Ddd.agent.port=xxx. xxx 부분은 모두 실제 값으로 채워야 합니다.
Tomcat 연동¶
catalina.sh에 ddtrace 시작 매개변수를 추가한 후, tomcat을 재시작합니다. 코드 블록의 xxx는 절대 경로로 변경해야 합니다.
$ cd /xxx/tomcat/bin
$ vim catalina.sh
$ CATALINA_OPTS="$CATALINA_OPTS -javaagent:/xxx/ddtrace.jar -Ddd.env=test -Ddd.service.name=demo001 -Ddd.agent.port=9529"; export CATALINA_OPTS
$ wq!
## tomcat 재시작
$ ./bin/startup.sh
guance에 로그인하여 특정 프로젝트 워크스페이스로 이동한 후, 애플리케이션 성능 모니터링(APM)을 클릭하면 서비스 이름이 mall-admin인 애플리케이션 데이터를 확인할 수 있습니다.
마이크로서비스 연동¶
시작 스크립트에 ddtrace 시작 매개변수를 직접 추가한 후 애플리케이션을 재시작합니다. 코드 블록의 xxx는 절대 경로로 변경해야 합니다.
## 원래 시작 스크립트:
$ nohup java -jar mall-admin.jar &
## ddtrace 시작 매개변수를 추가한 후의 시작 스크립트입니다. 다음 명령어를 실행하여 애플리케이션을 재시작합니다.
$ nohup java -javaagent:/xxx/dd-java-agent-0.72.0.jar -Ddd.service.name=mall-admin -Ddd.agent.port=9529 -jar mall-admin.jar &
guance에 로그인하여 특정 프로젝트 워크스페이스로 이동한 후, 애플리케이션 성능 모니터링(APM)을 클릭하면 서비스 이름이 mall-admin인 애플리케이션 데이터를 확인할 수 있습니다.
Docker 연동¶
Docker 환경에서 연동하는 방법은 여러 가지가 있으며, 예시에서는 두 가지 방법을 보여줍니다.
1. Dockerfile을 수정하고 다시 빌드합니다. 코드 블록의 xxx는 절대 경로로 변경해야 합니다.
$ vim Dockerfile
## Dockerfile에 ddtrace-agent 경로를 추가합니다. xxx는 절대 경로를 의미합니다.
$ ADD dd-java-agent-0.75.0.jar /xxx/
$ ENTRYPOINT ["java","-javaagent:/xxx/dd-java-agent-0.75.0.jar","-Ddd.service.name=mall-admin","-Ddd.version=v1","-Ddd.env=product","-Ddd.agent.port=9529","-Ddd.agent.host=172.16.0.198","-jar", “-Dspring.profiles.active=prod","/mall-admin-1.0-SNAPSHOT.jar"]
$ wq!
## build & run
$ docker build -t mall/mall-admin:v1 . [ “.” 은 반드시 추가해야 합니다.]
## docker run
$ docker run -p 8080:8080 --name mall-admin --link mysql:db --link redis:redis -v /etc/localtime:/etc/localtime -v /mydata/app/admin/logs:/var/logs -d mall/mall-admin:v1
- Dockerfile을 수정하지 않고 시작 매개변수로 기존 시작 명령어를 덮어씁니다(일부 시나리오에서는 적용되지 않을 수 있음).
## 원래 시작 명령어
$ docker run -p 8080:8080 --name mall-admin --link mysql:db --link redis:redis -v /etc/localtime:/etc/localtime -v /mydata/app/admin/logs:/var/logs -d mall/mall-admin:v1
## ddtrace를 포함한 시작 명령어입니다. dockerfile에서 jar 패키지의 시작 명령어를 확인해야 합니다.
$ docker run -p 8080:8080 --name mall-admin --link mysql:db --link redis:redis -v /etc/localtime:/etc/localtime -v /mydata/app/admin/logs:/var/logs -d mall/mall-admin:v1 java -javaagent:/wx/dd-java-agent-0.75.0.jar -Ddd.service.name=mall-admin -Ddd.version=v1 -Ddd.env=product -Ddd.agent.port=9529 -Ddd.agent.host=172.16.0.198 -jar -Dspring.profiles.active=prod /mall-admin-1.0-SNAPSHOT.jar
## 참고: java –javaagent를 추가한 후 시작 스크립트 뒤에 -jar your app name.jar를 추가해야 합니다.
guance에 로그인하여 특정 프로젝트 워크스페이스로 이동한 후, 애플리케이션 성능 모니터링(APM)을 클릭하면 서비스 이름이 해당 service.name인 애플리케이션 데이터를 확인할 수 있습니다.
C#(dotnet-ddtrace) 연동¶
IIS 호스팅 환경 연동:¶
참고: [dotnet-agent 다운로드 링크] 필요에 따라 x86, arm64 또는 기타 버전의 agent를 다운로드할 수 있습니다.
- 서버 환경 변수 추가
## 내 PC 마우스 우클릭 → 속성 → 고급 시스템 설정 → 환경 변수
## 새 시스템 변수 생성 → 다음 내용 입력
DD_TRACE_AGENT_URL=http://localhost:9529 (필수 항목)
DD_ENV= 예시 test (선택 사항)
DD_SERVICE= 예시 myappname (필수 항목)
DD_VERSION= 예시 1.0 (선택 사항)
DD_TRACE_SERVICE_MAPPING= 예시 mysql:main-mysql-db (선택 사항)
## TRACE_AGENT_URL은 데이터 업로드 IP와 포트로, http://localhost:9529로 입력해야 하며 변경하지 않는 것을 권장합니다.
## ENV는 시스템 환경으로, 필요에 따라 pro 또는 test 등으로 설정할 수 있습니다.
## SERVICE는 DF 플랫폼에 표시될 애플리케이션 이름을 설정하며, 구체적인 서비스 이름으로 설정할 수 있습니다.
## VERSION은 버전 번호로, 필요에 따라 설정할 수 있습니다.
## TRACE_SERVICE_MAPPING은 서비스 이름 재정의를 구성하여 DF 플랫폼에서 다른 비즈니스 시스템이 호출하는 구성 요소와 구분하여 표시하는 데 사용됩니다. [from-key]:[to-name] 형식의 매핑을 받습니다.
참고: [from-key] 내용은 표준 필드(예: mysql, redis, mongodb, oracle)여야 하며, 사용자 정의 변경을 하지 마십시오.
예시: TRACE_SERVICE_MAPPING=mysql:main-mysql-db
TRACE_SERVICE_MAPPING=mongodb:offsite-mongodb-service
- ddtrace-agent 설치
관리자 권한으로 dotnet-agent 설치 패키지를 실행하고, 다음을 클릭하여 설치가 완료될 때까지 진행합니다.
- PowerShell에서 다음 명령어를 실행하여 IIS를 재시작합니다.
DF 플랫폼에 로그인하여 애플리케이션 성능 모니터링(APM) 모듈에서 해당 servicename의 애플리케이션을 확인합니다.
Python(ddtrace) 연동¶
.NET Core(ddtrace) 연동¶
참고: [dotnet.core-agent 다운로드 링크] .NET Tracer는 현재 .NET Core 2.1, 3.1 및 .NET 5의 애플리케이션 추적을 지원합니다.
- 환경별로 다음 명령어를 실행하여 .net core-agent를 설치합니다.
Debian 또는 Ubuntu
sudo dpkg -i ./datadog-dotnet-apm_<TRACER_VERSION>_amd64.deb && /opt/datadog/createLogPath.sh
CentOS 또는 Fedora
sudo rpm -Uvh datadog-dotnet-apm<TRACER_VERSION>-1.x86_64.rpm && /opt/datadog/createLogPath.sh
Alpine 또는 기타 musl 기반 배포판
sudo tar -xzf -C /opt/datadog datadog-dotnet-apm<TRACER_VERSION>-musl.tar.gz && sh /opt/datadog/createLogPath.sh
기타 배포판
sudo tar -xzf -C /opt/datadog datadog-dotnet-apm<TRACER_VERSION>-tar.gz && /opt/datadog/createLogPath.sh
- 애플리케이션 환경 변수 추가
애플리케이션에 설정된 환경 변수에 다음 구성을 추가합니다. 이는 참고 사항이며, 실제 설정에서는 service 이름을 변경해야 합니다.
export CORECLR_ENABLE_PROFILING=1
export CORECLR_PROFILER_PATH=/opt/datadog/Datadog.Trace.ClrProfiler.Native.so
export DD_INTEGRATIONS=/opt/datadog/integrations.json
export DD_DOTNET_TRACER_HOME=/opt/datadog
export DD_TRACE_AGENT_URL=http://localhost:9529
export DD_SERVICE=service_test
export CORECLR_PROFILER={846F5F1C-F9AE-4B07-969E-05C26BC060D8}
- 애플리케이션 재시작
Q&A¶
agent와 jar 패키지 위치 관계¶
ddtrace-agent의 시작 매개변수는 반드시 Java 애플리케이션 시작 -jar 앞에 위치해야 합니다. 최종 형식은 java -javaagent -jar입니다.
## 원래 시작 스크립트:
$ java -jar mall-admin.jar
## ddtrace 시작 매개변수를 추가한 후의 시작 스크립트입니다. 다음 명령어를 실행하여 애플리케이션을 재시작합니다.
$ java -javaagent:/xxx/dd-java-agent-0.72.0.jar -Ddd.service.name=mall-admin -Ddd.agent.port=9529 -jar mall-admin.jar
tomcat-catalina.sh 매개변수 설정¶
catalina.sh에 ddtrace 시작 매개변수를 추가한 후, tomcat을 재시작합니다. 코드 블록의 xxx는 절대 경로로 변경해야 합니다.
CATALINA_OPTS 관련 설정은 반드시 catalina.sh 내의 애플리케이션 시작 스크립트가 읽을 수 있도록 해야 합니다. 그렇지 않으면 애플리케이션이 정상적으로 시작되어도 ddtrace-agent가 시작되지 않습니다.
$ cd /xxx/tomcat/bin
$ vim catalina.sh
$ CATALINA_OPTS="$CATALINA_OPTS -javaagent:/xxx/ddtrace.jar -Ddd.env=test -Ddd.service.name=demo001 -Ddd.agent.port=9529"; export CATALINA_OPTS
$ wq!
## tomcat 재시작
$ ./bin/startup.sh
guance에 로그인하여 특정 프로젝트 워크스페이스로 이동한 후, 애플리케이션 성능 모니터링(APM)을 클릭하면 서비스 이름이 mall-admin인 애플리케이션 데이터를 확인할 수 있습니다.











