美团点评Cat监控springCloudGateway的尝试

SpringBoot——》Cat埋点、Cat+Feign整合消息调用链路 参考: 总结——》【SpringBoot】 SpringBoot——》CAT客户端从Apollo中读取配置 调用链监控 CAT 之 URL埋点实践 CAT 消息链路(消息树)的构建思路: A -> B -> C 上下级编号关联 CAT 编号模型: ROOTID : 根的编号 PARENTID : 上级编号 CHILD : 子级编号 Feign调用: Feign底层基于HTTP去调用的,所以参数之间传递的时候需要将消息编号进行传递,并且关联起来。 例如: A 客户端要生成编号模型, 阅读详情

 

 

先说结论:CAT监控不了springCloudGateway的接口调用情况。

 

 

需求:

想使用大名鼎鼎的CAT对网关进行埋点监控。其中网关的下游系统可能是eureka注册中心的上的服务,也可能是一个简单的HTTP接口【http接口也可能是域名或者SLB】。监控每一个下游系统每一个接口的调用量、耗时、异常统计。

实践:

import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;

import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;

/**
 * @author xtj
 * @date 2018/12/13 2:58
 */
@Component
public class CatLogGlobalFliter implements GlobalFilter, Ordered {

    private static final Logger LOGGER = LoggerFactory.getLogger(CatLogGlobalFliter.class);

    public static final String CAT_T_AUTH_GATEWAY = "CAT_T_AUTH_GATEWAY";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

//        request.getURI() 原始URL
//        getURI().getRawPath()
//        获取URL.并且这个URL是代理后的真正服务器的URL.
        try {
            URI urlOrigin = exchange.getRequest().getURI();
            if (!(urlOrigin.toString().contains("favicon.ico"))) {
                URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
                Transaction t;
                if (url != null) {
                    t = Cat.newTransaction("targetService", url.toString());
                } else {
                    t = Cat.newTransaction("targetService", urlOrigin.toString());
                }
                exchange.getAttributes().put(CAT_T_AUTH_GATEWAY, t);
            }
        } catch (Exception e) {
            LOGGER.error("CAT发生异常", e);
        }
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            try {
                Transaction t = exchange.getAttribute(CAT_T_AUTH_GATEWAY);
                if (t != null) {
                    HttpStatus status = exchange.getResponse().getStatusCode();
                    t.setStatus("1");
                    if (status.equals(HttpStatus.OK)) {
                        t.setStatus("0");
                    }
                    t.complete();
                }
            } catch (Exception e) {
                LOGGER.error("CAT发生异常", e);
            }
        }));

    }

    /**
     * RouteToRequestUrlFilter将请求的URL放进exchange中的HashMap中,
     * KEY是org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
     * 而在本全局过滤器重,会从exchange得到请求URL,作为我们埋点需要的一个数据。
     * 因此本过滤器的顺序要在RouteToRequestUrlFilter之后。
     * RouteToRequestUrlFilter的顺序ID是10000,所以设置本过滤器顺序id稍微大一点,变成10001。
     */
    @Override
    public int getOrder() {
        return 10001;
    }
}

 

测试结果:

CAT客户端上传数据到服务端还是比较迅速的,普通项目在测试的时候,基本上调用一次接口,CAT服务器上Transaction都会很快可以看到。

但是在测试网关这个CAT埋点的时候,发现调用了好几次,才有一次记录,并且logView后,发现Transaction之间有很多嵌套。而我们的代码也很简单,没有嵌套。

 

原因分析:

正常我们在cat-Transaction完成的时候,即调用complete方法的时候,跟进源码里面,正常的应该走下面的逻辑。

 

注意第130行代码,是获取一个Context对象,也就是一个上下文容器,这个上下文容器是一个线程一个。因此存在ThreadLocal中的。而Context中保存着一个栈元素,Transaction开始的时候入栈,complete的时候出栈,这也就是CAT能用来发现方法调用中到底是那个方法最耗时的原理。

