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

如何将请求头保存到MDC

饶曦之
2023-03-14

我有一个spring cloud sleuth(Hoxton.SR3)的spring boot(2.2.5.RELEASE)项目。我想向控制器发送一个包含一个标头的请求,并将此标头设置为:

  1. 在控制器的跨度包中填充(即当前pan.context().额外()
  2. 保存到MDC

我有一个自定义的跟踪配置

@Bean
public Tracing tracing(@Value("${spring.application.name}") String serviceName, TracingProperties tracingProperties,
                       CurrentTraceContext currentTraceContext) {

    String profile = String.join(",", env.getActiveProfiles());

    log.info("Enable tracing for service {}", serviceName + ":" + profile);
    return Tracing.newBuilder()
            .localServiceName(serviceName + ":" + profile)
            .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
                    .addScopeDecorator(MDCScopeDecorator.create()) // puts trace IDs into logs
                    .build()
            )
            .sampler(Sampler.NEVER_SAMPLE)
            .propagationFactory(
                    ExtraFieldPropagation.newFactoryBuilder(B3Propagation.FACTORY)
                            .addPrefixedFields(TracingConstant.BAGGAGE_HEADER_PREFIX, tracingProperties.getAllBaggageKeys())
                            .build())
            .build();
}

跟踪属性时。getAllBaggageKeys返回从我的配置文件中读取的行李钥匙列表。

我还在应用程序中定义了。yml:

spring:
  sleuth:
    log:
      slf4j:
        whitelisted-mdc-keys:
          - behalf-flow-id
          - behalf-requested-time
          - x-behalf-ach-file-name
          - behalf-principal-id
          - x-http-request-id
          - behalf-principal
          - requestid
    baggage-keys:
      - behalf-flow-id
      - behalf-requested-time
      - x-behalf-ach-file-name
      - behalf-principal-id
      - x-http-request-id
      - behalf-principal
      - requestid

当我(通过邮递员)用带有“行李代理请求时间”和“值”123456”的标题呼叫服务控制器时,我进入了currentSpan。上下文()。extra()行李代理请求时间的值(即123456

问题

  1. 我需要在标题前面加上行李-,对吗?难道框架不应该自己处理它吗?或者它只是在我用Spring本身发送请求时执行(即RestTemplate

共有3个答案

郑嘉年
2023-03-14

就这么做吧

    public String someMethod(HttpServletRequest request, HttpServletResponse httprespons)
{
 MDC.put(request.getHeader("header_name"););
}

通过HttpServletRequest, HttpServlet响应作为参数。

凌景辉
2023-03-14

您可以编写customeFilter来拦截每个请求,并将请求中的数据放入MDC。


@Component
public class CustomFilter implements Filter {

  @Override
  public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {
      final String correlationId = getCorrelationIdFromHeader(req);
      MDC.put(HttpConstants.CORRELATION_ID_HEADER_NAME, correlationId);
      chain.doFilter(req, res);
  }
}
郗鹏
2023-03-14

你有自己的自定义跟踪机制,这就是为什么你需要处理所有的行李-前缀等,如果你查看2.2.2。发布了Sleuth,你会看到我们自己也在这些字段前加前缀https://github.com/spring-cloud/spring-cloud-sleuth/blob/v2.2.2.RELEASE/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java#L168-L174然后,它们也被填充到MDC(https://github.com/spring-cloud/spring-cloud-sleuth/blob/v2.2.2.RELEASE/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jScopeDecorator.java)但是没有行李-前缀。在最新版本(2.2.3.RELEAE)中,代码进行了重构,但在概念上是相似的。

 类似资料:
  • 如何在请求后使用库(在python中) 将所有cookie保存在文件中,然后从文件中还原cookie。

  • 问题内容: 我正在尝试访问网站,但无法将收集到的“ Cookie”添加到传出的POST请求标头中。我已经能够验证它们是否存在于CookieManager中。 HtmlUnit的任何替代方法也将不胜感激。 问题答案: 我发现可以使用WebClient中的setadditionalHeader()添加标题。

  • 问题内容: 我将这个拦截器添加到我的OkHttp客户端中: 如何在拦截器中添加标题以进行请求? 我尝试了这个,但是我犯错了,创建新请求时我丢失了请求: 请注意,我知道我可以在创建请求时添加标头,如下所示: 但这不符合我的需求。我在拦截器中需要它。 问题答案: 最后,我以这种方式添加了标题:

  • 问题内容: 这是我的第一篇文章。 我刚刚开始学习Go和Angular,并且尝试将angular应用程序连接到go api。我已经写了这两本书,并且一直坚持找出问题的根源。我以为这是一个CORS问题,但是如果我在Angular http请求中不包含代码的标题行,它就可以正常工作。在这一点上,我只是想添加标题。授权代码尚未实现。 这两个应用程序都在本地运行,端口5000上的Go应用程序和4200端口上

  • 我创建了一个简单的应用程序,裁剪图像。现在我想保存这个图像到消防基地。 如何将此图像保存到Firebase。我尝试了很多教程,但都没有成功。请用简单的代码验证。