前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springcloud gateway高级功能之监控metric中tag修改

springcloud gateway高级功能之监控metric中tag修改

作者头像
一笠风雨任生平
发布2022-01-06 14:21:37
2.1K1
发布2022-01-06 14:21:37
举报
文章被收录于专栏:服务化进程

背景

springcloud gateway在集成Prometheus后看到监控图中uri是UNKNOWN,如下图:

这里问题有很多同伴都有遇到,如下面一个: https://blog.csdn.net/a1033025319/article/details/90518867 文章中也有进去分析源码是如何工作的,但是没有给出解决方案,这里我们就讨论下如何修改已有metrics的tag或者增加tag

方案讨论

webflux

了解springcloud gateway原理的应该了解gateway是依托于spring webflux,想要了解webflux可以在搜索相关资料,这里不做详细介绍,我们进入debug模式,可以观察到最终指标监控代码是进入到了DefaultWebFluxTagsProvider这个类,这个类代码如下:

代码语言:javascript
复制
package org.springframework.boot.actuate.metrics.web.reactive.server;

import io.micrometer.core.instrument.Tag;
import java.util.Arrays;
import org.springframework.web.server.ServerWebExchange;

public class DefaultWebFluxTagsProvider implements WebFluxTagsProvider {
    public DefaultWebFluxTagsProvider() {
    }

    public Iterable<tag> httpRequestTags(ServerWebExchange exchange, Throwable exception) {
        return Arrays.asList(WebFluxTags.method(exchange), WebFluxTags.uri(exchange), WebFluxTags.exception(exception), WebFluxTags.status(exchange), WebFluxTags.outcome(exchange));
    }
}

这里就是背景中有一个问题中的调用方,这里我们可以自己实现一个WebFluxTagsProvider 来自定义监控tag,举个例子,我们在上一章springcloud gateway高级功能之根据参数自定义路由Predicate 中读取了参数,这里我们就可以根据参数来修改tag,如果没有参数我们也可以将获取指定url注入

代码语言:javascript
复制
 @Bean
    public WebFluxTagsProvider webFluxTagsProvider() {
        return new WebFluxTagsProvider() {
            @Override
            public Iterable<tag> httpRequestTags(ServerWebExchange exchange,
                                                 Throwable exception) {
                Tag urlTag;
                Object obj=exchange.getAttributes().get(RecommendFacadeConstants.CACHE_REQUEST_BODY_OBJECT_KEY);
                if(obj!=null){
                    urlTag=Tag.of("uri", ((Request)obj).getParams);
                }else{
                    urlTag=Tag.of("uri", exchange.getRequest().getURI().getPath());
                }
                return Arrays.asList(WebFluxTags.method(exchange), urlTag,
                        WebFluxTags.exception(exception), WebFluxTags.status(exchange),
                        WebFluxTags.outcome(exchange));
            }
        };
    }

上面代码不仅仅可以修改,还可以添加tag,这里我就不写demo了,下面是改造后的效果,如下:

webMvc

这里顺便提一下,如果我们没有使用springcloud gateway,而是使用spring mvc,这里我们同样可以进行改造来修改tag,同上,mvc也是用的default provider,如下

代码语言:javascript
复制
package org.springframework.boot.actuate.metrics.web.servlet;

import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DefaultWebMvcTagsProvider implements WebMvcTagsProvider {
    public DefaultWebMvcTagsProvider() {
    }

    public Iterable<tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler, Throwable exception) {
        return Tags.of(new Tag[]{WebMvcTags.method(request), WebMvcTags.uri(request, response), WebMvcTags.exception(exception), WebMvcTags.status(response), WebMvcTags.outcome(response)});
    }

    public Iterable<tag> getLongRequestTags(HttpServletRequest request, Object handler) {
        return Tags.of(new Tag[]{WebMvcTags.method(request), WebMvcTags.uri(request, (HttpServletResponse)null)});
    }
}

参考上面的配置,我们同样可以改造WebMvcTagsProvider ,我们可以读取request中的参数来修改tag,这里如果是post,则需要httprequest的装饰器来读取post body,详细代码我这里不举例子了,如果需要可以在网上搜索,然后实现自定义的WebMvcTagsProvider

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 方案讨论
    • webflux
      • webMvc
      相关产品与服务
      Prometheus 监控服务
      Prometheus 监控服务(TencentCloud Managed Service for Prometheus,TMP)是基于开源 Prometheus 构建的高可用、全托管的服务,与腾讯云容器服务(TKE)高度集成,兼容开源生态丰富多样的应用组件,结合腾讯云可观测平台-告警管理和 Prometheus Alertmanager 能力,为您提供免搭建的高效运维能力,减少开发及运维成本。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档