中小型研发团队架构实践十:应用监控怎么做?

一、Metrics 简介

     应用监控系统 Metrics 由 Metrics.NET+InfluxDB+Grafana 组合而成,通过客户端 Metrics.NET 在业务代码中埋点,Metrics.NET 会把收集到的数据存储在 InfluxDB 数据库中,然后通过 Grafana 来展示监控数据。

     其中,InfluxDB 服务端部署的版本号是 1.3.1,Grafana 部署的版本号是 4.0.1。下面将结合这 3 个工具来介绍如何实现对应用的监控。

     Metrics.NET 移植自 Java 的 metrics,它是一个给 CLR 提供度量的工具包。在业务代码中埋点 Metrics.NET 代码后,就可以方便地对各技术指标、业务指标进行度量,如:共花多长时间完成某方法的执行、某方法在被执行的过程中共出现过几次异常、某时间段内共下多少订单量。

     Metrics.NET 共提供 5 种度量类型:Gauge、Counter、Meter、Histogram 以及 Timer。下面只介绍了 Meter 和 Histogram 这两种,另外 3 个若有兴趣可自行抽空去了解。

     Gauge:Gauge是最简单的度量类型,存储了一个double类型的值,所以一般用它记录系统的一些即时值,比如最近的一次的内存占用或者是系统CPU百分比。

     Counter:Counter顾名思义是计数器的意思,用于存储一个64位长计数器,由应用系统的代码逻辑控制Counter的自增或自减。而且该计数器是支持明细计数的,Counter保持一个总的计数,并且保持一个子项的计数明细数组。
                     计数器可以用来记录当前系统的并发数。在进入调用时计数器自增,退出之前自减。并且还可以支持使用一个Counter实现针对各个接口进行明细统计。

     Histogram:Histogram直方图,度量流数据中Value的分布情况,将会计算最大/最小、平均值、方差、分位数(75%,90%,98%,99%的数据在哪个范围)。例如可以统计每一个POST请求中的内容的大小或者处理所花的时间。

     Meter:Meter度量的是事件在一定单位时间内发生的次数。比如单位时间内事件发生的平均次数,或者1分钟、5分钟或15分钟内发生次数的滑动平均值。可以使用Meter统计异常发生的频率。

     Timer:Timer是Histogram跟Meter的一个组合,他在Meter的基础上,增加了对处理耗时的Histogram的度量,并且他还度量了一个ActiveSession的值,他代表了一个并发数。Timer是五种度量里最复杂的度量类型。

二、埋点 Metrics.NET 的方法

     首先为需要收集 Metrics.NET 监控数据的业务项目引用 Metrics.dll。

     然后,在项目中的 App.config/Web.config 文件中加上如下配置信息:

1 <add key="AppID" value="150106"/>   
2 <add key="Metrics.DBUri" value="http://139.198.13.12:4126/write"/>
3 <add key="Metrics.UserName" value="Arch"/>
4 <add key="Metrics.Password" value="Arch"/>
5 <add key="Metrics.Database" value="ArchDB"/>

     1、Meter

     Meter 用于度量 TPS(每秒处理的请求数)。

     示例:模拟统计成功下单量、下单金额、失败下单量。

     调用 Meter 对象的 Mark() 方法:

复制代码
 1 static void CreateOrder()  2 {  3   try        
 4  {  5     // 省略关于下单的业务逻辑代码  6     //......  7 
 8     // 分别统计成功下单量和下单金额,统一写到 MetrisKey 中 
 9  MetricsKey.OrderCount.Mark(); 10     if (n % 2 == 1) 11  { 12         MetricsKey.OrderMoneyCount.Mark("BuyerA", n); 13  } 14     else
15  { 16         MetricsKey.OrderMoneyCount.Mark("BuyerB", n); 17  } 18  } 19   catch (Exception) 20  { 21     // 统计失败下单量,统一写到 MetrisKey 中 
22  MetricsKey.OrderErrorCount.Mark(); 23 
24     // 省略异常处理代码...... 
25  } 26 }
复制代码

     2、Histogram

     Histogram 用于度量流数据中 Value 的分布情况,它不仅使您能像 Meter 一样测量出 TPS ,还能测量出最小值、最大值和平均值。使用场景如:统计服务器的延迟时间、统计某方法共执行多长时间。

     示例:模拟统计航班查询引擎方法的耗时情况。

     调用 Histogram 对象的 Update() 方法:

