.NET应用程序中的性能监控/指标

eej*_*i42 16 c# performance

我们希望收集有关我们(例如80%WinApp)应用程序的性能数据,包括开发人员内部以及客户站点.我们的目标如下:

  • 它应该非常
  • 它应该是轻量级的
  • 它应该允许跟踪/计时和计算我们的应用程序中的许多不同类型的事件.
  • 它应该能够(有效地)收集相当数量的数据,例如域,计算机名,用户,操作系统,内存等.
  • 收集的所有数据应该是可分析的(一旦传输到我们的内部BI数据库),就可以跨上述所有维度进行分析.

理想情况下,它还可以在站点范围或逐个用户的基础上进行相对配置,以控制:

  • 如果甚至收集了这些性能指标
  • 如何冗长地收集它们
  • 是否将结果报告给我们

我们一直在计划基本上编写自己的系统来完成大部分工作.然后,我们将看到许多不同的"持久性"模型,包括"性能数据包"的二进制格式化,XmlSerialization和已经是.NET框架一部分的跟踪日志记录功能,仅举几例.

在参与此之前,我想仔细检查一下"人群"的建议.我已经描述了我们要做的事情,基本上是我们当前的行动计划 - 但我正在寻找有关如何最好地解决手头问题的任何和所有建议.

提前致谢.

War*_*mak 17

看看Metrics.NET,这是一个相对较新的项目,应该涵盖大部分这些需求.它是Java的"指标"项目的一个端口.

(2016年3月添加:)经过长时间的无更新后,Metrics.NET项目已转移给新用户.

  • 从Metrics.Net演变而来的新库,现在支持.Net核心https://github.com/AppMetrics/AppMetrics和该项目的网站:https://www.app-metrics.io (3认同)

Jul*_*anR 8

你可以看看在StatsD之上构建一些东西:

https://github.com/etsy/statsd/

有一个.NET包可以在这里找到:

https://github.com/robbihun/NStatsD.Client

它很轻巧,因为它基本上只是将UDP数据包发送到远程服务器.然后,该远程服务器将其聚合并将其存储在Graphite中,Graphite擅长获取这些数据并将其转换为图形,并为您管理数据保留等内容.对于分析,Graphite还允许您将数据输出为JSON(基本上将您的指标转换为双精度数组),并且具有许多功能和过滤器,您可以将这些功能和过滤器应用于记录的指标,然后您可以将这些指标提供给其他系统.

有关Graphite可能实现的一些示例,请参见此处:

http://matt.aimonetti.net/posts/2013/06/26/practical-guide-to-graphite-monitoring

但它并不能满足您的所有要求,例如能够记录有关客户端的数据,如计算机名称.但是,您可以通过在指标名称中使用命名空间来实现该目标; 因此,您将使用"client567.orders.loadtime"等密钥记录您的指标,而"client567"将是存储该客户端567在Windows 7上使用IE11的其他数据库中的条目.

所以它不是一个完整的开箱即用的解决方案,但它构成了我认为的一个很好的基础.

另一种选择是使用NewRelic等商业平台:

http://newrelic.com/

它为许多技术(从ASP.NET到SQL Server到Solr)提供性能监控.但是,它确实需要在后台运行代理进程(Windows上的服务)来处理对您的监视,这可能是也可能不是您的选项.它或多或少适用于Web服务器,可能不太适合监视客户端WPF应用程序.


Bra*_*non 6

按照你的计划我采取这种方法:

  1. 您将把所有性能数据写入日志文件.使用其中一个快速的C#日志库,如log4net或nlog.如有必要,这些框架支持二进制appender.
  2. 当应用程序开始写入可用的RAM,CPU等
  3. 使用像PostSharp这样的方面注入器可以自动为应用程序中的每个(非内联)方法添加计时器.秒表课程不会对性能产生重大影响.为了使这个可配置,方面注入器根据方法的估计优先级更改日志级别(或使用您自己的属性来指定).
  4. 提示用户退出(或开始)将记录的性能数据发送到您的网络服务器.
  5. 在出路时拉出数据.

您可能还想考虑编写自己的锁类.而不是使用lock(blah)或者Monitor.Enter(blah)在您自己的一次性类中包装Monitor.Enter/Exit,记录您必须等待多长时间才能进入锁定状态.