2012-08-04 23 views
13

開発者の内部でも、顧客のサイトでも、私たちの(80%WinApp)アプリケーションに関するパフォーマンスデータを収集したいと考えています。.NETアプリケーションのパフォーマンス監視/メトリック

  • それはそれは我々のアプリ間でのイベントの多くの異なる種類を数える追跡/タイミング&を可能にしなければならない
  • 軽量である必要があり、非常速い
  • 次のようになります。私たちの目標は次のとおりです。
  • ドメイン、コンピュータ名、ユーザー、OS、メモリなどのかなりの量のデータを(効率的に)収集できるはずです
  • 収集されたすべてのデータは分析可能です(一度社内に送信されるとBIデータベース)を作成します。

また、理想的には、サイト全体または制御するため、ユーザごとに比較的設定可能になります。これらのパフォーマンス・メトリックがさえ

  • を収集する場合は収集するために、どのように冗長に

    • それら
    • 我々は、本質的に目のほとんどを行うため、当社独自のシステムを書くことを計画している

    私達に戻って結果を報告するかどうか

  • です。次に、「パフォーマンスパケット」のバイナリフォーマット、XmlSerialization、および.NETフレームワークの一部であるトレースロギング機能など、さまざまな「パーシスタンス」モデルを検討しています。

    しかし、これに参加する前に、私は「群衆」が何を示唆しているかを再確認したいと考えました。私たちが何をしようとしているのか、本質的に現在の行動計画について説明しましたが、私はを探しています。の問題を最も適切に解決する方法を提案しています。

    ありがとうございます。

  • 答えて

    6

    私はこのアプローチを取ると思いますあなたの計画で行く:あなたはログファイルにすべてのパフォーマンスデータを書き込みするつもり

    1. 。 log4netやnlogのような高速のC#ログライブラリを使用してください。これらのフレームワークは、必要に応じてバイナリアペンダをサポートします。
    2. 利用可能なRAM、CPUなどの書き込みを開始する
    3. PostSharpのようなアスペクトインジェクタを使用して、アプリケーションのすべての(インラインではない)メソッドにタイマーを自動的に追加します。ストップウォッチクラスは、大きなパフォーマンスヒットはしません。これを設定可能にするには、アスペクトインジェクタがメソッドの推定優先度に従ってログレベルを変更します(または独自の属性を使用して指定します)。
    4. 終了時(または開始時)にユーザーに記録したパフォーマンスデータをWebサーバーに送信するように要求します。
    5. 途中でデータをジップします。

    独自のロッククラスの作成を検討することもできます。 lock(blah)またはMonitor.Enter(blah)を使用する代わりに、自分の使い捨てクラスでMonitor.Enter/Exitをラップして、ロックを入力するまでの時間を記録します。

    1

    using the EventLogで問題が解決するかどうかをテストすることから始めます。 EventLogメッセージには多くの情報が含まれており、自分で追加することができます。

    いくつかの診断については、(custom) Performance Countersをご覧ください。私の賭けは、Windowsパフォーマンスカウンターのパフォーマンスを上回るものを作るのは難しいということです。

    これをもう一度書くことはそれほど価値がないかもしれません。

    あなたが探しているの出力を得るために、またはコンピュータ間でイベントを収集するために、イベントビューアに特殊なフィルタを作成する必要があります(あなたも独自のビューアを書くかもしれません)

    15

    Metrics.NETを見てください、Aこれらのニーズの大部分をカバーする比較的新しいプロジェクトです。これはJavaのメトリクスプロジェクトのポートです。

    (追加日:2016年3月)Metrics.NETプロジェクトは、長期間の更新がないと新しい人に移管されました。あなたがStatsDの上に何かを構築を見てみることができ

    +0

    2つのメトリックドットネットパッケージがあります。1)https://github.com/danielcrenna/metrics-net 2)https://github.com/etishor/Metrics。どちらが参照されていますか? – BozoJoe

    +0

    元のポスターはdanielcrennaのポスターを参照してください(リンクを確認してください)。しかし、danielcrennaプロジェクトが積極的に維持されていないため、etishorプロジェクトが作成されました。 – Quango

    7

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

    .NETパッケージはそのためにありますがここで見つけることができます:

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

    それはのような軽量ですそれは基本的には、リモートサーバへのUDPパケットを発射しているだけです。そのリモートサーバーはそれを集約し、Graphiteに格納します。このGraphiteは、このデータを取得してグラフに変換し、データ保持のようなものを管理します。分析のために、GraphiteはJSON(基本的にはメトリックを2倍の配列に変換する)としてデータを出力することもできます。また、記録されたメトリックに適用できる多くの関数とフィルタがあります。

    はグラファイトで可能であるもののいくつかの例は、ここを参照してください:

    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上のサービス)が必要です。 Webサーバーにとっては多かれ少なかれ、クライアント側のWPFアプリケーションを監視するのにはあまり適していないでしょう。

    関連する問題