JAVA¶
Guance를 사용해 JAVA 애플리케이션에 연결합니다:
- 애플리케이션에서 사용자 정의 메트릭 데이터를 수집합니다.
- 애플리케이션에서 트레이싱 데이터를 수집합니다.
- 애플리케이션의 모든 로그를 관리합니다.
구성¶
메트릭 수집¶
jvm 문서를 참고하세요.
트레이싱 수집¶
애플리케이션에서 해당 수집기를 활성화한 다음, JAVA agent 도구를 사용해 trace 정보를 가져와 Guance로 전송합니다.
로그 연동¶
opentelemetry-java(이하 "Agent")는 javaagent 방식으로 애플리케이션에 주입되며, 애플리케이션에서 trace 정보가 생성된 후 MDC를 설정하면 traceId와 spanId를 매개변수로 log에 전달할 수 있습니다. 이렇게 하면 log가 출력될 때 traceId와 spanId가 함께 포함됩니다.
MDC 정보
매핑 진단 컨텍스트(MDC)는 서로 다른 소스에서 들어오는 교차 로그 출력을 구분하는 도구입니다. — log4j MDC 문서
이는 스레드 로컬 컨텍스트 정보를 포함하며, 로그 라이브러리가 캡처하는 각 로그 이벤트에 복사됩니다.
OTEL JAVA Agent는 현재 span에 대한 몇 가지 정보를 각 로그 레코드 이벤트의 MDC 복사본에 주입합니다.
- trace_id 현재 trace id(
Span.current().getSpanContext().getTraceId()와 동일); - span_id 현재 span id(
Span.current().getSpanContext().getSpanId()와 동일); - trace_flags 현재 trace flag. W3C trace flag 형식(
Span.current().getSpanContext().getTraceFlags().asHex()와 동일)으로 포맷됩니다.
이 세 정보는 패턴/포맷에서 지정하면 로그 라이브러리가 생성한 로그 문장에 포함할 수 있습니다.
팁: logback을 사용하는 SpringBoot 구성에서는 다음 내용만 덮어써서 MDC를 로그 라인 logging.pattern.level에 추가할 수 있습니다.
logging.pattern.level = trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p
이렇게 하면 애플리케이션 로그를 파싱하는 어떤 서비스나 도구도 trace/span을 로그 문장과 연결할 수 있습니다.
로그 설정¶
APM 도구마다 로그 pattern 설정이 다르며, logback.xml을 예로 들면 다음과 같습니다:
OpenTelemetry MDC 매개변수:
- trace_id
- span_id
<property name="log.pattern" value="%d{HH:mm:ss} [%thread] %-5level %logger{10} [traceId=%X{trace_id} spanId=%X{span_id} userId=%X{user-id}] %msg%n" />
<!-- %m 출력 정보, %p 로그 레벨, %t 스레드 이름, %d 날짜, %c 클래스의 전체 이름,,,, -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
DDTrace MDC 매개변수:
- dd.service
- dd.trace_id
- dd.span_id
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - [%method,%line] %X{dd.service} %X{dd.trace_id} %X{dd.span_id} - %msg%n" />
<!-- %m 출력 정보, %p 로그 레벨, %t 스레드 이름, %d 날짜, %c 클래스의 전체 이름,,,, -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>-