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

简介:

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

在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之旅~对请求是否正常结束做监控(分布式的消息树),如需转载请自行联系原博主。

目录
相关文章
|
25天前
|
数据采集 存储 监控
公司监控软件:基于 PHP 的分布式监控系统设计
本文介绍了基于 PHP 的分布式监控系统的设计与实现。该系统包括监控节点、数据采集模块、数据传输模块和监控中心,能够高效地收集、传输和分析各节点的数据,确保系统的稳定运行和安全防护。通过示例代码展示了数据采集、传输及存储的具体实现方法,并强调了安全与可靠性的重要性。
38 3
|
4月前
|
监控 中间件
分布式链路监控系统问题之当某个Segment数据缺失时还原调用树的问题如何解决
分布式链路监控系统问题之当某个Segment数据缺失时还原调用树的问题如何解决
|
4月前
|
存储 调度 文件存储
分布式锁设计问题之当发生节点重启时发往该节点的请求会如何解决
分布式锁设计问题之当发生节点重启时发往该节点的请求会如何解决
|
4月前
分布式锁设计问题之节点A向节点C发起对R1的加锁请求如何解决
分布式锁设计问题之节点A向节点C发起对R1的加锁请求如何解决
|
4月前
|
SQL 监控 分布式数据库
【解锁数据库监控的神秘力量!】OceanBase社区版与Zabbix的完美邂逅 —— 揭秘分布式数据库监控的终极奥秘!
【8月更文挑战第7天】随着OceanBase社区版的普及,企业广泛采用这一高性能、高可用的分布式数据库。为保障系统稳定,使用成熟的Zabbix监控工具对其进行全方位监控至关重要。本文通过实例介绍如何在Zabbix中配置监控OceanBase的方法,包括创建监控模板、添加监控项(如TPS)、设置触发器及图形展示,并提供示例脚本帮助快速上手。通过这些步骤,可以有效监控OceanBase状态,确保业务连续性。
106 0
|
7月前
|
存储 监控 分布式数据库
Scala代码在局域网监控软件中的分布式处理
该文介绍了如何使用Scala进行局域网监控数据的分布式处理。通过示例展示了利用Scala的并发能力进行数据收集,使用集合操作进行数据处理与分析,以及如何将处理结果存储到分布式数据库(如Cassandra)和自动提交到网站。Scala的并发处理能力和丰富库支持使其在分布式处理中表现出色。
128 3
|
7月前
|
存储 JSON 监控
Erlang用于构建分布式屏幕监控软件的优点
Erlang是一种适用于并发编程的语言,特别适合构建分布式屏幕监控软件。其轻量级进程支持高并发,能同时处理多个屏幕的实时更新。Erlang的容错性和高可用性通过监督树机制保证了进程故障时的自动重启。此外,其内置的分布式特性使得跨节点的屏幕监控变得简单。Erlang还允许通过HTTP客户端库自动将监控数据提交到网站,便于数据存储和分析。因此,Erlang是构建此类软件的理想选择。
151 7
|
6月前
|
存储 运维 Prometheus
微服务监控:确保分布式系统的可观察性与稳定性
微服务监控:确保分布式系统的可观察性与稳定性
|
7月前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
224 5
|
存储 监控 数据可视化
Golang链路追踪:实现高效可靠的分布式系统监控
Golang链路追踪:实现高效可靠的分布式系统监控