我正在尝试添加自定义标签-路径变量和它们的值-到每一个公制千分尺生成。我正在使用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停止它,但它不是。
1条答案
按热度按时间ddrv8njm1#
为了测试这一点,我创建了一个小型的spring Boot 应用程序,添加了一个端点。它运行得很好。问题是当我将这段代码添加到生产应用程序时。生成的指标是默认的,我不知道为什么。
您可以检查
/actuator/beans
端点以查看是否创建了bean,但由于您的设置中没有任何特定内容,因此应该这样做。您是否碰巧使用了Java代理,如datadog/azure app insights,opentelemetry?如果是,请尝试删除它并再次检查。