我们希望收集有关我们(例如80%WinApp)应用程序的性能数据,包括开发人员内部以及客户站点。我们的目标如下:
理想情况下,它还可以在站点范围内或逐个用户的基础上进行相对配置来控制:
我们一直在计划基本上编写自己的系统来完成大部分工作。然后我们将看一些不同的“持久性”模型,包括“性能数据包”的二进制格式化,XmlSerialization和已经成为.NET框架一部分的跟踪日志记录功能,仅举几例。
在参与此之前,我想仔细检查以查看“人群”的建议。我已经描述了我们要做的事情,基本上是我们当前的行动计划 - 但我正在寻找关于如何最好地解决手头问题的任何和所有建议。
提前致谢。
答案 0 :(得分:17)
看看Metrics.NET,一个应该涵盖大部分需求的相对较新的项目。它是Java的“指标”项目的一个端口。
(2016年3月新增:)经过长时间的不更新后,Metrics.NET项目已转移给新人。
答案 1 :(得分:7)
你可以看看在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:
它提供了许多技术的性能监控(从ASP.NET到SQL Server再到Solr)。但是,它确实需要在后台运行代理进程(Windows上的服务)来处理对您的监视,这可能是也可能不是您的选项。它或多或少都适用于Web服务器,可能不太适合监视客户端WPF应用程序。
答案 2 :(得分:6)
按照你的计划,我采取这种方法:
您可能还想考虑编写自己的锁类。不要使用lock(blah)
或Monitor.Enter(blah)
,而是在您自己的一次性类中包装Monitor.Enter / Exit,记录您必须等待多长时间才能进入锁定状态。
答案 3 :(得分:1)
我首先要测试using the EventLog是否可以解决我的问题。 EventLog消息包含大量信息,您可以添加自己的消息。
对于某些诊断,我会看一下(custom) Performance Counters。我敢打赌,很难创造出能够超越Windows Performance Counters性能的东西。
重新写这篇文章可能不值得。
可能需要在事件查看器中创建特殊过滤器以获取您要查找的输出或跨计算机收集事件(您甚至可以编写自己的查看器)