博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)
阅读量:6342 次
发布时间:2019-06-22

本文共 3276 字,大约阅读时间需要 10 分钟。

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

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

对消息树流程的设计

代码的实现

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

///     /// Cat拦截器,主要拦截Http请求    ///     public class CatFilter : System.Web.Mvc.ActionFilterAttribute    {        ///         /// 请求来到时        ///         ///         public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)        {            base.OnActionExecuting(filterContext);        }        ///         /// 请求结束时        /// 调用次序:A->B->C->c->b->a,从c开始执行,把context结果在响应头里依据向回传        ///         ///         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的上下文

///         /// Get数据        ///         ///         /// 
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
(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进行更深入的研究!

转载于:https://www.cnblogs.com/lori/p/5318695.html

你可能感兴趣的文章
我的友情链接
查看>>
2013-7-17学习作业练习
查看>>
利用SVN的post-commit钩子实现多项目自动同步
查看>>
医疗卫生信息化、医学资料下载
查看>>
linux用户管理实验3:usermod命令
查看>>
2款比较炫的图片左右切换,放大效果。
查看>>
nginx下日志切割的shell
查看>>
动态代理实例
查看>>
GNS3 配置Static p2p GRE over IPsec
查看>>
Linux下软件的安装与管理(四)
查看>>
Immutable集合
查看>>
百度竞价排名屏蔽插件for Chrome
查看>>
MySQL数据库水平切分的实现原理解析
查看>>
python网络编程学习笔记(7):HTML和XHTML解析(HTMLParser、BeautifulSoup)
查看>>
ctf.360.cn第二届,逆向部分writeup——第二题
查看>>
Windows Server 2012 将资源发布到 AD DS
查看>>
Redhat linux C 函数 以及一些shell命令的 man rpm
查看>>
XenServer 6.0发布
查看>>
提高工作效率的方法之“20分钟理论”
查看>>
docker CE&&EE版本centos安装
查看>>