如何提取Micrometer现有指标的Status值并复用至自定义UserAgent标签
解决方案
要实现将请求状态码(Status)与UserAgent拼接作为自定义标签值,你需要替换全局标签配置,改用请求级别的动态标签生成逻辑——因为全局commonTags无法获取每个请求的状态码这类动态数据。具体实现步骤如下:
1. 自定义WebMvc标签提供者
创建自定义的WebMvcTagsProvider,在请求处理时动态拼接状态码与UserAgent:
import io.micrometer.core.instrument.Tag; import io.micrometer.spring.web.servlet.WebMvcTags; import io.micrometer.spring.web.servlet.WebMvcTagsProvider; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpHeaders; import java.util.ArrayList; import java.util.List; public class CustomWebMvcTagsProvider implements WebMvcTagsProvider { @Override public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) { // 获取Micrometer默认生成的所有标签(包含status、method、uri等) List<Tag> defaultTags = new ArrayList<>(WebMvcTags.defaultTags(request, response, handler, exception)); // 提取当前请求的状态码和UserAgent int statusCode = response.getStatus(); String userAgent = request.getHeader(HttpHeaders.USER_AGENT); // 处理UserAgent为空的情况,避免拼接出无效值 String formattedUserAgent = statusCode + "-" + (userAgent != null ? userAgent : "unknown"); // 移除可能存在的旧userAgent标签(如果之前通过全局配置添加过) defaultTags.removeIf(tag -> tag.getKey().equals("userAgent")); // 添加拼接后的自定义userAgent标签 defaultTags.add(Tag.of("userAgent", formattedUserAgent)); return defaultTags; } @Override public Iterable<Tag> getLongRequestTags(HttpServletRequest request, Object handler) { // 保留长请求的默认标签逻辑即可 return WebMvcTags.defaultLongRequestTags(request, handler); } }
2. 注册自定义标签提供者
在Spring配置类中注册这个自定义Bean,让Micrometer使用它生成请求指标标签:
import io.micrometer.spring.web.servlet.WebMvcTagsProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MicrometerConfig { @Bean public WebMvcTagsProvider customWebMvcTagsProvider() { return new CustomWebMvcTagsProvider(); } }
3. 移除全局标签配置
删掉你之前使用的全局commonTags代码:
// 移除这行代码,避免标签冲突 // this.registry.config.commonTags("userAgent", request.getHeader(HttpHeaders.USER_AGENT));
完成以上配置后,重启服务,访问http://localhost:8080/actuator/prometheus即可看到类似你期望的指标格式:http_server_requests_count{exception="None",method="GET",outcome="SUCCESS",status="200",uri="/testApi",userAgent="200-postmanRunTime/7.32"} 4.098
内容的提问来源于stack exchange,提问作者ABhadauria
相关产品推荐
相关产品推荐

