当前位置: 首页 > 知识库问答 >
问题:

将自定义行李添加到当前跨度,并通过日志MDC访问

邢承弼
2023-03-14

我试图添加额外的行李到HTTP服务器上的现有跨度,我想添加一个路径变量到跨度,从日志MDC访问,并通过超文本传输协议或kafka在电线上传播到下一个服务器。

我的设置:春云侦探霍克斯顿。SR5和Spring启动2.2.5

我尝试添加以下设置和配置:

spring:
  sleuth:
    propagation-keys: context-id, context-type
    log:
      slf4j:
        whitelisted-mdc-keys: context-id, context-type

添加了http拦截器:

public class HttpContextInterceptor implements HandlerInterceptor {

    
    private final Tracer tracer;
    private final HttpContextSupplier httpContextSupplier;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (httpContextSupplier != null) {
            addContext(request, handler);
        }
        return true;
    }

    private void addContext(HttpServletRequest request, Object handler) {
        final Context context = httpContextSupplier.getContext(request);
        if (!StringUtils.isEmpty(context.getContextId())) {
            ExtraFieldPropagation.set(tracer.currentSpan().context(), TracingHeadersConsts.HEADER_CONTEXT_ID, context.getContextId());
        }
        if (!StringUtils.isEmpty(context.getContextType())) {
            ExtraFieldPropagation.set(tracer.currentSpan().context(), TracingHeadersConsts.HEADER_CONTEXT_TYPE, context.getContextType());
        }
    }
}

和http筛选器以影响当前范围(根据spring文档)

public class TracingFilter extends OncePerRequestFilter {

    private final Tracer tracer;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try (Tracer.SpanInScope ws = tracer.withSpanInScope(tracer.currentSpan())){
            filterChain.doFilter(request, response);
        }
    }
}

问题是日志不包含我的自定义上下文id,上下文类型,虽然是在span上下文中看到它。

我错过了什么?

共有2个答案

苏高旻
2023-03-14

官方的Sleuth 2.0中也描述了在当前span中刷新MDC的方法-

@Configuration
class BusinessProcessBaggageConfiguration {
  BaggageField BUSINESS_PROCESS = BaggageField.create("bp");

  /** {@link BaggageField#updateValue(TraceContext, String)} now flushes to MDC */
  @Bean
  CorrelationScopeCustomizer flushBusinessProcessToMDCOnUpdate() {
    return b -> b.add(
        SingleCorrelationField.newBuilder(BUSINESS_PROCESS).flushOnUpdate().build()
    );
  }
}
郝峰
2023-03-14

类似的问题春云侦探添加标签和答案https://stackoverflow.com/a/66554834

对于某些上下文:这来自Spring文档。

为了将行李值自动设置为Slf4j的MDC,您必须使用允许的本地或远程密钥列表设置spring.sleuth.baggage.correlation字段属性。例如spring.sleuth.baggage.correlation-field=国家代码将把国家代码行李的值设置为MDC。

请注意,额外的字段将从下一个下游跟踪上下文开始传播并添加到MDC。若要在当前跟踪上下文中立即向MDC添加额外字段,请将该字段配置为在更新时刷新。

// configuration
@Bean
BaggageField countryCodeField() {
    return BaggageField.create("country-code");
}

@Bean
ScopeDecorator mdcScopeDecorator() {
    return MDCScopeDecorator.newBuilder()
            .clear()
            .add(SingleCorrelationField.newBuilder(countryCodeField())
                    .flushOnUpdate()
                    .build())
            .build();
}

// service
@Autowired
BaggageField countryCodeField;

countryCodeField.updateValue("new-value");
 类似资料:
  • 我在我的Spring启动应用程序中使用了开放遥测java自动检测。有没有办法让应用程序日志成为创建的跨度的一部分? 我的自动配置设置如下:

  • 当我尝试console appender并尝试打印该字段时,就像下面的示例一样,它起作用了。 你能告诉我我在udp appender上做错了什么吗?谢谢你的忠告。

  • 我们有一个带有REST接口的Spring Boot应用程序和一个web客户端。我们使用spring-security和OAuth2.0 JWT令牌进行身份验证。我们正在使用slf4j和sleuth进行日志记录。我们希望在日志中记录当前登录的用户id。技术上,我们希望将用户id添加到服务器应用程序的映射诊断上下文(MDC)中。 null 可以手动实现这样的MDC,请参阅https://www.bae

  • 问题内容: 我已经看过了,基本上我已经发现Calendar对象可以使用以下类似方法将1个月添加到指定的日期中: 尽管我不喜欢它在日期为30或31时的行为。如果我将1个月添加到01/31/2012,输出将变为02/29/2012。当我再增加1个月时,它将变为03/29/2012。 无论如何,我是否可以强制2012年2月29日自动变为2012年3月1日? 基本上这就是我想发生的事情: 默认日期:01/

  • 问题内容: 我已经构建了自己的自定义react-bootstrap Popover组件: 该组件的呈现方式如下: 现在,我想向组件中添加自定义道具,例如:我的文字,并使用新道具在弹出框中设置一些内容,例如- 但随后我在浏览器中收到此警告: 警告:标签上的未知道具。从元素中删除这些道具。 现在,我想我可以删除零件并逐个插入所有原始道具,而无需自定义道具,但是这样我就失去了“淡入淡出”效果,这也是处理

  • 问题内容: 我是ELK堆栈的新手。我有一个文件拍服务,将日志发送到logstash,并在logstash中使用过滤器,将数据推送到索引。 我正在使用筛选器来解析数据。 我的问题是,我希望将字段名称及其值存储在elasticsearch索引中。我的日志的不同版本如下: 我想要的弹性索引字段如下: client_ip => type必须与kibana用于IP映射的内容兼容。 时间戳=>日期时间格式。=