正常情况下是没有问题的,但是在springCloudGateway使用了异步netty,也就是说在发起真正的请求下游前和在得到response后的处理已经不是一个线程了。这样就会导致使用threadLocal产生不是我们想要的结果,即发生线程同步问题。

 

这个问题是比较严重的,CAT中的Transaction开始后,必须调用complete方法,不然会有内存泄露问题!包括Event的记录,也是依赖上面的threadLocal原理。即使简单记录event,而不使用Transaction,也是会有问题的,在logView中会看到很多嵌套的event,而这些并不是我们预期的产生的。

 

结论:

不要在springCloudGateway中使用CAT,会造成很大的问题和风险。这个结论也和cat负责人确认过。

 

 

 

 

【2023】最新基于Spring Cloud的微服务架构分析 Spring Cloud Config:配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git 以及 Subversion。Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与 Spring Cloud Config 联合实现热部署。Eureka:云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 阅读详情

相关推荐

【Spring Cloud】:如何使用Spring Boot Actuator进行应用监控

如果你想自定义端点,可以通过实现Endpoint接口或继承类来创建自己的端点。

Pmyx_wyh的博客 623

CAT埋点实战-服务器搭建-代码实现

可先了解理论知识 1、点评Cat报表、消息类型简介 2、CAT客户端架构设计 3、CAT服务端设计 4、CAT埋点实战 服务搭建 1、官网下载war包,或者下载源码install 2、mysql新建库:cat;执行源码目录:script/CatApplication.sql 3、在tomcat所在磁盘新建目录:\data\appdatas\cat 4、在目录下新建下图三个文件 ...

重点在于记录 3917

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

CAT分布式监控系统(二):CAT埋点方案 项目接入CAT监控说明

CAT分布式监控系统(二):CAT埋点方案 项目接入CAT监控说明 本文概要: 前面《CAT监控功能介绍》已经介绍了CAT监控系统是什么、能做什么; 而本文主要是基于自己编写的CAT采集端埋点SDK,来说明CAT埋点方案,以及项目中如何接入CAT监控。 1、配置/data/appdatas/cat/client.xml ...

tjiyu的博客 1万+

机器学习---xgboost算法

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。出结果, 是模型的输出结果;等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里。其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情。最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。的正则化项是K棵树的正则化项相加而来的。

weixin_43961909的博客 1万+

【NLP】文献翻译4——CH-SIMS:中文多模态情感分析数据集与细粒度的模态注释

CH-SIMS: A Chinese Multimodal Sentiment Analysis Dataset with Fine-grained Annotations of Modality摘要1. 介绍2. 相关工作2.1 多模态数据集2.2 多模态情感分析2.3 多任务学习3. CH-SIMS 数据集3.1 数据获取3.2 标注3.3 特征提取4. 多模式多任务学习框架4.1 单模态子网4.2 特征融合网络4.3 优化目标5. 实验5.1 基准5.2 实验的细节5.3 结果和讨论5.3.1 与

YoungSeng's Blog 1万+

SpringCloud - Spring Cloud 之 Sleuth分布式链路跟踪;Zipkin埋点数据;Elastic Search 数据持久化(十八)

微服务有几种监控方式,如Spring Boot Actuator监控微服务,Spring Boot Admin监控微服务,Hystrix Dashboard监控Hystrix服务,Hystrix Turbine聚合多个Hystrix服务的监控信息等对于一个由几十个、甚至几百个大型微服务构成的微服务架构系统,通常会遇到下面一些问题,如: 如何串联整个调用链路,快速定位问题?如何理清各个微服务之间的依赖关系?如何进行各个微服务接口的性能分折?如何跟踪整个业务流程的调用处理顺序?Spring Cloud Sleu

MinggeQingchun的博客 2098

maya权重拷贝一对一,一对多

