log4j 无法通过MDC获取opentelemetry的trace_id,即使MDC正在通过logging.pattern.level工作

sf6xfgos  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(277)

我已经在应用程序中集成了OpenTelemarket,遵循此https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/logger-mdc-instrumentation.md之后,我能够通过日志记录将trace_id和其他信息注入日志。pattern.level = trace_id= % mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p
但是当我试图通过MDC.get(“trace_id”)在代码中获取这些trace_id时,我得到了null。

这是我的配置。

  1. plugins {
  2. id 'org.springframework.boot' version '2.7.0'
  3. id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  4. id 'java'
  5. id 'jacoco'
  6. id "org.sonarqube" version "3.4.0.2513"
  7. id 'de.undercouch.download' version '4.1.1'
  8. }
  9. version = '0.0.1-SNAPSHOT'
  10. sourceCompatibility = '17'
  11. configurations {
  12. compileOnly {
  13. extendsFrom annotationProcessor
  14. }
  15. }
  16. ext {
  17. fasterxmlJackson = '2.9.7';
  18. }
  19. dependencies {
  20. implementation 'org.springframework.boot:spring-boot-starter-actuator'
  21. implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  22. implementation 'org.springframework.boot:spring-boot-starter-jdbc'
  23. implementation 'org.springframework.boot:spring-boot-starter-security'
  24. implementation 'org.springframework.boot:spring-boot-starter-web'
  25. implementation('org.springframework.boot:spring-boot-starter-data-rest')
  26. compileOnly 'org.projectlombok:lombok'
  27. implementation 'org.postgresql:postgresql:42.4.0'
  28. implementation 'com.vladmihalcea:hibernate-types-55:2.16.2'
  29. annotationProcessor 'org.projectlombok:lombok'
  30. implementation('com.querydsl:querydsl-jpa:4.1.3')
  31. implementation('com.amazonaws:aws-java-sdk-s3:1.11.704')
  32. implementation('com.mashape.unirest:unirest-java:1.4.9')
  33. implementation('org.springframework.boot:spring-boot-starter-cache:2.7.1')
  34. implementation('org.springframework.boot:spring-boot-starter-data-redis:2.7.1')
  35. implementation("com.fasterxml.jackson.datatype:jackson-datatype-json-org:${fasterxmlJackson}",
  36. "com.fasterxml.jackson.datatype:jackson-datatype-joda:${fasterxmlJackson}",
  37. "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${fasterxmlJackson}")
  38. implementation('org.apache.commons:commons-lang3:3.4')
  39. implementation('org.apache.commons:commons-collections4:4.3')
  40. implementation 'org.springdoc:springdoc-openapi-ui:1.6.14'
  41. implementation 'org.flywaydb:flyway-core'
  42. implementation(platform("io.opentelemetry:opentelemetry-bom:1.18.0"))
  43. implementation("io.opentelemetry:opentelemetry-api")
  44. testImplementation 'org.springframework.boot:spring-boot-starter-test'
  45. testImplementation 'org.mockito:mockito-inline:4.6.1'
  46. testImplementation 'org.mockito:mockito-junit-jupiter:4.6.1'
  47. }
  48. configurations {
  49. compile.all*.exclude group: "org.apache.logging.log4j", module: "log4j-slf4j-impl"
  50. compile.all*.exclude group: "com.vaadin.external.google", module: "android-json"
  51. compile.all*.exclude group: "commons-logging", module: "commons-logging"
  52. all {
  53. exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
  54. }
  55. }
  56. tasks.named('test') {
  57. useJUnitPlatform()
  58. }
  59. jacocoTestReport {
  60. reports {
  61. xml.enabled true
  62. html.enabled true
  63. }
  64. }
  65. bootJar {
  66. dependsOn("downloadAgent")
  67. }
  68. task downloadAgent(type: Download) {
  69. src "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.17.0/opentelemetry-javaagent.jar"
  70. dest project.buildDir.toString() + "/otel/opentelemetry-javaagent.jar"
  71. overwrite true
  72. }

字符串
我需要在代码中获取trace_id,以便我可以在非日志用例中使用。

5gfr0r5j

5gfr0r5j1#

trace_id在logger中可用而在MDC中不可用的原因是,MDC Logger auto-instrumentation不会将值添加到MDC中,因为在这种情况下只检测日志记录类(如果您想调试它,请在ch.qos.logback.classic.pattern.MDCConverter#convert中设置断点)。
为了在MDC中获取trace_id,可以添加io.micrometer:micrometer-tracing-bridge-otel依赖项,就像在https://spring.io/blog/2022/10/12/observability-with-spring-boot-3https://micrometer.io/docs/tracing中描述的那样。
但是要小心!虽然跟踪id在日志检测中的键是trace_id,但在MDC中的键是traceId

相关问题