Spring Boot 千分尺- WebMvcTagsContributor未添加自定义标记

iih3973s  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(190)

我正在尝试添加自定义标签-路径变量和它们的值-到每一个公制千分尺生成。我正在使用java16的spring-boot。
通过我的研究,我发现创建一个类型为WebMvcTagsContributor的bean就可以做到这一点。
这是密码

public class CustomWebMvcTagsContributor implements WebMvcTagsContributor {

  private static int PRINT_ERROR_COUNTER = 0;

  @Override
  public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response,
      Object handler,
      Throwable exception) {
    return Tags.of(getAllTags(request));
  }

  private static List<Tag> getAllTags(HttpServletRequest request) {

    Object attributesMapObject = request.getAttribute(View.PATH_VARIABLES);
    if (isNull(attributesMapObject)) {
      attributesMapObject = request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

      if (isNull(attributesMapObject)) {
        attributesMapObject = extractPathVariablesFromURI(request);
      }
    }

    if (nonNull(attributesMapObject)) {
      return getPathVariablesTags(attributesMapObject);
    }

    return List.of();
  }

  private static Object extractPathVariablesFromURI(HttpServletRequest request) {
    Long currentUserId = SecurityUtils.getCurrentUserId().orElse(null);
    try {
      URI uri = new URI(request.getRequestURI());
      String path = uri.getPath(); //get the path
      UriTemplate uriTemplate = new UriTemplate((String) request.getAttribute(
          HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)); //create template
      return uriTemplate.match(path); //extract values form template
    } catch (Exception e) {
        log.warn("[Error on 3rd attempt]", e);
    }

    return null;
  }

  private static List<Tag> getPathVariablesTags(Object attributesMapObject) {
    try {
      Long currentUserId = SecurityUtils.getCurrentUserId().orElse(null);

      if (nonNull(attributesMapObject)) {
        var attributesMap = (Map<String, Object>) attributesMapObject;
        List<Tag> tags = attributesMap.entrySet().stream()
            .map(stringObjectEntry -> Tag.of(stringObjectEntry.getKey(),
                String.valueOf(stringObjectEntry.getValue())))
            .toList();

          log.warn("[CustomTags] [{}]", CommonUtils.toJson(tags));
        return tags;
      }
    } catch (Exception e) {
      if (PRINT_ERROR_COUNTER < 5) {
        log.error("[Error while getting attributes map object]", e);
        PRINT_ERROR_COUNTER++;
      }
    }
    return List.of();
  }

  @Override
  public Iterable<Tag> getLongRequestTags(HttpServletRequest request, Object handler) {
    return null;
  }
}
@Bean
  public WebMvcTagsContributor webMvcTagsContributor() {
    return new CustomWebMvcTagsContributor();
  }

为了测试这一点,我创建了一个小型的spring boot应用程序,添加了一个端点,运行良好。
问题是当我将此代码添加到生产应用程序时。
生成的指标是默认的,我不知道为什么。
我可以检查什么来查看为什么没有添加标记?

local test project

http_server_requests_seconds_count {exception="None", method="GET",id="123",outcome="Success",status="200",test="test",uri="/test/{id}/compute/{test}",)1.0

in prod - different (& bigger) app
http_server_requests_seconds_count {exception="None", method="GET",outcome="Success",status="200",uri="/api/{something}/test",)1.0

我试过但没成功

  • 创建了一个实现WebMvcTagsProvider的bean--这个bean有一个奇怪的行为--它没有为路径中有路径变量的端点创建度量--尽管在我的本地测试项目中它按预期工作
  • 我添加日志是为了看看额外的标签是什么,但似乎没有达到那里,因为我没有看到日志中的任何东西-我知道,你可能会说,当前的用户ID停止它,但它不是。
ddrv8njm

ddrv8njm1#

为了测试这一点,我创建了一个小型的spring Boot 应用程序,添加了一个端点。它运行得很好。问题是当我将这段代码添加到生产应用程序时。生成的指标是默认的,我不知道为什么。
您可以检查/actuator/beans端点以查看是否创建了bean,但由于您的设置中没有任何特定内容,因此应该这样做。
您是否碰巧使用了Java代理,如datadog/azure app insights,opentelemetry?如果是,请尝试删除它并再次检查。

相关问题