2017-03-23 3 views
1

Hystrix Metrics Publisherプラグインを実装する方法を理解するのは少し苦労しています。hystrixでのカスタムメトリクスの発行者の仕事の理解

ドキュメンテーションを読んでも、どのように物事が一緒に働くことになっているかはまだ分かりません。

私の目標は、hystrixによって公開されたすべてのメトリックを収集し、これらのメトリックをディスク上のファイルに書き込むプラグインを作成することです。 このファイルは、後で外部ツールによって収集され、処理され、回路の動作および問題の歴史的な基礎がわかります。

ヒステリシスが動作しているシステムは、通常のスプリングアプリケーションです。これは、(私はJava言語に慣れていますが)私はまた、Javaプラットフォーム上で幾分新しいと述べた。

私は、プラグインの実装方法を理解するための第一歩は、既に実装されている出版社を見ていると思っていました。これを念頭に置いて、私はhystrix-contribディレクトリの実装のいくつかを調べました。

私はhystrix-codahale-metrics-publisherとhystrix-servo-metrics-publisherを選択しました。

両方とも、すべての可能な種類のメトリックと各種類のメトリックを処理するいくつかのクラスを受信するために登録するように見える主なクラス(servoはHystrixServoMetricsPublisher)を持っています。

メインクラスと呼ばれるものを調べると、たとえば、getMetricsPublisherForCommandというメソッドがあり、HystrixMetricsPublisherCommandインターフェイスの実装を返さなければならないことがわかります。

今の質問が起動します。

質問1を、私は一度プラグインがプラグインが登録されている文脈上のすべてのコマンドを実行するたびに登録され、ワー​​ドコマンドによって、我々は、実行のすべての実行を理解することができると仮定していますそのコンテキストでHistrixCommandから継承するすべてのクラスの()メソッドは、私のプラグインのgetMetricsPublisherForCommand()メソッドの呼び出しを生成します。本当ですか? もしそうなら、スレッドプールやその他のようなhystrixには低レベルの実装がたくさんあります。私のgetMetricsPublisherForCommand()の実装はスレッドセーフであるべきですか?または順番どおりに呼び出しを受け取ることが保証されていますか?私のgetMetricsPublisherForCommand()はどのスレッドで実行されますか?

質問2ドキュメントを見ることで、getMetricsPublisherForCommand()が返すHystrixMetricsPublisherCommandの実装が正確に何をするかについてはまだわかりません。これは、HystrixMetricsPublisherCommandインターフェイスがinitialize()というメソッドだけを指定しているためです。たとえばpublish()というメソッドを指定した場合、hystrixエンジンがカスタムgetMetricsPublisherForCommand()メソッドを呼び出して、カスタムパブリッシングを実行するpublish()メソッドを呼び出すメトリクスパブリッシャーを取得すると判断します。しかし、initialize()メソッドは、この指定されたオブジェクトが返されたときに一度だけ呼び出されるようになり、エンジンが後で呼び出すメソッドは見つけられません。また

は、ドキュメントを読んで、私はHystrixMetricsPublisherCommandの実装はgetMetricsPublisherForCommandによって返されたという印象の下で午前()は完全なものが動作するようになっている方法についての私の理解を壊しシングルトンは何とかなります。

ドキュメントはこれを言う:

initialize()メソッドは、このインスタンスは、外部サービスに登録することができることを示すためにonce-and-only-onceの呼び出されます、あなたが見ればなど

を出版メトリクスを開始しますしかし、私が完全にそして完全に混乱していない限り、出版物はコンストラクタから直接実行されることに注意してください。ここでinitialize()を呼び出して設定を行うと、オブジェクトがシングルトンでない限り、initialize()を含むメソッドが呼び出される前に実行されるコンストラクタから自分のロジックをコーディングできますか?一方、もしこれがシングルトンであれば、hystrixコマンドごとにどのようにコンストラクタを実行できますか?

私は何かを見逃しているかもしれませんが、わかりませんが、論理を正しく実装するために、ここで何が起こっているのかを概念的に理解する必要があります。あなたの忍耐力に感謝し、私はこの長い質問の中で自分自身を十分に明確にすることを願っています。

答えて

0

まず、1つの(簡潔な)質問形式にとどまることをお勧めします。

第2に、デフォルトのCodaHale(以前のDropWizard)実装(グラファナの消費のためにGraphiteリポジトリに公開する)などの既存の実装を使用することをお勧めします。

HystrixPlugins.reset(); 

    final WebApplicationContext springContext = 
      WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 

    HystrixPlugins plugins = HystrixPlugins.getInstance(); 

    plugins.registerCommandExecutionHook(...); 

    // Good idea to use properties to enable/disable metrics generally... 

    // Using Spring type example... 

    if (hystrixMetricsEnabled.get()) { 
     plugins.registerMetricsPublisher(new HystrixCodaHaleMetricsPublisher(
       getRegistry(springContext, sce.getServletContext()))); 

...

そうでない場合Hystrixのマニュアルおよび関連するクラスの完全なソースは、公的に利用可能である:

https://github.com/Netflix/Hystrix/wiki/Plugins#metricspublisher

関連する問題