复制代码
 1 private readonly Histogram searchFlightTime = MetricsHelper.Histogram("MetricsDemo.SearchFlightTime", Unit.Custom("ms"));  2 
 3 static void SearchFlight()  4 {  5   Stopwatch stopwatch = Stopwatch.StartNew();  6 
 7   // 模拟关于航班查询的业务逻辑的代码 
 8   Random random = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);  9   var n = Random.Next(100); 10  Thread.Sleep(n); 11 
12  stopwatch.Stop(); 13 
14   // 统计航班搜索耗时 
15  searchFlightTime.Update(stopwatch.ElapsedMilliseconds); 16 }
复制代码

三、Grafana 配置

     查阅 Metrics Dashboard Demo 的地址:http://139.198.13.12:4127/。打开这个 Metrics 地址后,如果页面显示已登录状态,那么在开始查阅前,请先确认是否把组织切换到了 Default Org.:

     中小型研发团队架构实践十:应用监控怎么做?_第1张图片

      1、仪表盘设置

      点击位于下图上方的 Home 图标,会下拉弹出 Dashboard 列表:

      中小型研发团队架构实践十:应用监控怎么做?_第2张图片

     点击位于上图下方的 Create New 按钮,会进入到新建面板 Panel 页面,点击位于下图上方的保存图标按钮:

      

     在弹出的 Save As... 对话框中输入 Dashboard 名称,如 Arch.OrderCountDemo,然后点击 Save 按钮进行保存:

      中小型研发团队架构实践十:应用监控怎么做?_第3张图片

     2、面板(Panel)设置

      点击上面创建的【Arch.OrderCountDemo】Dashboard 图标,进入属于这个 Dashboard 的面板(Panel)页面:

      中小型研发团队架构实践十:应用监控怎么做?_第4张图片

     点击位于上图的 ADD ROW 按钮,进入下图。其中,Graph 表示以图表(有折线图、柱状图、散点图、梯形图)形式展示数据、Singlestat 表示单个统计、Table 表示以表格形式展示数据、PieChart 表示以饼状图形式展示数据。这几种统计类型的面板设置方式类似,本文将以 Graph 为例进行说明。

      中小型研发团队架构实践十:应用监控怎么做?_第5张图片

     2.1、数据设置
     点击上图的 Graph 图标创建图表:

      中小型研发团队架构实践十:应用监控怎么做?_第6张图片

     点击上图的 Panel Title,在弹出菜单中单击 Edit 打开 Panel 编辑界面,即进入 Metrics 选项卡面板。关于 Meter 的查询数据语句配置一般如下:

      中小型研发团队架构实践十:应用监控怎么做?_第7张图片

     关于 Histogram 的查询数据语句配置一般如下:

      中小型研发团队架构实践十:应用监控怎么做?_第8张图片

     其中,fill() 一般被设为 null,但当查询时间范围很大时(如 1 天),请用 fill(0);另外,$appId、$serverIP、$summarize 这 3 个变量是在模板(Templating)中设置,请看第 3 小节的介绍。

     2.2、样式配置
          2.2.1、General 选项卡用来设置 Panel 样式
          主要用来设置 Panel 的标题:

      中小型研发团队架构实践十:应用监控怎么做?_第9张图片

          2.2.2、Axes 选项卡用来设置坐标轴
          Label 表示设置左侧 Y 轴旁显示什么说明文字,另外,Unit 表示设置左侧 Y 轴数字的单位:

      中小型研发团队架构实践十:应用监控怎么做?_第10张图片

          2.2.3、Legend 选项卡用来设置显示样式

      中小型研发团队架构实践十:应用监控怎么做?_第11张图片

           2.2.4、Display 选项卡用来设置图表样式

         Draw options 子选项卡用来设置图表显示效果:

         Draw Modes:Points 表示设置是否在图中显示散点;

         Mode Options:Fill 表示设置填充度、Line Width 表示设置图表线的粗细、Point Radius 表示设置圆点半径的长度;

         Stacking & Null value:Null value 选择 null as zero 时表示设置当该时间节点在 InfluxDB 中没有记录时,用 0 替代。

      中小型研发团队架构实践十:应用监控怎么做?_第12张图片

     3、模板(Templating)设置

      打开 Templating 设置页面:

      中小型研发团队架构实践十:应用监控怎么做?_第13张图片

     新建变量:

      中小型研发团队架构实践十:应用监控怎么做?_第14张图片

     新建 serverIP 变量:(在 Query 文本框处,输的是:SHOW TAG VALUES WITH KEY = "ServerIP")

      中小型研发团队架构实践十:应用监控怎么做?_第15张图片

     新建 summarize 变量,其中 Values 值可以自行添加或删除,值与值之间用英文状态的逗号隔开:

      中小型研发团队架构实践十:应用监控怎么做?_第16张图片

     新建 adhoc 变量:

      中小型研发团队架构实践十:应用监控怎么做?_第17张图片

     4、设置 Time Range

      一个 Dashboard 中,除了需要显示实时监控数据外,有时还需要显示历史的监控数据,主要目的是要通过对历史监控数据的观察来预测未来的业务量走势,那么需要重写 Time Range,即需要在 Time range 选项卡中进行设置。
     例如,在一个 Panel 中需要显示近 24 小时的历史监控数据,那么请在这个 Panel 中加上如下配置:

      中小型研发团队架构实践十:应用监控怎么做?_第18张图片

     5、告警设置

      在 Grafana 当前版本(4.0.1)中,告警目前仅支持 Graph 类型的面板,在将来版本会添加 Singlestat 和 Table 类型面板的支持。另外,由于告警查询语句不支持 template 变量,所以最好是对不使用 template 变量的 Panel 才设置告警。

      5.1、设置通知规则
     在左侧菜单中选择 Alerting -> Notifications 进入通知列表页:

      中小型研发团队架构实践十:应用监控怎么做?_第19张图片

     点击 New Notification 按钮新建一个通知:在 Name 文本输入框中,输入通知名称,类型 Type 选择 email。设置完成之后单击 Save 按钮,然后点击 Send Test 按钮测试下通知是否能够发送成功。

      中小型研发团队架构实践十:应用监控怎么做?_第20张图片

     5.2、设置告警规则
     进入需要添加告警的 Panel 的编辑界面,转到 Alert 选项卡,点击 Create Alert 按钮,进入 Alert Config 子选项卡界面进行配置,其中 Evaluate every 表示设置执行频率,Conditions 表示配置何时告警的条件(WHEN 是选择聚合函数的地方,OF 用来设置时间段,IS ABOVE 或者 IS BELOW 用来设置阈值)。对 Alert Config 子选项卡界面的配置参考如下:

      中小型研发团队架构实践十:应用监控怎么做?_第21张图片

     然后在 Notifications 子选项卡界面中配置通知规则:

      中小型研发团队架构实践十:应用监控怎么做?_第22张图片

     5.3、暂停告警操作
     在左侧菜单中点击 Alerting -> Alert List 进入告警规则列表页,点击暂停图标按钮就可以停止该告警:

     中小型研发团队架构实践十:应用监控怎么做?_第23张图片

四、其它说明

     1、Grafana 匿名访问地址: http://139.198.13.12:4127/。建议使用 Google Chrome 浏览器打开 Grafana;
     2、一个 MetricsName 对应一张数据表,建议明确定义 MetricsName;
     3、提供的 Metrics.dll 基于 0.4.8 的版本增加了 Unit Count 的返回,且适用于.NET Framework 4.5 及其以上版本。

 五、总结 Metrics 的价值

     1、可以实时监控线上程序运行情况,形成闭环、不断改进;
     2、可以预测程序未来大致走向;
     3、可以及时发现故障,消灭在用户反馈之前;
     4、Metrics.NET 出现异常不影响业务流程;
     5、可设置自动报警,即时发送邮件、短信、微信 (通过 API);

六、Demo 下载及更多资料

     MetricsDemo 下载地址:https://github.com/das2017/MetricsDemo
     Metrics.NET 官方网站:https://github.com/Recognos/Metrics.NET
     InfluxDB 官方文档:https://docs.influxdata.com/influxdb/v1.1/
     Grafana 官方文档:http://docs.grafana.org/

你可能感兴趣的:(架构设计)