You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:42:49