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

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

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

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

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

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

在讨论这个问题之前,我想仔细检查一下“人群”的建议。 我已经描述了我们要做的事情,基本上是我们当前的行动计划 – 但我正在寻找关于如何最好地解决手头问题的任何和所有建议。

提前致谢。

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

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

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

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

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

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

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

有关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应用程序。

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

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

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

我将从测试是否使用EventLog来解决我的问题开始。 EventLog消息包含大量信息,您可以添加自己的消息。

对于某些诊断,我会看一下(自定义)性能计数器 。 我敢打赌,很难创造出能够超越Windows Performance Counters性能的东西。

重新写这篇文章可能不值得。

可能需要在事件查看器中创建特殊filter以获取您要查找的输出或跨计算机收集事件(您甚至可以编写自己的查看器)