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

问题描述 投票:0回答:1

我已将 OpenTelemetry 集成到我的应用程序中,按照此操作后 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。

这是我的配置。

plugins {
        id 'org.springframework.boot' version '2.7.0'
        id 'io.spring.dependency-management' version '1.0.11.RELEASE'
        id 'java'
        id 'jacoco'
        id "org.sonarqube" version "3.4.0.2513"
        id 'de.undercouch.download' version '4.1.1'
    }
    
    
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '17'
    
    configurations {
        compileOnly {
        extendsFrom annotationProcessor
        }
    }
    
    
    
    
    ext {
        fasterxmlJackson = '2.9.7';
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-actuator'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-jdbc'
        implementation 'org.springframework.boot:spring-boot-starter-security'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        implementation('org.springframework.boot:spring-boot-starter-data-rest')
        compileOnly 'org.projectlombok:lombok'
        implementation 'org.postgresql:postgresql:42.4.0'
        implementation 'com.vladmihalcea:hibernate-types-55:2.16.2'
        annotationProcessor 'org.projectlombok:lombok'
        implementation('com.querydsl:querydsl-jpa:4.1.3')
        implementation('com.amazonaws:aws-java-sdk-s3:1.11.704')
        implementation('com.mashape.unirest:unirest-java:1.4.9')
        implementation('org.springframework.boot:spring-boot-starter-cache:2.7.1')
        implementation('org.springframework.boot:spring-boot-starter-data-redis:2.7.1')
    
        implementation("com.fasterxml.jackson.datatype:jackson-datatype-json-org:${fasterxmlJackson}",
                "com.fasterxml.jackson.datatype:jackson-datatype-joda:${fasterxmlJackson}",
                "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${fasterxmlJackson}")
        implementation('org.apache.commons:commons-lang3:3.4')
        implementation('org.apache.commons:commons-collections4:4.3')
        implementation 'org.springdoc:springdoc-openapi-ui:1.6.14'
        implementation 'org.flywaydb:flyway-core'
        implementation(platform("io.opentelemetry:opentelemetry-bom:1.18.0"))
        implementation("io.opentelemetry:opentelemetry-api")
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testImplementation 'org.mockito:mockito-inline:4.6.1'
        testImplementation 'org.mockito:mockito-junit-jupiter:4.6.1'
    
    }
    configurations {
        compile.all*.exclude group: "org.apache.logging.log4j", module: "log4j-slf4j-impl"
        compile.all*.exclude group: "com.vaadin.external.google", module: "android-json"
        compile.all*.exclude group: "commons-logging", module: "commons-logging"
        all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
       }
    }
    
    tasks.named('test') {
        useJUnitPlatform()
    }
    
    jacocoTestReport {
        reports {
        xml.enabled true
        html.enabled true
        }
    }
    bootJar {
        dependsOn("downloadAgent")
    }
    task downloadAgent(type: Download) {
        src "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.17.0/opentelemetry-javaagent.jar"
        dest project.buildDir.toString() + "/otel/opentelemetry-javaagent.jar"
        overwrite true
    }

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

spring-boot log4j open-telemetry mdc
1个回答
0
投票

trace_id 在记录器中可用,但在 MDC 中不可用的原因是,MDC Logger 自动检测 不会将值添加到 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

© www.soinside.com 2019 - 2024. All rights reserved.