Metrics.NET实践(1)
起因:对应用的监控和测量是WEB应用的一个重要话题,尤其在监控错误率,并发量,以及框架库中的动态值。于是,在性能优化的时候找到了metrics.net。
- 简介
- 开始使用
- 度量
- Gauges
- Counters
- Meters
- Histograms
- Timers
1. 簡介
- 項目主頁:https://github.com/etishor/Metrics.NET
- WIKI:https://github.com/etishor/Metrics.NET/wiki
- 可視化項目:https://github.com/etishor/Metrics.NET.FlotVisualization
- 可視化Demo:http://www.erata.net/Metrics.NET/demo/#/
- Java版地址:https://github.com/dropwizard/metrics
Metrics.NET - a .NET Port, with lots of additional functionality, of the awesome Java metrics library by Coda Hale.
2. Getting Started
Install-Package Metrics.NET
Install-Package Metrics.NET.ElasticSearch -Version 0.5.0 # with ES
Install-Package Metrics.NET.Graphite -Version 0.5.0 #with Graphite
other:
- Metrics.NET.RabbitMQ
- Metrics.NET.InfluxDB
- Metrics.NET.SignalFX
- Metrics.NET.InfluxDbReporting
- Metrics.NET.CloudWatch
Application_Start:
using Metrics;
Metric.Config
.WithHttpEndpoint("http://localhost:1234/")
.WithAllCounters();
访问:http://localhost:1234/ 即可看到效果。
3. 度量
- Meters record the rate at which an event occurs。某事件发生的比率
- Histograms measure the distribution of values in a stream of data。数据流的分布
- Timers keep a histogram of the duration of a type of event and a meter of the rate of its occurrence。Meters和Histograms的结合。
- Counters 64 bit integers that can be incremented or decremented。64位计数器
- Gauges instantaneous values。简单值
3.1 Gauges
最简单的度量方式。代表一个瞬时值。
代码片段:
// gauge from Func<double>
Metric.Gauge("MyValue", () => ComputeMagicValue(), Unit.Items);
// gauge that reads its value from a performance counter
Metric.PerformanceCounter("CPU Usage", "Processor", "% Processor Time",
"_Total", Unit.Custom("%"));
// gauge that transforms the value of another gauge
Metric.Advanced.Gauge("Kbytes gauge",
() => new DerivedGauge(gaugeReturningValueInBytes, v => v / 1024.0 ),
Unit.KiloBytes);
Metric.Context("[LogPool]").Gauge("dict.Count_Gauge",
() => { return dict.Count; }, Unit.Custom("個"), "log");
3.2 Counters
代表可以增減的64位整數。
代碼片段——緩存的數量
public class Cache
{
private static readonly Counter counter =
Metric.Counter("ItemsInCache", Unit.Items);
private void AddItems(object[] items)
{
counter.Increment(items.Length);
}
private void AddItem(object item)
{
counter.Increment();
}
private void RemoveItem(object item)
{
counter.Decrement();
}
}
Counter提供分组计数的能力,针对标记接口可以实现:
public class SetCounterSample
{
private readonly Counter commandCounter =
Metric.Counter("Command Counter", Unit.Custom("Commands"));
public interface Command { }
public class SendEmail : Command { }
public class ShipProduct : Command { }
public class BillCustomer : Command { }
public class MakeInvoice : Command { }
public class MarkAsPreffered : Command { }
public void Process(Command command)
{
this.commandCounter.Increment(command.GetType().Name);
// do actual command processing
}
}
输出:
Command Counter
Count = 2550 Commands
Total Items = 5
Item 0 = 20.90% 533 Commands [BillCustomer]
Item 1 = 19.22% 490 Commands [MakeInvoice]
Item 2 = 19.41% 495 Commands [MarkAsPreffered]
Item 3 = 20.98% 535 Commands [SendEmail]
Item 4 = 19.49% 497 Commands [ShipProduct]
应用场景:可以用在WEB API中统计各种请求的数量。
3.3 Meters
A meter measures the rate at which an event occurs.meter测量一个事件发生的比率。
示例代码:请求异常的比率
public class RequestProcessor
{
private readonly Meter meter =
Metric.Meter("Errors", Unit.Requests, TimeUnit.Seconds);
public void ProcessRequest()
{
try
{
// do actual processing
}
catch
{
meter.Mark(); // records an error
throw;
}
}
}
同样,也可以支持多态的分组:
public class SetMeterSample
{
private readonly Meter errorMeter = Metric.Meter("Errors", Unit.Errors);
public interface Command { }
public class SendEmail : Command { }
public class ShipProduct : Command { }
public class BillCustomer : Command { }
public class MakeInvoice : Command { }
public class MarkAsPreffered : Command { }
public void Process(Command command)
{
try
{
ActualCommandProcessing(command);
}
catch
{
errorMeter.Mark(command.GetType().Name);
}
}
}
输出:
Errors
Count = 450 Errors
Mean Value = 35.68 Errors/s
1 Minute Rate = 25.44 Errors/s
5 Minute Rate = 24.30 Errors/s
15 Minute Rate = 24.10 Errors/s
Total Items = 5
Item 0 = 19.56% 88 Errors [BillCustomer]
Count = 88 Errors
Mean Value = 6.98 Errors/s
1 Minute Rate = 6.05 Errors/s
5 Minute Rate = 6.01 Errors/s
15 Minute Rate = 6.00 Errors/s
Item 1 = 18.67% 84 Errors [MakeInvoice]
Count = 84 Errors
Mean Value = 6.66 Errors/s
1 Minute Rate = 4.23 Errors/s
5 Minute Rate = 3.89 Errors/s
15 Minute Rate = 3.83 Errors/s
Item 2 = 20.22% 91 Errors [MarkAsPreffered]
Count = 91 Errors
Mean Value = 7.22 Errors/s
1 Minute Rate = 5.38 Errors/s
5 Minute Rate = 5.24 Errors/s
15 Minute Rate = 5.21 Errors/s
Item 3 = 19.78% 89 Errors [SendEmail]
Count = 89 Errors
Mean Value = 7.06 Errors/s
1 Minute Rate = 4.92 Errors/s
5 Minute Rate = 4.67 Errors/s
15 Minute Rate = 4.62 Errors/s
Item 4 = 21.78% 98 Errors [ShipProduct]
Count = 98 Errors
Mean Value = 7.77 Errors/s
1 Minute Rate = 4.86 Errors/s
5 Minute Rate = 4.50 Errors/s
15 Minute Rate = 4.43 Errors/s
3.4 Histograms
代码片段:搜索结果的分布。
开箱即用的三种抽样方法:
- Exponentially Decaying Reservoir - 最近五分钟数据的分位数。
- Uniform Reservoir - 产生整个週期有效的分位数
- Sliding Window Reservoir - 产生代表过去N次测量的分位数
private readonly Histogram histogram = Metric.Histogram("Search Results", Unit.Items);
public void Search(string keyword)
{
var results = ActualSearch(keyword);
histogram.Update(results.Length);
}
// The histogram has the ability to track for which user value a Min, Max or Last Value has been recorded.
// The user value can be any string value (documentId, operationId, etc).
public class UserValueHistogramSample
{
private readonly Histogram histogram =
Metric.Histogram("Results", Unit.Items);
public void Process(string documentId)
{
var results = GetResultsForDocument(documentId);
this.histogram.Update(results.Length, documentId);
}
}
输出:
Results
Count = 90 Items
Last = 46.00 Items
Last User Value = document-3
Min = 2.00 Items
Min User Value = document-7
Max = 98.00 Items
Max User Value = document-4
Mean = 51.52 Items
StdDev = 30.55 Items
Median = 50.00 Items
75% <= 80.00 Items
95% <= 97.00 Items
98% <= 98.00 Items
99% <= 98.00 Items
99.9% <= 98.00 Items
3.5 Timers
示例代碼:
private readonly Timer timer =
Metric.Timer("HTTP Requests",Unit.Requests);
public void ProcessRequest()
{
using(timer.NewContext())
{
// Actual Processing of the request
}
}
private readonly Timer timer =
Metric.Timer("Requests", Unit.Requests);
public void Process(string documentId)
{
using (var context = timer.NewContext(documentId))
{
ActualProcessingOfTheRequest(documentId);
// if needed elapsed time is available in context.Elapsed
}
}
輸出:
Requests
Count = 14 Requests
Mean Value = 1.86 Requests/s
1 Minute Rate = 1.80 Requests/s
5 Minute Rate = 1.80 Requests/s
15 Minute Rate = 1.80 Requests/s
Count = 14 Requests
Last = 869.03 ms
Last User Value = document-1
Min = 59.90 ms
Min User Value = document-6
Max = 869.03 ms
Max User Value = document-1
Mean = 531.81 ms
StdDev = 212.98 ms
Median = 594.83 ms
75% <= 670.18 ms
95% <= 869.03 ms
98% <= 869.03 ms
99% <= 869.03 ms
99.9% <= 869.03 ms
Metrics.NET实践(1)的更多相关文章
- Metrics.Net实践(2)在WEB中应用度量
Gauges 可以画出Http Request执行时间的波形图: actionInfo表示MVC中的Action,即按照action类型来分组 Metric.Context(this.actionIn ...
- Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!
Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...
- metrics实践 (metrics-spring)
这里主要介绍metrics与spring集成的使用方式. 1 添加maven依赖 <dependency> <groupId>com.ryantenney.metrics&l ...
- 中小研发团队架构实践之应用监控Metrics
一.Metrics简介 应用监控系统Metrics由Metrics.NET+InfluxDB+Grafana组合而成,通过客户端Metrics.NET在业务代码中埋点,Metrics.N ...
- [实践] ubuntu下编译安装ambari
ambari是一个Hadoop套件的管理工具,可以方便部署.管理及监控.最初开发时使用的就是RH系的Linux,只支持RHEL.CentOS5/6.OEL.SLES,暂不支持Ubuntu:可我的需求就 ...
- Python机器学习库scikit-learn实践
原文:http://blog.csdn.net/zouxy09/article/details/48903179 一.概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得 ...
- 图形化Cisco设备管理实践(附安装配置视频)
图形化Cisco设备管理实践 Ciscoworks 2000是Cisco公司推出的基于SNMP协议的网络管理系统,通过它网络管理人员可以方便快捷地完成设备的配置.管理.监控和故障分析等任务, Cisc ...
- Spring cloud项目实践(一)
链接地址:http://sail-y.github.io/2016/03/21/Spring-cloud%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B5/ 什么是Spring ...
- Dropbox可伸缩性设计最佳实践分享
http://www.infoq.com/cn/news/2012/11/dropbox-scale-bestpractice Dropbox的运维工程师Rajiv,跟大家分享了可伸缩性设计的最佳实践 ...
随机推荐
- 结对项目-小学生四则运算系统(GUI)
Coding克隆地址:https://git.coding.net/FrrLolix/CalGUI.git 伙伴博客:http://www.cnblogs.com/wangyy39/p/8763244 ...
- 使用 java 实现一个简单的 markdown 语法解析器
1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (四) 树莓派单子节点查询
考虑到项目的实际需要,树莓派作为主机,应该只在需要的时候查询特定节点发送的数据,因此接收到数据后需要根据头部判断是否是自己需要的数据,如果不是继续接收数据,超过一定时间未查询到特定节点的数据,则退出程 ...
- windows下的C++ socket服务器(1)
windows下的一个C++ socket服务器,用到了C++11的相关内容,现在还不是很完善,以后会不断改进的! #include <winsock2.h>//1 以后会用这种方式对特定 ...
- mysubmail 短信报警
https://www.mysubmail.com/chs/documents/developer/YPWD84 文本文档 官网:www.mysubmail.com 操作流程:快速接入短信 AP ...
- 课堂alpha发布
项目组名:奋斗吧兄弟 今天七组对于各自项目现有的成果进行了alpha发布,下面是我的一些感想. 天天向上团队的连连看游戏: 令我印象最深的是天天向上团队的连连看项目,他们目前能展示给我们的是核心的连连 ...
- sublime很常用快捷方式演示
来自为知笔记(Wiz)
- pygame学习笔记(5)——精灵
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 据说在任天堂FC时代,精灵的作用相当巨大,可是那时候只知道怎么玩超级玛丽.魂斗罗,却对精灵一点也不知.pygame ...
- 如何实现MySQL表数据随机读取?从mysql表中读取随机数据
文章转自 http://blog.efbase.org/2006/10/16/244/如何实现MySQL表数据随机读取?从mysql表中读取随机数据?以前在群里讨论过这个问题,比较的有意思.mysql ...
- 计算机网络【6】—— 从浏览器输入URL到显示页面发生了什么
当在浏览器地址栏输入网址,如:www.baidu.com后浏览器是怎么把最终的页面呈现出来的呢?这个过程可以大致分为两个部分:网络通信和页面渲染. 一.网络通信 互联网内各网络设备间的通信都遵循TCP ...