Micrometer Tracing
2024. 4. 30. 11:05ㆍWeb/Spring
기본 사용법
// Span을 생성한다. 만약 현재 쓰레드에 스팬이 있다면, 현재 새로 생성한 newSpan의 부모가 된다.
Span newSpan = this.tracer.nextSpan().name("calculateTax");
// Span을 시작하고 Scope에 넣는다.(Scope에 넣는다는 의미는 Thread local에 스팬을 넣는다는 뜻)
try (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {
// 더 나은 디버깅을 위해서 Span에 key/value 쌍을 넣을 수 있다.
newSpan.tag("taxValue", taxValue);
// Span에 이벤트 로깅을 할 수 있다.(이벤트에는 타임스탬프가 찍힌다.)
newSpan.event("taxCalculated");
}
finally {
// Span을 닫는 것을 항상 기억해야 한다. Span을 닫아야 분산 트레이싱 시스템에 Span을 collecting된다.
newSpan.end();
}
새로운 스레드에서 트레이싱을 이어가고 싶을때
Span spanFromThreadX = this.tracer.nextSpan().name("calculateTax");
try (Tracer.SpanInScope ws = this.tracer.withSpan(spanFromThreadX.start())) {
executorService.submit(() -> {
// Pass the span from thread X
Span continuedSpan = spanFromThreadX;
// ...
// You can tag a span
continuedSpan.tag("taxValue", taxValue);
// ...
// You can log an event on a span
continuedSpan.event("taxCalculated");
}).get();
}
finally {
spanFromThreadX.end();
}
부모 Span을 알고 있을 때 명시적으로 자식 Span을 생성하는 방법
// let's assume that we're in a thread Y and we've received
// the `initialSpan` from thread X. `initialSpan` will be the parent
// of the `newSpan`
Span newSpan = this.tracer.nextSpan(initialSpan).name("calculateCommission");
// ...
// You can tag a span
newSpan.tag("commissionValue", commissionValue);
// ...
// You can log an event on a span
newSpan.event("commissionCalculated");
// Once done remember to end the span. This will allow collecting
// the span to send it to e.g. Zipkin. The tags and events set on the
// newSpan will not be present on the parent
newSpan.end();
Micrometer tracing Brave 세팅방법
# build.gradle.kts
// tracing
implementation("io.micrometer:micrometer-tracing-bridge-brave")
implementation("io.zipkin.reporter2:zipkin-reporter-brave")
// test tracing
testImplementation("io.micrometer:micrometer-tracing-test")
testImplementation("io.micrometer:micrometer-tracing-integration-test")
# application.yml
management:
tracing:
sampling:
probability: 1.0
propagation:
type: b3_multi
enabled: true
zipkin:
tracing:
endpoint: ~
Skip pattern
@Configuration
class TraceSkipPatternConfig {
@Bean
fun serverContextPredicate(): ObservationPredicate {
val skipRegularExpressions = "/health-check|/actuator/.*"
.split("|")
.map { it.toRegex() }
.toSet()
return ObservationPredicate { _, context ->
if (context !is ServerRequestObservationContext) {
return@ObservationPredicate true
}
val servletRequest = context.carrier
val path = servletRequest.requestURI
return@ObservationPredicate skipRegularExpressions.none { p -> path.matches(p) }
}
}
@Bean
fun noSpringSecurityObservations(): ObservationPredicate {
return ObservationPredicate { name, _ ->
!name.startsWith("spring.security.")
}
}
}
'Web > Spring' 카테고리의 다른 글
Springboot + koltin coroutine 사용법 (0) | 2024.05.16 |
---|---|
Spring kafka + micrometer tracing (0) | 2024.05.14 |
Spring kafka 설명 (0) | 2023.11.05 |
Spring Kafka commit 정책 (0) | 2023.11.05 |
대용량 트래픽관련 유튜브 영상들 (0) | 2023.11.02 |