在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析。在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对外提供了多少次服务,这些服务的响应时间是多少,随时间变化的情况是什么样的,系统出错的频率是多少。这些动态的准实时信息对于监控整个系统的运行健康状况来说很重要。
一些应用程序,比如对外提供接口或者服务的WebService,对整个系统的实时运行情况进行监控显得尤为重要,着就像我们操作系统里面的资源管理器一样,如果能够实时或者准实时的看到整个系统耗费的CPU,内存等资源,对我们快速对系统做出响应,以及优化很重要。并且,这些实时的性能参数信息,对于一些高级应用场景,比如服务的熔断机制(需要实时统计系统出错比例和响应时间),只有做到了实时监控才能提供这些数据,才能实现这种提高系统稳健性的功能。
前几天在InfoQ的一篇采访文章中看到一句话 “Profiling特别重要。如果能有一个特别强大的Profiling系统,就知道整个系统在哪个地方,哪台机器上,花了多少CPU、内存、磁盘IO或者网络带宽等资源,才能知道优化什么地方效益最大。”
同样,对于WebService的监控,比如在那个地方,那台机器上,花了多少CPU,多少内存,每一个服务的响应时间,出错的次数频率等,这些信息记录下来之后,我们就可以看到服务在运行时的动态的表现,更加容易找出错误或者定位问题点来进行优化。
最简单的做法是,在应用系统的关键地方,或者所有程序的入口,出口进行埋点,然后将这些采样信息不断的发送到某一个消息队列或者内存DB中,然后其他系统进行读取分析和展示。
在Java中有一个开源的名为Metrics的项目,它能够捕获JVM以及应用层面的性能参数,他的作者Coda Hale介绍了什么是Mertics并且为什么Metrics在应用程序系统中很有必要,视频和演讲可以分别到YouTube和SlideShare上可以下载。在.NET中有对其进行移植的项目叫 Metrics.NET。
在开始介绍Metric之前,需要先看看一些基本的度量器类型,以及常见的使用场景,才能知道如何使用。
一 度量类型
Metrics提供5种基本的度量类型:Gauges, Counters, Histograms, Meters和 Timers
Gauge
Gauge是最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。
比如,我们类型为Gauge的计数器来记录某个服务目前开通的城市个数
Metric.Gauge("Service Cities Count", () => Cities.Count, new Unit("个"));
Counters
Counter是一个简单64位的计数器,他可以增加和减少。
比如我们可以定义两个Counter类型的计数器,用来统计所有服务请求数目,和目前正在处理的请求总数。
/// <summary> /// keep the total count of the requests /// </summary> private readonly Counter totalRequestsCounter = Metric.Counter("Requests", Unit.Requests); /// <summary> /// count the current concurrent requests /// </summary> private readonly Counter concurrentRequestsCounter = Metric.Counter("SampleMetrics.ConcurrentRequests", Unit.Requests);
这样,在我们请求处理开始的时候,同时将这两个计数器自增。
this.concurrentRequestsCounter.Increment(); // increment concurrent requests counter this.totalRequestsCounter.Increment(); // increment total requests counter
当某一个请求处理完成之后,将目前正在处理的请求减一
this.concurrentRequestsCounter.Decrement(); // decrement number of concurrent requests
这种计数器也可以用来统计诸如当前有多少人在线,或者服务器中有多少处于有效期内的session
Meters
Meter是一种只能自增的计数器,通常用来度量一系列事件发生的比率。他提供了平均速率,以及指数平滑平均速率,以及采样后的1分钟,5分钟,15分钟速率。
比如需要统计请求的速率,比如统计平均每分钟内有多少次请求进来。只需要定义一个metric
/// <summary> /// measure the rate at which requests come in /// </summary> private readonly Meter meter = Metric.Meter("Requests", Unit.Requests,TimeUnit.Seconds);
在处理请求的地方,调用Mark方法即可。
this.meter.Mark(); // signal a new request to the meter
再比如,要测量服务出错的概率,比如每小时出错多少次。可以定义一个metric。
/// <summary> /// measure the rate of service exception /// </summary> private readonly Meter errorMeter = Metric.Meter("Error", Unit.Errors, TimeUnit.Hours);
这样,在处理请求的时候,如果出现异常了,调用一下errorMeter的Mark方法即可。
this.errorMeter.Mark();// signal a new error to the meter
Histograms
Histrogram是用来度量流数据中Value的分布情况,Histrogram可以计算最大/小值、平均值,方差,分位数(如中位数,或者95th分位数),如75%,90%,98%,99%的数据在哪个范围内。
比如,我们想度量,所有传进来服务的请求参数的长度分布。那么,可以定义一个histogram。
/// <summary> /// keep a histogram of the input data of our request method /// </summary> private readonly Histogram histogramOfData = Metric.Histogram("ResultsExample", Unit.Items);
然后在请求的地方,调用其Update方法来更新值。
this.histogramOfData.Update(request.length, methodName); // update the histogram with the input data
Timer
Timer是Histogram跟Meter的一个组合,比如要统计当前请求的速率和处理时间。
就可以定义一个Timer:
/// <summary> /// measure the time rate and duration of requests /// </summary> private readonly Timer timer = Metric.Timer("Requests", Unit.Requests);
在使用的时候,调用timer的NewContext即可。
using (this.timer.NewContext(i.ToString())) // measure until disposed { ... }
二 度量数据的输出
收集了这么多数据之后,我们需要把数据时实的动态展示或者保存起来。Metric提供了多种的数据报告接口。包括自带的Metrics.NET.FlotVisualization, 以及输出到专业的系统监控Graphite,输出到开源,分布式,时间序列的中InfluxDB,或者输出到ElasticSearch中。配置起来也非常简单。比如如果要直接在http页面上展现,只需要在初始化的时候,设置合适的EndPoint即可:
Metric.Config .WithHttpEndpoint("http://localhost:1234/metrics/") .WithAllCounters() .WithInternalMetrics() .WithReporting(config => config .WithConsoleReport(TimeSpan.FromSeconds(30))
然后在浏览器中输入 http://localhost:1234/metrics/,就可以看到各种采集的准实时各种度量信息:
上面自带的性能DashBoard略显简陋。 通常,我们一般会将这些实时采集的数据存储到分布式时序数据库InfluxDB中,然后利用开源的图表控件Grafana来实时展现这些数据,比如,可以制作想下面这样的,动态的性能准实时监控系统:
三 总结
本文介绍了如何使用埋点和各种度量工具来实时监测应用程序的性能,介绍了.NET中Metrics度量工具的使用。与传统的记录日志的方式不同,这种实时或者准实时的对当前系统各种关键指标的采样和监控,对于应用程序的运维,性能优化,提供了一种动态的视角,能帮助我们更好的了解当前应用程序或者服务在线上的各种性能参数和表现状态。Metrics的采样应该尽量减少对原有系统的侵入性,所以一般的最好是将采样的结果存储到消息队列或者内存DB中,然后进行动态展示,另外采样频率也是需要考虑的一个重要因素。因为对于一个较大的系统来说,实时采样产生的数据量会比较大。InfluxDB 似乎只能在非Windows平台使用,所以本文没有完整演示整个Metrics+InfluxDB+Grafana 构建应用程序实时监控系统的搭建。不过相信大家对照着相关文档,应该不难实现。
希望本文对您了解如何实时监控应用程序性能,以及如何构建应用程序性能参数dashboard有所帮助。
四 参考资料
- http://www.infoq.com/cn/articles/interview-alibaba-zhaohaiping
- https://github.com/etishor/Metrics.NET
- http://www.cnblogs.com/shanyou/p/4004711.html
- http://influxdb.com/
- http://grafana.org/
- http://xiaorui.cc/tag/influxdb/
http://www.cnblogs.com/yangecnu/p/Using-Metrics-to-Profiling-WebService-Performance.html
相关推荐
AppMetrics 是一个强大的开源库,专为 .NET 开发者设计,用于在跨平台环境中记录、度量和报告应用程序的性能指标。这个库的核心目标是提供一个统一的接口,使得开发者能够轻松地监控和理解他们的应用程序在运行时的...
它可以对应用程序的性能、可用性和安全性进行监控和报警。 5. 和 Zabbix 的对比 Prometheus 和 Zabbix 都是流行的监控系统,但是它们有着不同的设计理念和实现方式。Prometheus 采用 pull 模式采集数据,而 Zabbix...
Java监控应用实例是一种用于观察和分析Java应用程序运行时性能、资源使用情况以及可能出现的问题的工具。在Java开发中,理解如何构建这样的应用是至关重要的,因为它可以帮助开发者优化代码,提高程序效率,及时发现...
在现代Web应用开发中,监控系统性能、跟踪服务状态以及分析应用程序的运行情况变得至关重要。Metrics3.0作为一个强大的度量库,为开发者提供了丰富的工具来量化应用程序的行为。而将Metrics3.0与SpringMVC框架集成,...
3. **应用程序自定义Metrics**:应用程序可以使用自定义Metrics API或其他支持Prometheus格式的库来报告其特定的业务逻辑指标。 Metrics Server是另一个在Kubernetes中用于收集Pod和Node资源使用情况的重要组件,它...
这个源码版本是2.2.0,对于理解其内部工作原理、自定义报告或优化应用程序性能非常有帮助。以下是对yammer metrics-2.2.0源码的一些关键知识点的详细解释: 1. **Metrics体系结构**:yammer metrics的核心设计理念...
总之,Dropwizard Metrics 3.1.3是一个强大的工具,它提供了全面的度量和监控解决方案,有助于开发者更好地理解和优化他们的Java应用程序。通过深入研究其组件、配置和使用案例,你可以在项目中充分利用它的潜力,...
kube-state-metrics是一个无状态的应用程序,它定期观察Kubernetes API服务器并生成度量,这些度量反映了集群的状态,如Pods、Services、Deployments、ReplicaSets、Nodes等的状态。生成的度量数据以Prometheus格式...
总结来说,Laravel Metrics是Laravel 5中一个强大的工具,它为开发者提供了一套完整的框架来监控和优化应用程序的性能。通过正确地配置和使用,开发者可以更好地理解他们的应用程序,并根据收集到的度量数据做出数据...
2. 初始化库:在应用程序的初始化阶段调用Battery Metrics的初始化方法,设置必要的监听器和回调函数。 3. 监听电池状态变化:通过注册监听器,当电池状态发生改变时,接收通知并处理相应的数据。 4. 数据分析:...
标签中的"metrics"指的是应用程序的度量或性能指标,这些指标可以用来评估系统的健康状况、性能瓶颈和资源利用率。"测量"与之相关,强调了收集和分析这些数据的重要性。而"datax"再次确认了我们讨论的是DataX项目。...
Metrics,通常译作“度量”或“指标”,是用于衡量系统、服务或应用程序性能的数据点。这些数据可以是计数器(如访问次数)、计时器(如响应时间)或者是其他类型的数值(如错误率)。通过收集和分析Metrics,可以更...
通过上述介绍,我们可以看出WAS性能监控不仅涵盖了应用程序本身的监控,还涉及到了前端Web服务器以及底层系统的监控。这些监控手段相辅相成,共同构成了一个全面的监控体系。具体来说: - **PMI** 和 **TPV** 为...
使用PerfMon插件进行性能测试时,需在JMeter的测试计划中添加“jp@gc - PerfMon Metrics Collector”监听器。配置包括目标服务器的IP地址、ServerAgent的端口号以及想要监控的性能指标。运行测试后,JMeter将展示...
metrics-core-3.1.0.jar 是一个专注于此类任务的Java库,它提供了丰富的度量功能,帮助开发者深入理解应用程序的运行状态,从而优化性能、定位问题。本文将深入探讨metrics-core-3.1.0.jar的主要特性和使用场景。 ...
总结来说,"metrics-reporter.zip"提供的解决方案是将Java Metrics框架与Prometheus监控系统紧密结合,让开发者能够轻松地获取和分析应用程序的运行时数据。这对于优化系统性能、调试问题和确保服务稳定性至关重要。...
这个工具对于监控和优化Web应用程序的性能至关重要,尤其是在大型项目中。现在我们来深入探讨一下Laravel Metrics的主要特点和使用方法。 1. **安装与配置** 要在你的Laravel项目中安装Laravel Metrics,首先需要...
总之,Metrics.NET是一个强大的工具,它提供了全面的.NET应用程序监控能力,可以帮助开发者确保代码质量、提高应用性能,并在问题发生时迅速定位。无论你是.NET开发新手还是经验丰富的开发者,都值得在你的工具箱中...
5. **API Gateway**:PiggyMetrics使用Zuul作为API Gateway,负责请求的路由转发和过滤,为外部提供统一的入口,同时也可实现权限验证、监控等功能。 6. **配置中心**:利用Spring Cloud Config来实现集中式的配置...
这个库通常包括配置文件、API接口和可能的示例代码,以便用户能够将Metrics的功能与Logback相结合,实时监控应用程序的日志活动。 【描述】"scis-ad.zip" 是Hudson(现在称为Jenkins)的一个插件,即"Sun ...