1. 概要

Spectatorは、次元時系列バックエンドシステムのコードをインストルメント化してデータを収集するためのライブラリです。 Spectatorは、さまざまなメトリック収集のためにNetflixで作成され、対応するバックエンドシステムは主にAtlasです。

このチュートリアルでは、Spectatorが提供するものと、それを使用してメトリックを収集する方法を学習します。

2. Mavenの依存関係

実際の実装に飛び込む前に、Spectator依存関係をpom.xmlファイルに追加しましょう。

<dependency>
    <groupId>com.netflix.spectator</groupId>
    <artifactId>spectator-api</artifactId>
    <version>1.0.11</version>
</dependency>

spectator-apiはコアスペクテイターライブラリです。

3. レジストリメーター、および指標の基本

このライブラリをさらに掘り下げる前に、まずレジストリ、メーター、、およびメトリックの基本を理解する必要があります。

  • レジストリは、メーターのセットを維持する場所です
  • Meter は、 Counter、Timer、Gauge、など、アプリケーションに関する一連の測定値を収集するために使用されます。
  • 指標は、メーター、に表示される個々の測定値です。たとえば、カウント、期間、最大、平均などです。

これらをさらに詳しく調べて、Spectatorライブラリでどのように使用されているかを理解しましょう。

4. レジストリ

Spectatorライブラリには、インターフェイスとして Registry が付属しており、DefaultRegistryやNoopRegistryなどの実装が組み込まれています。 要件に応じて、カスタムRegistry実装を作成することもできます。

Registryの実装は次のように使用できます。

Registry registry = new DefaultRegistry();

5. メーター

Meter には、主にアクティブとパッシブの2つのタイプがあります。

5.1. アクティブメーター

これらのメーターは、イベントの発生を測定するために使用されます。 このようなメーターには3つのタイプがあります。

5.2. パッシブメーター

これらのメーターは、必要に応じてメトリックの値を取得するために使用されます。 たとえば、実行中のスレッドの数は、測定したいメトリックである可能性があります。 そのようなメーターの1つのタイプ、ゲージがあります。

次に、これらのさまざまなタイプのメーターについて詳しく見ていきましょう。

6. カウンター

これらのメーターは、イベントが発生する速度を測定します。 たとえば、要素がリストに挿入またはリストから削除される割合を測定するとします。

最初に、初期化時にRegistryオブジェクトにカウンターを登録しましょう。

insertCounter = registry.counter("list.insert.count");
removeCounter = registry.counter("list.remove.count");

ここでは、依存性注入を使用して、ユーザーが任意のRegistry実装を使用できるようにすることができます。

これで、 Counter メーターをインクリメントまたはデクリメントして、リストに追加したり、リストから削除したりできます。

requestList.add(element);
insertCounter.increment();

requestList.remove(0);
removeCounter.increment();

このようにして、2つのメーターを生成し、後で、メトリックをAtlasにプッシュして視覚化することができます。

7. タイマー

これらのメーターは、あるイベントに費やされた時間を測定します。 Spectatorは、次の2種類のタイマーをサポートしています。

7.1. タイマー

これらのタイマーは、主に短期間のイベントを測定するために使用されます。 したがって、通常、イベントの完了後に費やされた時間を測定します。

まず、このメーターをRegistryに登録する必要があります。

requestLatency = registry.timer("app.request.latency");

次に、 Timerrecord()メソッドを呼び出して、リクエストの処理に費やされた時間を測定できます。

requestLatency.record(() -> handleRequest(input));

7.2. LongTaskTimer

これらのタイマーは、主に長時間実行されるタスクの期間を測定するために使用されます。 したがって、イベントが進行中の場合でも、これらのタイマーを照会できます。 これもゲージの一種です。イベントの進行中は、durationactiveTasksなどの指標を確認できます。

繰り返しますが、最初のステップとして、このメーターを登録する必要があります。

refreshDuration = LongTaskTimer.get(registry, registry.createId("metadata.refreshDuration"));

次に、 LongTaskTimer を使用して、実行時間の長いタスクの測定を開始および停止できます。

long taskId = refreshDuration.start();
try {
    Thread.sleep(input);
    return "Done";
} catch (InterruptedException e) {
    e.printStackTrace();
    throw e;
} finally {
    refreshDuration.stop(taskId);
}

8. ゲージ

前に説明したように、ゲージはパッシブメーターです。 したがって、これらは実行中のタスクの任意の時点でサンプリングされる値を提供します。 したがって、たとえば、JVMで実行中のスレッドの数や、任意の時点でのヒープメモリ使用量を知りたい場合に使用します。

ゲージには2つのタイプがあります。

  • ポーリングゲージ
  • アクティブゲージ

8.1. ポーリングゲージ

このタイプのゲージは、実行中のタスクの値をバックグラウンドでポーリングします。 監視するタスクにフックを作成します。 したがって、このゲージの値を更新する必要はありません。

次に、このゲージを使用してリストのサイズを監視する方法を見てみましょう。

PolledMeter.using(registry)
  .withName("list.size")
  .monitorValue(listSize);

ここで、 PolledMeter は、 monitorValue()メソッドを使用してlistSizeでバックグラウンドポーリングを許可するクラスです。 さらに、 listSize は、サンプルリストのサイズを追跡する変数です。

8.2. アクティブゲージ

このタイプのゲージでは、監視タスクの更新に関して、値を定期的に手動で更新する必要があります。 アクティブゲージの使用例を次に示します

gauge = registry.gauge("list.size");

まず、このゲージをレジストリに登録します。 次に、リストからの要素の追加または削除時に手動で更新します。

list.add(element);
gauge.set(listSize);
list.remove(0);
gauge.set(listSize);

9. DistributionSummary

次に、DistributionSummaryと呼ばれる別のメーターを調べます。イベントの分布を追跡します。 このメーターは、リクエストペイロードのサイズを測定できます。 たとえば、DistributionSummaryを使用してリクエストのサイズを測定します。

まず、いつものように、このメーターをRegistryに登録します。

distributionSummary = registry.distributionSummary("app.request.size");

これで、 Timer と同様にこのメーターを使用して、リクエストのサイズを記録できます。

distributionSummary.record((long) input.length());
handleRequest();

10. 観客対。 サーボ対。 マイクロメータ

Servo は、さまざまなコードメトリックを測定するためのライブラリでもあります。 スペクテイターは、Netflixによって構築されたServoの後継です。 Spectatorは当初Java8向けにリリースされましたが、将来のサポートの観点からは、より優れたオプションです。

これらのNetflixライブラリは、さまざまな指標を測定するために市場で利用できるさまざまなオプションの1つです。 いつでも個別に使用することも、マイクロメータのようなファサードを使用することもできます。 マイクロメータを使用すると、ユーザーはライブラリを測定するさまざまなメトリックを簡単に切り替えることができます。 したがって、さまざまなバックエンド監視システムを選択することもできます。

11. 結論

この記事では、メトリクス測定用のNetflixのライブラリであるSpectatorを紹介しました。 また、さまざまなアクティブメーターとパッシブメーターの使用法についても調査しました。 計測されたデータを時系列データベースAtlasにプッシュして公開できます。

いつものように、この記事の完全な実装コードは、GitHubにあります。