访问@RequestMapping映射的参数进行Tracing

Accessing Parameters mapped by @RequestMapping for Tracing

我目前正在使用 Spring Cloud Sleuth 开发监控应用程序。目前,我尝试收集尽可能多的关于我的请求的信息。

为了尽可能保持方法的可扩展性,我使用 GenericFilterBeansHandlerInterceptorAdapter 来访问发送到 REST-API 的请求中的信息。

我正在努力获取 REST 调用的参数,其中参数是从 URL 映射而来的,如以下代码片段所示:

  @RequestMapping(
            value = {"/{service}/{route_id}/book", "/accounting-core-service/{service}/{route_id}/book"},
            method = RequestMethod.GET)
    @ResponseBody
    public ModelAndView book(@PathVariable(value="service") String serviceName,
                             @PathVariable(value = "route_id") int routeId,
                             HttpServletResponse response) {
    /*Do something*/
}

问题不在于,这样写是否是好的做法。问题是是否有类似于 Filter 或 Interceptor(或正确使用它们)的方法来访问这些参数。

一个要求是,它可以通过添加很少的代码行轻松地应用于应用程序。手动注释每个方法调用或手动插入代码以从方法内将参数写入跟踪对我来说是不可行的。

如果您需要更多信息,请随时询问。我将为您提供帮助我解决问题所需的所有信息。

您可以创建一个拦截所有请求的过滤器。

对于每个请求,您还可以检索以下信息:

  • 查询参数
  • body 请求
  • url
  • header 参数

您可以根据需要保存所有这些数据。 这是最好的方法。


如果您需要将所有 url 像 /{service}/{route_id}/book 分组到 "family" 个 url 中,您可以拆分 url 并检查如果它是系列的一部分,但是当在您的代码中添加新系列时,您需要更新过滤器(或在外部文件或数据库中配置一些东西)。

虽然没有正式支持(因为它没有写在参考文档中),SpringMVC 将该信息作为请求属性保存。

您可以创建自己的 HandlerInterceptor,在 Sleuth 之后立即订购,并从这样的请求中获取该信息:

// "/{service}/{route_id}/book"
String matchingPattern = (String) request
                    .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
// "service" => "fooService", "route_id" => "42"
Map<String, String> templateVariables = (Map<String, String>) request
                    .getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

请注意,此时模板变量已经解码,这可能正是您想要的。