一、Metrics简介

       应用监控系统MetricsMetrics.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这两种度量类型目前可以完全满足笔者所在公司的度量需求,所以,下面只介绍了Meter和Histogram这两种,另外3个若有兴趣可自行抽空去了解。

二、埋点Metrics.NET的方法

首先为需要收集Metrics.NET监控数据的业务项目引用Metrics.dll。
然后,在项目中的App.config/Web.config文件中加上如下配置信息:
 <add key="AppID" value="150106"/>
<add key="Metrics.DBUri" value="http://139.198.13.12:4126/write"/>
<add key="Metrics.UserName" value="Arch"/>
<add key="Metrics.Password" value="Arch"/>
<add key="Metrics.Database" value="ArchDB"/>

1、Meter

Meter用于度量TPS(每秒处理的请求数)。
示例:模拟统计成功下单量、下单金额、失败下单量。
调用Meter对象的Mark()方法: 
 static void CreateOrder()
{
try
{
// 省略关于下单的业务逻辑代码
//...... // 分别统计成功下单量和下单金额,统一写到MetrisKey中
MetricsKey.OrderCount.Mark();
if (n % == )
{
MetricsKey.OrderMoneyCount.Mark("BuyerA", n);
}
else
{
MetricsKey.OrderMoneyCount.Mark("BuyerB", n);
}
}
catch (Exception)
{
// 统计失败下单量,统一写到MetrisKey中
MetricsKey.OrderErrorCount.Mark(); // 省略异常处理代码......
}
}

、Histogram

Histogram用于度量流数据中Value的分布情况,它不仅使您能像Meter一样测量出TPS ,还能测量出最小值、最大值和平均值。使用场景如:统计服务器的延迟时间、统计某方法共执行多长时间。
示例:模拟统计航班查询引擎方法的耗时情况。
调用Histogram对象的Update()方法: 
 private readonly Histogram searchFlightTime = MetricsHelper.Histogram("MetricsDemo.SearchFlightTime", Unit.Custom("ms"));

 static void SearchFlight()
{
Stopwatch stopwatch = Stopwatch.StartNew(); // 模拟关于航班查询的业务逻辑的代码
Random random = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
var n = Random.Next();
Thread.Sleep(n); stopwatch.Stop(); // 统计航班搜索耗时
searchFlightTime.Update(stopwatch.ElapsedMilliseconds);
}

三、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下载及更多资料

中小研发团队架构实践之应用监控Metrics的更多相关文章

  1. 中小型研发团队架构实践:分布式协调服务ZooKeeper

    一.ZooKeeper 是什么 Apache ZooKeeper 由 Apache Hadoop 的子项目发展而来,于 2010 年 11 月正式成为了 Apache 的顶级项目. 相关厂商内容 优秀 ...

  2. 中小型研发团队架构实践:任务调度Job

    一.Job 简介 Job 类似于数据库中的作业,多用于实现定时执行任务.适用场景主要包括定时轮询数据库同步.定时处理数据.定时邮件通知等. 我们的 Job 分为操作系统级别定时任务 WinJob 和 ...

  3. 中小型研发团队架构实践:Redis快速入门及应用

    Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...

  4. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  5. 中小研发团队架构实践之RabbitMQ快速入门及应用

    原文:中小研发团队架构实践之RabbitMQ快速入门及应用 使用过分布式中间件的人都知道,程序员使用起来并不复杂,常用的客户端API就那么几个,比我们日常编写程序时用到的API要少得多.但是分布式中间 ...

  6. 中小研发团队架构实践之分布式协调器.Net版ZooKeeper

    原文:中小研发团队架构实践之分布式协调器.Net版ZooKeeper 一.ZooKeeper是什么  Apache ZooKeeper是由Apache Hadoop的子项目发展而来,于2010年11月 ...

  7. 中小型研发团队架构实践六:如何用好消息队列RabbitMQ?

    一.写在前面 使用过分布式中间件的人都知道,程序员使用起来并不复杂,常用的客户端 API 就那么几个,比我们日常编写程序时用到的 API 要少得多.但是分布式中间件在中小研发团队中使用得并不多,为什么 ...

  8. 中小研发团队架构实践之微服务MSA

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

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

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

随机推荐

  1. vue学习笔记(三)——目录结构介绍

    1.初始目录结构如下: 2.目录结构介绍 目录/文件 说明 build 最终发布的代码存放位置. config 配置目录,包括端口号等.我们初学可以使用默认的. node_modules npm 加载 ...

  2. Abp.NHibernate连接PostgreSQl数据库

    Abp.NHibernate动态库连接PostgreSQl数据库 初次接触Abp框架,其框架中封装的操作各类数据的方法还是很好用的,本人还在进一步的学习当中,并将利用abp.NHibernate类库操 ...

  3. 一个不可思议的MySQL慢查分析与解决

    转自:http://fordba.com/optimize-an-amazing-mysql-slowlog.html?hmsr=toutiao.io&utm_medium=toutiao.i ...

  4. Django 初识

    Django  初识 一.前言 Django是一款网站架构,能够快速的搭建一个网站.openstack的界面显示使用的就是Django的框架.所以,学习openstack多少要了解一些Django的内 ...

  5. 微信跳一跳的mini辅助设计

    前一段考试没时间写东西,就迟到补发一波,继电器触发触屏,arduino处理数据就行了,B站很多人做,我也来一个,个人测试数据增益为2.1左右,即  延时=距离X2.1x10 void setup() ...

  6. JSTL遇到的问题

    1.jstl 中不可以用关键字命名 例如class new. 2.jstl取值的问题 如果jstl通过对象.属性取值 属性值中包括特殊字符(例如:31/20180131195356867.txt&qu ...

  7. nginx服务器的作用与简单搭建(windows)

    Nginx是一款开源代码的反向代理服务器. 何为反向代理呢?即以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连 ...

  8. zabbix邮件发送3.2.4

    使用邮件服务发送,一般linux有两种发送方式 mail跟sendmail两款软件,我试验的时候总是会发生发送不了邮件的问题 简而便之,我两款软件都安装了,只要安装其中之一就ok了 #yum -y i ...

  9. AutoCAD开发选择----ObjectARX还是.net API(转载)

    本文基于AutoCAD 2006新推出的.NET API为工具,介绍了在.NET平台下对AutoCAD进行二次开发的技术,并与目前常用的VBA.ObjectARX作了对比.同时讨论了如何弥补.NET ...

  10. php之冒泡排序

    <?php//冒泡排序function shell_sort($arr){for($i=0;$i<count($arr)-1;$i++){for($j=0; $j< count($a ...