是不是有时候盔甲很多很碎头很大,用代理一个个拷贝很麻烦吧 用下面代码直接运行进行一对多或者一对一拷贝 第一个先选择参考物体,加选其他一堆有的没的有权重或没权重的物体执行一键拷贝,就可以啦 以下是源码送上,带走吧 ------------------------ #! -*- coding:utf -8 -*- #author:liubingdong #date:20...

weixin_30852367的博客 1532

springcloudgateway 集成 Cat

1、pom部分: <dependency> <groupId>com.dianping.cat</groupId> <artifactId>cat-client</artifactId> <version>3.0.0</version> </dependency> 2、代码部分: package com.vsulv.bgb.modu

LHQChocolate的专栏 891

基于深度学习的垃圾邮件识别

垃圾邮件的大量存在严重威胁着电子邮件系统的安全和效率。基于深度学习的垃圾邮件识别技术已经成为目前最有效的解决方案之一。本文将详细介绍使用深度学习技术进行垃圾邮件识别的方法,并提供相应的代码实现。 随着电子邮件的广泛应用,垃圾邮件的数量不断增加,传统的规则和统计方法已经无法满足对垃圾邮件进行准确识别的需求。深度学习技术以其强大的模式识别能力和自动特征提取能力成为解决垃圾邮件识别难题的有效工具。

一键难忘的博客 1093

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

springmvc+dubbo+mybatis 接入大众点评 CAT 监控平台

  转自:https://fanlychie.github.io/post/springmvc-dubbo-mybatis-with-cat.html CAT(Central Application Tracking)是基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。关于CAT的具体介绍可移步到CAT官网进行查阅。 CAT平台的搭建可移步到「搭建大众点评C...

Lisam Blog 4522

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1212

系统架构设计——互联网金融系统架构设计

根据第三方机构预统计,自2016年-2019年,我国零售信贷规模维持20%以上的高复合增长率,2017年中国零售信贷规模达到27万亿,到2019年,总规模超过37万亿。近年来互联网金融蓬勃发展,在借贷、保险、股权等领域涌现出一大批互联网与金融场景相结合的创新产品。同时作为互联网金融的子领域消费金融领域,在国家消费升级战略下,各大平台推出了如花呗、借呗,微粒贷等众多服务。互联网金融的架构有别于传统金融系统,互联网金融产品依托于互联网的众多技术特性,主要包括三大主要方面:在互联网浪潮的背景下,传统银行、金融行业

庄小焱 2万+

【Android面试八股文】Android Application为什么是单例?

这道题相对简单,就是考察大家是否了解application的创建流程。的实例,它用来存储和处理整个全局变量的一些事情,它同时还是一个。为空的时候,才会创建,从而保证了它是一个单例对象。一样有自己的生命周期,但是它并没有那么复杂,因为。对象的创建过程,找出它为什么是单例的原因。全局进行一些配置,比如配置插件。的时候才会创建,所以说可以在。凭什么是单例,我们查看下。启动的时候都会创建一个。是怎么一步步创建的。是一个单例,即每一个。

字节卷动 531

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Cloud 教程 谈谈Spring Cloud 那些事 ,最客观的评价

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud像是一个贴心的助力,它将目前各家公司开发的比较成熟好用、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行...

weixin_38741996的博客 3004

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringCloud优点、缺点

总的来说优点大过于缺点,目前看来SpringCloud是一套非常完善的分布式框架,目前很多企业开始用微服务。3、微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量。1、服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率。2、分布式系统开发的成本高(容错,分布式事务等)对团队挑战大。2、可以更精准的制定优化服务方案,提高系统的可维护性。1、微服务过多,治理成本高,不利于维护系统。4、适于互联网时代,产品迭代周期更短。...

m0_67391377的博客 2641

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

三、美团大众点评CAT监控系列文章---Springboot集成CAT并实现邮件告警

三、美团大众点评CAT监控系列文章---Springboot集成CAT并实现邮件告警

ratel的博客 6047

熬夜之作:一文带你了解Cat分布式监控

