2012-08-04 64 views
13

我们希望收集有关我们(比如说80%WinApp)应用程序的性能数据,无论是在开发者内部还是在客户站点。我们的目标如下:.NET应用程序中的性能监控/指标

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

它也会,理想情况下,可以在站点范围或用户通过用户基础相对配置来控制:如果这些性能指标甚至收集

  • 如何冗长收集

    • 他们
    • 不管报告结果反馈给我们

    我们已经规划基本上写我们自己的系统做最次的是。然后,我们正在研究许多不同的“持久性”模型,包括“性能数据包”的二进制格式化,XmlSerialization和已经属于.NET框架的Trace Logging功能等等。

    在进行此操作之前,我想仔细检查一下“人群”提出的建议。我已经描述了我们正在尝试做什么,基本上是我们目前的行动计划 - 但我正在寻找任何以及所有关于如何最好地解决手头问题的建议。

    在此先感谢。

  • 回答

    6

    你的计划去我会采取这种做法:

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

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

    1

    我会从测试using the EventLog是否能解决我的问题开始。 EventLog消息包含大量信息,您可以添加自己的信息。我想看看(custom) Performance Counters。我敢打赌,很难创造出能够击败Windows性能计数器性能的东西。

    重新写这个可能不值得。

    这可能需要在事件查看器创建特殊的过滤器,让你正在寻找或收集跨计算机事件(你甚至可以编写自己的浏览器)

    15

    Metrics.NET看一看输出,一应该涵盖大部分这些需求的相对较新的项目。它是Java'度量'项目的一个端口。

    (2016年3月增加:) Metrics.NET项目经过很长一段时间没有更新之后已经转移给新人。

    +0

    有两个公制的dotnet软件包1)https://github.com/danielcrenna/metrics-net 2)https://github.com/etishor/Metrics。NET哪一个被提到? – BozoJoe 2015-10-02 20:33:02

    +0

    原始海报是指danielcrenna一(检查链接)。然而,etishor项目的创建是因为danielcrenna项目没有得到积极维护。 – Quango 2015-11-09 11:28:19

    7

    你可以看看上StatsD之上构建的东西:

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

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

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

    它是轻量级的它基本上只是将UDP数据包发送到远程服务器。然后,该远程服务器将其聚合并将其存储在Graphite中,该服务器擅长将这些数据转化为图形,并管理诸如数据保留等事情。为了进行分析,Graphite还允许您将数据输出为JSON(基本上可以将您的指标转换为双精度数组),并且具有许多函数和过滤器,您可以将它们应用于记录的指标,然后再将它们输入到其他系统中。

    在这里看到了什么是可能与石墨一些例子:

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

    它不符合然而您的所有要求,如能够记录约像计算机名称在客户端的数据。但是,您可以通过在指标名称中使用名称空间来实现该目标;所以你可以使用诸如“client567.orders.loadtime”这样的键来记录你的指标,并且例如,“client567”将是存储该客户端577在Windows 7上使用IE11的某个其他数据库中的条目。

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

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

    http://newrelic.com/

    它配备了性能监控进行了大量的技术(从ASP.NET到SQL Server到Solr)。然而,它需要在后台运行的代理进程(Windows上的一项服务)来处理您的监控,这可能或可能不是您的选择。它或多或少意味着Web服务器,并可能不太适合监视客户端WPF应用程序。