17

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

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

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

  • 如果甚至收集到这些性能指标
  • 收集它们的详细程度
  • 是否将结果报告给我们

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

不过,在参与此之前,我想仔细检查一下“人群”提出的建议。我已经描述了我们正在尝试做的事情,以及我们目前的行动计划——但我正在寻找关于如何最好地解决手头问题的任何和所有建议。

提前致谢。

4

4 回答 4

18

看看Metrics.NET,这是一个相对较新的项目,应该可以满足大部分这些需求。它是 Java 的“度量”项目的一个端口。

(2016 年 3 月添加:) Metrics.NET 项目在长时间没有更新后已转移给新人。

于 2014-02-05T19:48:09.320 回答
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”将是其他一些数据库中的一个条目,该数据库存储 client567 在 Windows 7 上使用 IE11,例如。

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

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

http://newrelic.com/

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

于 2014-02-06T04:27:11.527 回答
6

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

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

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

于 2012-08-04T05:12:38.487 回答
1

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

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

重新写一遍可能不值得。

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

于 2012-08-04T08:30:15.600 回答