Micrometer Tracing

2024. 4. 30. 11:05Web/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.")
        }
    }
}

 

Micrometer tracing sample code git

'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