zoukankan      html  css  js  c++  java
  • 中小研发团队架构实践之应用监控Metrics

    一、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文件中加上如下配置信息:
    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 }

    2Histogram

     

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

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/dotnet-arch-system/p/8469693.html
Copyright © 2011-2022 走看看