对基于请求的分布式消息树的分析

在MVC时有过滤器System.Web.Mvc.ActionFilterAttribute,它可以对action执行的整个过程进行拦截,执行前与执行后我们可以注入自己的代码,这是我们实现对请求做监控的前提,对于一个请求来说,如果它是从Get或者Post过来的,我们会在发起端将初始catContext进行链条式的传递,从第一个节点开始生成并传递,最后到尾结节,开始执行cat,生成新的context,将新的context回写到响应头,由上一个节点拿到这个响应头,开始写自己的cat,这个过程最后执行到第一个节点,整个过程结束!

对消息树流程的设计

代码的实现

下面开始设计咱们的Filter拦截器,用来生成catContext,并将处理后的context写响应头中

   /// <summary>/// Cat拦截器,主要拦截Http请求/// </summary>public class CatFilter : System.Web.Mvc.ActionFilterAttribute{/// <summary>/// 请求来到时/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext){base.OnActionExecuting(filterContext);}/// <summary>/// 请求结束时/// 调用次序:A->B->C->c->b->a,从c开始执行,把context结果在响应头里依据向回传/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext){var context = PureCat.CatClient.GetCatContextFromServer();if (context != null){context = PureCat.CatClient.DoTransaction("youDomain", filterContext.HttpContext.Request.Url.AbsoluteUri, () =>{PureCat.CatClient.LogRemoteCallServer(context);PureCat.CatClient.LogEvent(filterContext.HttpContext.Request.Url.AbsoluteUri, "Action  Finish...");if (filterContext.Exception != null){PureCat.CatClient.LogError(filterContext.Exception);}});#region 响应头写数据if (filterContext.HttpContext.Response.Headers.GetValues("catContext") != null&& filterContext.HttpContext.Response.Headers.GetValues("catContext").Length > 0){filterContext.HttpContext.Response.Headers.Remove("catContext");}filterContext.HttpContext.Response.Headers.Add("catContext", Lind.DDD.Utils.SerializeMemoryHelper.SerializeToJson(context));#endregion}base.OnActionExecuted(filterContext);}}

最后就是修改我们之前封装的GET和POST方法,让它处理一下响应头,使用响应头的context作为当前cat的上下文

  /// <summary>/// Get数据/// </summary>/// <param name="requestUri"></param>/// <returns></returns>public static HttpResponseMessage Get(string requestUri, bool isCat){var handler = new HttpClientHandler() { };using (var http = new HttpClient(handler)){PureCat.CatClient.SetCatContextToServer(http, GetCurrentContext("Get Request Sent...", isCat));//设置接口api的头,发送var response = http.GetAsync(requestUri).Result;var context = response.Headers.Where(i => i.Key == "catContext");if (context != null && context.Count() > 0){var cat = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<CatContext>(context.First().Value.FirstOrDefault());PureCat.CatClient.SetCatContextToServer(System.Web.HttpContext.Current, cat);}return response;}}

日志的生成

最后生成的cat日志也是我们可以理解的,即从a,b,c,d的调用,在执行结束的监控顺序是d,c,b,a,呵呵,并且在在step2时故意放了一个异常出来,让cat记录一下,呵呵。

感谢您的阅读!

大叔还会继续对cat进行更深入的研究!

实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)相关推荐

  1. 实时监控Cat之旅~对Get和Post进行封装,支持分布式消息树

    对第三方接口的调用我们需要对GET和POST进行监控,看一些请求的执行是否成功,如A调用B,B调用C,C调用D,这一连串的东西需要我们使用cat进行记录,进行记录之后,我们可以很容易的发现请求响应的时 ...

  2. 实时监控Cat之旅~配置Cat集群需要注意的问题

    在配置cat集群时,有一些设置是我们应该注意的,从它的部署文档中我们可以看到相关信息,但说的还不够明确和重要,大叔今天总结一下Cat集群配置的注意事项 1 服务端datasources.xml用来设置 ...

  3. vs 输入代码时出现火花_vscode 火花_火花监控如何每天处理10B请求

    vscode 火花_火花监控如何每天处理10B请求 vscode 火花_火花监控:如何每天处理10B请求 vscode 火花 Taboola的Spark监视架构可处理每日10B +的用户事件 他们说独 ...

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

    CAT(Central Application Tracking)是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,基本接入了美团上海侧所有核心应用.目前在中间件(MVC.RPC.数据库. ...

  5. 全面分析分布式监控CAT

    CAT(Central Application Tracking)是一个实时和接近全量的监控系统,它侧重于对Java应用的监控 项目的开源地址是 http://github.com/dianping/ ...

  6. CAT中实现异步请求的调用链查看

    CAT简介 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在线访 ...

  7. 大众点评开源监控CAT概览

    1. CAT介绍 CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring.MyBatis.Dubbo 等框架以及Log4j 等结 ...

  8. 【余压监控系统】实时性、数字化、智能化,自动化,连续动态监控

    余压监控系统在某高层住宅的应用方案 安科瑞 崔远航 摘要 本文介绍了余压监控系统的基本架构和功能,结合某高层住宅建设实例分析了高层民用建筑中设置此系统的优点与必要性,总结了余压监控系统的功能用于高层建 ...

  9. 使用Charles监控手机应用的网络请求

    使用Charles监控手机应用的网络请求 同类型的产品很多,我之所以选择它,不为其他的,就是感觉它好用- 下载并安装 Charles . 打开Charles,进行简单的设置,以下是提供的配置截图,请按 ...

最新文章

  1. tomcat安装及使用详解
  2. Scanner类详解
  3. arm linux 识别新硬盘_Arm发布首款64位实时处理器CortexR82
  4. C/C++存储区划分
  5. Python defaultdict 模块和 namedtuple 模块 1
  6. windows 10 扩大C盘空间
  7. 计算机三级网络操作题,计算机等级考试三级网络技术考试模拟试题
  8. java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
  9. shiro学习(16):使用注解实现权限认证和后台管理二
  10. php在线模拟高考志愿,高考志愿模拟填报系统
  11. Bad Request (Invalid Hostname)解决方法
  12. 一步步学敏捷开发:6、Scrum的3种工件
  13. Java校招笔试题-Java基础部分(六)
  14. Java的poi技术遍历Excel时进行空Cell,空row,判断
  15. 特斯拉被踢出致命车祸调查组:提前披露信息,涉嫌把责任推向车主
  16. rust采南瓜按什么_怎样进行南瓜的采后处理?
  17. 2022年认证杯SPSSPRO杯数学建模B题(第一阶段)唐宋诗的定量分析与比较研究求解全过程文档及程序
  18. 谷歌浏览器保存网页为PDF
  19. uniapp AES加密解密
  20. SHELL编程基础 By jackie

热门文章

  1. 多线程之线程可见性synchronized
  2. MATLAB编程与应用系列-第3章 矩阵运算(4)
  3. Leetcode - Permutations I,II
  4. Google新项目:从一条线开始,完成地球的绘制
  5. Android开发UI之GridLayout的使用
  6. Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
  7. java中length的用法
  8. 10g手动创建数据库
  9. 100套高质量的免费 PSD 界面设计素材【系列一】
  10. 图片播放器 简单使用