一、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、仪表盘设置

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

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

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

2、面板(Panel)设置

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

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

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

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

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

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

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

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

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

           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 替代。

      

     3、模板(Templating)设置

     打开 Templating 设置页面:

      

     新建变量:

      

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

      

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

      

     新建 adhoc 变量:

      

     4、设置 Time Range

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

      

     5、告警设置

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

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

      

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

      

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

      

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

     

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

     

四、其它说明

     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/

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

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

    一.Metrics 简介 应用监控系统 Metrics 由 Metrics.NET+InfluxDB+Grafana 组合而成,通过客户端 Metrics.NET 在业务代码中埋点,Metrics.N ...

  2. 中小型研发团队架构实践:电商如何做企业总体架构?

    http://www.infoq.com/cn/articles/architecture-practice-09-enterprise-architecture?utm_source=infoq&a ...

  3. 中小型研发团队架构实践三要点--转

    来自微信公众号聊聊架构 作者|张辉清 编辑|雨多田光 如果你正好处在中小型研发团队-- 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的 ...

  4. 中小型研发团队架构实践三要点(转自原携程架构师张辉清)

    如果你正好处在中小型研发团队-- 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速 ...

  5. 中小型研发团队架构实践三要点

    如果你正好处在中小型研发团队-- 中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速 ...

  6. .net 中小型研发团队架构实践三要点

    中小型研发团队很多,而社区在中小型研发团队架构实践方面的探讨却很少.中小型研发团队特别是 50 至 200 人的研发团队,在早期的业务探索阶段,更多关注业务逻辑,快速迭代以验证商业模式,很少去关注技术 ...

  7. 中小型研发团队架构实践:高效率、低风险,一键发布并测试的持续集成工具Jenkins...

    一.Jenkins 简介 \\ 当每月发布次数变得越来越多时,如超过 200 次,发布工作人员的工作量会翻倍,此时由人工发布操作失误引起的风险会变得越来越大.为了提高项目的发布效率,也为了降低由人工操 ...

  8. 中小型研发团队架构实践:微服务架构

    http://www.infoq.com/cn/articles/architecture-practice-06-microservice-architect 一.MSA 简介 1.1.MSA 是什 ...

  9. 中小型研发团队架构实践:集中式日志ELK

    一.集中式日志 日志可分为系统日志.应用日志以及业务日志,系统日志给运维人员使用,应用日志给研发人员使用,业务日志给业务操作人员使用.我们这里主要讲解应用日志,通过应用日志来了解应用的信息和状态,以及 ...

最新文章

  1. 常见网络加速技术浅谈(二)
  2. pip install jieba安装慢,安装失败,安装不解决办法
  3. AngularDart 现已全面采用 Dart 开发
  4. C++控制台输出中文时乱码的解决方案
  5. s查看oracle空间分配,Oracle查看表空间使用率(包括临时表空间)
  6. 2017.4.5 java中static关键字
  7. qq音乐linux版本下载地址,QQ音乐linux下载
  8. 解决LDAP客户端统一认证DirectoryEntry出现 Ox80005000的问题
  9. Mac好用的硬盘数据恢复软件推荐
  10. 怎么清理计算机磁盘空间,电脑磁盘空间不足怎么清理
  11. ppd文件下载 linux,Linux系统R230,R270,R330,L380打印机驱动下载爱普生喷墨打印机PPD文件...
  12. 用Desmos玩极坐标
  13. 项目管理办公室(PMO)和项目经理(PM)的区别
  14. 大学学计算机7代i5够吗,学生党必看:最新的7代酷睿与Core i5相比该选谁?
  15. mac下的mysql的my.ini文件在哪里
  16. 【HTML实现弹幕滚动效果和文字动态发光特效代码】
  17. JAVA项目工作经验总结
  18. 哪有什么高效安全运行,只不过是磁盘之间在负重前行 Linux RAID磁盘阵列
  19. office vba编程
  20. 树莓派4b入门以及各种系统烧录问题分享

热门文章

  1. linux c语言学习_学习Linux是我们的爱情语言
  2. react+antd 引入moment之后,DatePicker显示出现英文
  3. 郑州-杰瑞鼠 / 滚动滤波算法
  4. Java web 中的 三层架构 - 刘耀的文章
  5. cortex-R52 CPU的功耗管理之power gating(电源门控)
  6. Java多线程异常抛出后的表现及捕获
  7. Python 正则表达式应用总结,如何找出全部匹配文本
  8. 全国大学生电子设计竞赛(六)--常用整流技术
  9. 使用POI+hutool导入Excel并把内容添加到数据库中,直接可以用!!!
  10. 杂项-公司:软银银行集团