如果需要使用 Spring Data Redis 的话,直接集成 kitty-spring-cloud-starter-redis 就可以,kitty-spring-cloud-starter-redis 中对 Redis 的命令进行了埋点,可以在 Cat 上直观的查看对应的命令和消耗的时间。CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计,但是从数据生成到服务端处理结束是秒级别,秒级定义是 48 分钟 40 秒,基本上看到 48 分钟 38 秒数据,整体报表的统计粒度是分钟级;

程序员高级码农的博客 2586

调用链监控 CAT 之 URL埋点实践

URL监控埋点作用 一个http请求来了之后,会自动打点,能够记录每个url的访问情况,并将以此请求后续的调用链路串起来,可以在cat上查看logview 可以在cat Transaction及Event 页面上都看到URL和URL.Forward(如果有Forward请求的话)两类数据;Transaction数据中URL点进去的数据就是被访问的具体URL(去掉参数的前缀部分) 请将catFil...

程序员果果的博客 2600

集成美团cat监控

集成美团cat监控 最近研究spring集成美团cat监控,关于美团cat环境搭建在上篇博客已介绍,集成美团cat在对代码异常,接口请求调用次数与调用时间,sql执行时间和异常,url访问调用时间和次数进行统计,使代码可以有效的管理,在代码与sql查错和排除优化上有显著的效果,可以提升开发和运维的工作效率。有需要的朋友可以了解下。直接步入主题: 一.引入cat-client 的meven依赖 ...

最初的节奏 2199

java cat 如何埋点,框架埋点方案集成/URL/CatFilter.java · clark911/cat - Gitee.com

package com.dianping.cat.servlet;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterCon...

weixin_35911307的博客 468

深度剖析开源分布式监控CAT

CAT(Central Application Tracking)是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了美团上海侧所有核心应用。目前在中间件(MVC、RPC、数据库、缓存等)框架中得到广泛应用,为美团各业务线提供系统的性能指标、健康状况、监控告警等。 自2014年开源以来,Github 收获 7700+ Star,2800+ Forks,被 100+ 公司企业使用,其中不乏携程、陆金所、猎聘网、平安等业内知 名公司。在每年全球 QCon 大会、全球架构与运维技术峰..

一个有情怀的程序猿博客 621

ELK日志分析系统

在数字化转型加速的今天,企业 IT 系统每天都会产生海量的日志数据,这些数据涵盖了应用运行状态、用户行为、安全事件等关键信息。然而,传统的日志管理方式由于分散存储、检索效率低、缺乏深度分析能力等问题,已经难以满足企业高效运维与业务洞察的需求。

YUNYINGXIA的博客 1680

java 调用链监控_调用链监控 CAT 之 URL埋点实践

URL监控埋点作用一个http请求来了之后,会自动打点,能够记录每个url的访问情况,并将以此请求后续的调用链路串起来,可以在cat上查看logview可以在cat交易及事件页面上都看到URL和URL.Forward(如果有前请求的话)两类数据;交易数据中URL点进去的数据就是被访问的具体URL(去掉参数的前缀部分)请将catFilter存放filter的第一个,这样可以保证最大可能性监控所有的请...

weixin_36329368的博客 435

基于Cat的分布式调用追踪

Cat是美团点评出的一款APM工具,同类的产品也有不少,知名的开源产品如zipkin和pinpoint;国内收费的产品如oneapm。考虑到Cat在互联网公司的应用比较广,因此被纳入选型队列,我也有幸参与技术预言。 使用Cat断断续续将近两周的时间,感觉它还算是很轻量级的。文档相对来说薄弱一些,没有太全面的官方文档(官方文档大多是介绍每个名词是什么意思,界面是什么意思,部署方面比较欠缺);但是...

weixin_34166847的博客 767
上一篇: drools满足一条规则后不再执行其他规则的解决方案
下一篇: 2024年12月大语言模型最新对比:GPT-4、Claude 3、文心一言等详细评测
freewind
博客等级 码龄16年 136粉丝 108原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值