.NET应用程序中的性能监控/度量

17

我们希望收集有关我们的应用程序(假设为80%的WinApp)的性能数据,无论是在内部开发中还是在客户现场。 我们的目标如下:

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

理想情况下,它还应该相对可配置,在站点范围或用户范围内控制以下内容:

  • 是否甚至收集这些性能指标
  • 如何详细收集它们
  • 是否向我们报告结果

我们一直计划编写自己的系统来完成大部分工作。 然后,我们正在查看许多不同的“持久性”模型,包括“性能数据包”的二进制格式,XmlSerialization以及已经成为.NET框架一部分的Trace Logging功能,这只是其中的一些。

然而,在着手进行此操作之前,我想再次确认看看“人群”建议什么。 我已经描述了我们要做的事情以及我们目前的行动计划 - 但我正在寻找有关如何最好解决手头问题的任何和所有建议。

提前致谢。

4个回答

18

请看一下 Metrics.NET,这是一个相对较新的项目,应该可以满足大部分需求。它是Java中“metrics”项目的移植版本。

(2026年3月更新:) Metrics.NET项目在长期没有更新后已被转让给新的人。


有两个Metric dotnet包,1)https://github.com/danielcrenna/metrics-net 2)https://github.com/etishor/Metrics.NET,指的是哪一个? - BozoJoe
1
原帖提到了danielcrenna的项目(请查看链接)。然而,etishor项目是因为danielcrenna项目没有得到积极维护而创建的。 - Quango
3
一个新的图书馆起源于Metrics.Net,现在支持 .Net core。 https://github.com/AppMetrics/AppMetrics ,该项目的网站为:https://www.app-metrics.io - Gerrie Pretorius

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使用IE11在Windows 7上的其他数据库中的条目,例如。因此,它不是一个完整的开箱即用的解决方案,但我认为它是一个很好的基础。

另一个选择是使用商业平台,例如NewRelic:

http://newrelic.com/

它提供了许多技术的性能监控(从ASP.NET到SQL Server到Solr)。但是,它需要在后台运行一个代理进程(Windows上的服务),以处理为您进行监视,这可能或可能不是您的选择。它更多地针对Web服务器,并且可能不太适合监视客户端WPF应用程序。

6
按照你的计划,我会采取以下方法:
  1. 将所有性能数据写入日志文件。使用像log4net或nlog这样的快速C#日志库。如果需要,这些框架支持二进制附加器。
  2. 当应用程序启动时,记录可用的RAM、CPU等信息。
  3. 使用类似PostSharp的方面注入器自动为应用程序中的每个(非内联)方法添加一个计时器。Stopwatch类不会对性能造成显著影响。为了使其可配置,让方面注入器根据方法的估计优先级改变日志级别(或使用您自己的属性指定)。
  4. 在退出(或启动)时提示用户将记录的性能数据发送到您的Web服务器。
  5. 在发送数据时进行压缩。

您还可以考虑编写自己的锁类。不要使用lock(blah)或Monitor.Enter(blah),而是将Monitor.Enter/Exit封装在自己的可处置类中,记录等待进入锁的时间。


1

我会先测试一下是否可以通过使用EventLog来解决我的问题。EventLog消息包含了大量的信息,而且你还可以添加自己的信息。

对于一些诊断工作,我会看一下(自定义)性能计数器。我敢打赌,很难创建出比Windows性能计数器更好的东西。

重新编写这些内容可能并不值得。

可能需要在事件查看器中创建特殊的过滤器,以获取你所需的输出或者收集跨计算机的事件(你甚至可以编写自己的查看器)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接