【问题标题】:Add logs to spans using OTEL instrumentation with Jaegar backend使用带有 Jaegar 后端的 OTEL 仪器将日志添加到跨度
【发布时间】:2021-08-11 09:55:17
【问题描述】:

目前,开放遥测 (OTEL) 跨度没有像 Jaegar 等实现中那样添加日志的机制。

那么有没有一种解决方法可以将应用程序日志添加到 span 中?

【问题讨论】:

    标签: spring-boot logging open-telemetry distributed-tracing


    【解决方案1】:

    正如我们看到的here,jaegar 后端解释 OTEL 异常的方式是将异常的内容作为日志放入关联的 span 中。

    现在,异常是事件的一种形式,似乎 jaegar 后端将 OTEL 事件解释为日志。所以我们可以通过以下方式复制这种行为:

    1. 创建自定义日志附加程序
    2. 在内部,创建一个 OTEL 事件并在其中填充日志记录详细信息。
    3. 将事件添加到当前范围。

    这个 span 将由 jaegar 后端以将所有事件作为单个日志项放入该 span 中的方式进行解释。

    自定义日志附加器

    以下是我基于 spring-cloud 项目中的SpanLogsAppender.java 编写的基本 LogAppender。

    import ch.qos.logback.classic.Level;
    import ch.qos.logback.classic.spi.ILoggingEvent;
    import ch.qos.logback.classic.spi.IThrowableProxy;
    import ch.qos.logback.classic.spi.ThrowableProxy;
    import ch.qos.logback.core.AppenderBase;
    import io.opentelemetry.api.common.Attributes;
    import io.opentelemetry.api.common.AttributesBuilder;
    import io.opentelemetry.api.trace.Span;
    import io.opentelemetry.api.trace.StatusCode;
    
    
    public class SpanLogsAppender extends AppenderBase<ILoggingEvent> {
    
        /**
         * This is called only for configured levels.
         * It will not be executed for DEBUG level if root logger is INFO.
         */
        @Override
        protected void append(ILoggingEvent event) {
            final Span currentSpan = Span.current();
            AttributesBuilder builder = Attributes.builder();
    
            if (currentSpan != null) {
                builder.put("logger", event.getLoggerName())
                        .put("level", event.getLevel().toString())
                        .put("message", event.getFormattedMessage());
    
                currentSpan.addEvent("LogEvent", builder.build());
    
                if (Level.ERROR.equals(event.getLevel())) {
                    currentSpan.setStatus(StatusCode.ERROR);
                }
    
                IThrowableProxy throwableProxy = event.getThrowableProxy();
                if (throwableProxy instanceof ThrowableProxy) {
                    Throwable throwable = ((ThrowableProxy)throwableProxy).getThrowable();
                    if (throwable != null) {
                        currentSpan.recordException(throwable);
                    }
                }
            }
        }
    }
    

    我的本地版本:

    • 弹簧靴:2.5.1
    • io.opentelemetry.opentelemetry-api : 1.2.0
    • jaegar 后端:1.18(Windows)

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 2021-09-02
      • 2017-02-28
      • 1970-01-01
      • 2021-09-25
      • 2021-01-02
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多