【发布时间】:2018-11-08 08:08:18
【问题描述】:
我有一个 @ControllerAdvice,它从 spring-hateoas 返回 VndError。 VndError 指定了一个 logRef 字段,我应该在其中放置来自 Spring Cloud Sleuth 的 Trace ID。有没有官方的方法可以做到这一点,还是我应该直接在我的 @ControllerAdvice @ExceptionHandler 方法中从 MDC 中检索它?
示例控制器建议:
@ControllerAdvice
class ExceptionHandler {
@Autowired
private lateinit var tracer: Tracer
@ExceptionHandler(LocalException::class)
fun handleLocalException(e: LocalException): ResponseEntity<VndErrors.VndError> {
val traceId = MDC.get("X-B3-TraceId") // <-- Is this the correct way of getting trace id from Sleuth?
val traceId2 = tracer.currentSpan().context().traceIdString() // <-- Or something like this?
val error = VndErrors.VndError(traceId, e.message)
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error)
}
}
GitHub 示例: https://github.com/hughwphamill/spring-traceid-logref
【问题讨论】:
-
小样本是否有机会复制问题?
-
嗨@MarcinGrzejszczak 我在上面添加了一些示例代码和项目,谢谢!
-
你读过sleuth的文档吗?我们具体描述了如何检索跟踪上下文。您应该通过跟踪器使用第二种方式。
-
谢谢,如果您想将其放入答案中,我会接受答案。我查看了cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/… Ctrl+F for currentSpan().context().traceIdString() 虽然没有显示任何命中,但如何提取跟踪 ID 并不是很明显。甚至 traceIdString() 也只显示了两个命中,并且它在 Spring Integration 部分的一些示例代码中。
-
当然可以,再次感谢。
标签: spring spring-boot spring-hateoas spring-cloud-sleuth