14.6. MicroProfile Metrics

14.6.1. 概要

 MicroProfile Metrics 3.0(以降、Metrics と記載)は、マイクロサービスの さまざまなデータを定量化し、定量化したデータを管理しやすいように加工して 提供するための仕様です。

Health では主に、アプリケーションが正常かどうかを UP/DOWN で通知しますが、 Metrics では、Heal の健全性を判断するために役立ちます。 例えば、ディスク容量が制限なしに増加していく、といったケースにおいて Metrics は問題の発見を容易にします。

14.6.2. メトリクスのアーキテクチャ

Metrics ではメタデータの保管場所を提供する必要があり、次の 3 つのスコープとして定義されています。

14.6.2.1. REST エンドポイント

 ここでは、監視エージェントがメトリクスを受信するために使用する REST-API について説明します。 REST-API では、JSON フォーマットと OpenMetrics フォーマットをサポートしています。以下では、それぞれについて説明します。

JSON フォーマット

 JSON フォーマットを使用した場合、サブリソース用のサブツリーをツリー形式のデータフォーマットで GET リクエストに応答します。 データを含まないサーブツリーは省略されます。

JSON 形式の取得例:

            {
              "thread.count" : 33,
              "thread.max.count" : 47,
              "memory.maxHeap" : 3817863211,
              "memory.usedHeap" : 16859081,
              "memory.committedHeap" : 64703546
            }

OpenMetrics フォーマット

JSON フォーマットとは異なり、OPTIONS リクエストはサポートしません。

OpenMetrics 形式の取得例:

            # TYPE base_foo_val_seconds gauge
            # HELP base_foo_val_seconds The average duration of foo requests during last 5 minutes
            base_foo_val_seconds{app="webshop"} 12.345
            # TYPE base_bar_val_bytes gauge
            base_bar_val_bytes{component="backend", app="webshop"} 42000
14.6.2.2. スコープ

ここでは、WebOTX V11.1 でサポートしている base、vendor、application スコープについて説明します。

base(ベース)スコープ

bese(ベース)メトリクスは、全ての MicroProfile 準拠ベンダーが提供しなければならないメトリクスの一覧です。 base(ベース)メトリクスは「/metrics/base」で公開されます。

WebOTX V11.1 で提供している base スコープの一覧は以下の通りです。

名前 表示名 タイプ 単位 複数 説明 MBean
memory.usedHeap Used Heap Memory Gauge Bytes - ヒープメモリの使用量を表示する。 java.lang:type=memory/HeapMemoryUsage#used
memory.committedHeap Committed Heap Memory Gauge Bytes - Java 仮想マシンが使用するためにコミットされたメモリ量を表示する。 java.lang:type=Memory/HeapMemoryUsage#committed
memory.maxHeap Max Heap Memory Gauge Bytes - ヒープメモリの最大量を表示する。最大ヒープサイズが未定義の場合 -1 を表示する。 java.lang:type=Memory/HeapMemoryUsage#max
gc.total Garbage Collection Count Counter - True 発生したコレクションの総数を表示する。 このコレクタのコレクション数が未定義の場合は -1 を表示する。 java.lang:type=GarbageCollector,name=%s/CollectionCount
gc.time Garbage Collection Time Gauge ミリ秒 True コレクションのおおよその累積経過時間を表示する。 java.lang:type=GarbageCollector,name=%s/CollectionTime
jvm.uptime JVM Uptime Gauge ミリ秒 - 仮想マシンが開始してからの経過時間を表示する。 java.lang:type=Runtime/Uptime
thread.count Thread Count Counter - - デーモンスレッドと非デーモンスレッドの両方を含むライブスレッドの現在の数を表示する。 java.lang:type=Threading/ThreadCount
thread.daemon.count Daemon Thread Count Counter - - デーモンスレッドの現在の数を表示する。 java.lang:type=Threading/DaemonThreadCount
thread.max.count Peak Thread Count Counter - - Java 仮想マシンが開始されたか、もしくはピークがリセットされてからのピークライブスレッドの数を表示する。 これには、デーモンスレッドと非デーモンスレッドの両方が含まれる。 java.lang:type=Threading/PeakThreadCount
classloader.loadedClasses.count Current Loaded Class Count Counter - - Java 仮想マシンに現在ロードされているクラスの数を表示する。 java.lang:type=ClassLoading/LoadedClassCount
classloader.loadedClasses.total Total Loaded Class Count Counter - - Java 仮想マシンの実行が開始されてからロードされたクラスの総数を表示する。 java.lang:type=ClassLoading/TotalLoadedClassCount
classloader.unloadedClasses.total Total Unloaded Class Count Counter - - Java 仮想マシンの実行が開始されてからアンロードされたクラスの総数を表示する。 java.lang:type=ClassLoading/UnloadedClassCount
cpu.availableProcessors Available Processors Gauge - - Java 仮想マシンが使用できるプロセッサの数を表示する。 java.lang:type=OperatingSystem/AvailableProcessors
cpu.systemLoadAverage System Load Average Gauge - - 最後の 1 分間のシステム平均負荷を表示する。 システム負荷平均は、使用可能なプロセッサにキューイングされた実行可能エンティティの数と、 一定期間にわたって平均化された使用可能なプロセッサ上で実行されている実行可能 エンティティの数の合計です。 java.lang:type=OperatingSystem/SystemLoadAverage
vendor(ベンダー)スコープ

vendor(ベンダー)メトリクスは、MicroProfile 準拠ベンダーが独自に提供するメトリクスの一覧です。 vendor(ベンダー)メトリクスは「/metrics/vendor」で公開されます。

WebOTX V11.1 で既定値として提供している vendor スコープの一覧は以下の通りです。
既定値では出力していない、マシンのCPU情報(*1)、JavaVM(基本情報/プロセス毎のメモリ情報/GC情報/クラスロード情報/スレッド情報)(*1)、 アプリケーションのデータソース情報(*2)/リクエスト数情報(*3)/HTTPセッション情報(*4) を出力するように設定することが可能です。
これらの情報を有効にするには次の定義ファイルでコメントアウト(行頭が#)しているものを項目単位で有効にしてください。ドメインを再起動することで設定を反映します。
  ・{ドメインディレクトリ}/config/vendor-metrics.properties

(*1) 予め対応するJVMのモニタリングレベルをHIGHに設定しておく必要があります。
(*2) 予め対応するJDBCデータソースのモニタリングレベルをHIGHに設定しておく必要があります。
(*3) 予め対応するHTTPサービスのモニタリングレベルをHIGHに設定しておく必要があります。
(*4) 予め対応するWebコンテナのモニタリングレベルをHIGHに設定しておく必要があります。
  モニタリングレベルの変更については、構築・運用 > モニタリング > モニタリング情報の採取を参照してください。

名前 表示名 タイプ 単位 複数 説明 MBean
license.count Number of licenses Counter - - WebOTXに登録されたライセンス数を表示する。 amx:pp=/J2EEDomain[amx],type=J2EEServer,name=server,j2eeType=J2EEServer/LicenseCount
license.code Product code Gauge - - ライセンス登録されている製品コードを表示する。 amx:pp=/J2EEDomain[amx],type=J2EEServer,name=server,j2eeType=J2EEServer/LicenseCode
license.availableCores Available CPU Cores Gauge - - JavaVMが利用可能なCPUコア数を表示する。 amx:pp=/J2EEDomain[amx],type=J2EEServer,name=server,j2eeType=J2EEServer/AvailableCores
machine.os.availableProcessors Available Processors Number Counter - - Java 仮想マシンで使用可能なプロセッサーの数。このメソッドは、ランタイム.availableProcessors() メソッドと同等です。 java.lang:type=OperatingSystem/AvailableProcessors
machine.disk.totalDiskSpace Total capacity of the disk Gauge Bytes - ディスクの合計容量を表します。(単位: バイト) amx:pp=/mon/server-mon[server],type=domain-mon,name=domain/TotalDiskSpace#current
machine.disk.freeDiskSpace Free disk space Gauge Bytes - ディスクの空き領域の量を表します。(単位: バイト) amx:pp=/mon/server-mon[server],type=domain-mon,name=domain/FreeDiskSpace#current
machine.disk.usableFreeDiskSpace Available disk space Gauge Bytes - 使用可能ディスク空き容量(Byte)を表示する。 amx:pp=/mon/server-mon[server],type=domain-mon,name=domain/UsableFreeDiskSpace#current
machine.disk.diskUsedRate Disk usage Gauge - - ディスクの使用率を表します。(単位: %) amx:pp=/mon/server-mon[server],type=domain-mon,name=domain/DiskUsedRate#current
javaVm.memory.all.applicationServerPhysicalMemSize Physical memory Gauge Bytes - アプリケーション サーバーが使用する物理メモリの量を表します。(単位: キロバイト) amx:pp=/,type=J2EEDomain,j2eeType=J2EEDomain,name=amx/applicationServerPhysicalMemSize
javaVm.memory.all.applicationServerVirtualMemSize Virtual memory Gauge Bytes - アプリケーション サーバーが使用する仮想メモリの量を表します。(単位: キロバイト) amx:pp=/,type=J2EEDomain,j2eeType=J2EEDomain,name=amx/applicationServerVirtualMemSize
14.6.2.3. application(アプリケーション)スコープ

アプリケーション固有のメトリクスは、実行時にアプリケーションにより提供されるもので、サーバーに固定されるものではありません。 このスコープは「/metrics/application」で公開されます。

アプリケーションスコープで公開できる値は、アプリケーション上で以下のようにアノテーションを定義することで /metrics/application から取得できるようになります。

@Gauge(name = "queueSize")
public int getQueueSize() {
  return queueSize;
}

アプリケーション上で使用できるアノテーションは、以下のものです。

アプリケーション上で使用できるアノテーションの一覧
アノテーション 適用先 説明 デフォルトの単位
@Counted M, C, T アノテートされたオブジェクトの呼び出しをカウントするカウンターを示します。 なし
@Gauge M アノテートされたオブジェクトのサンプリングするゲージを示します。 ユーザーが提供する必要があります。
@Metered M, C, T アノテートされたオブジェクトの呼び出しを追跡するメーターを示します。 MetricUnits.PER_SECOND
@Metric M, F, P メトリクスをインジェクションするよう要求するアノテーションです。 このアノテーションは「メーター」「タイマー」「カウンター」「ヒストグラム」の各フィールドで使用できます。 なし
@Timed M, C, T アノテートされたオブジェクトの存続時間を追跡するタイマーを示します。 MetricUnits.NANOSECONDS

(C=コンストラクタ、F=フィールド、M=メソッド、P=パラメータ、T=タイプ)

14.6.2.4. フィールド

全てのアノテーションは、メタデータフィールドに対応する次のフィールドを持っています。

・String name オプション。メトリクスの名前を設定します。 もし、明示的に指定されていない場合は、アノテートされたオブジェクトの name が使用されます。
・boolean absolute オプション。メトリクスの名前を設定します。 true の場合、指定された name をメトリクスの絶対名として使用します。 False の場合、指定された名前の前にパッケージ名とクラスが付加されます。 既定値では、false です。
・String displayName オプション。メトリクスの表示名です。
・String description オプション。メトリクスの説明です。
・String unit メトリクスの単位。@Gauge では既定値はありません。 MetricsUnits クラスで事前定義された単位をチェックします。
・String[] tags オプション。 個別のタグをメトリクスに提供するための <key>=<value> 形式の文字列の配列です。
14.6.2.5. アノテーションの命名規則

アノテートされたメトリクスは、アプリケーションの MetricRegistry にアノテーションの名前と絶対フィールドに基づく名前で登録されます。

例:

package com.example;

import javax.inject.Inject;
import org.eclipse.microprofile.metrics.Counter;
import org.eclipse.microprofile.metrics.annotation.Metric;

public class Colours {

  @Inject
  @Metric
  Counter redCount;

  @Inject
  @Metric(name="blue")
  Counter blueCount;

  @Inject
  @Metric(absolute=true)
  Counter greenCount;

  @Inject
  @Metric(name="purple", absolute=true)
  Counter purpleCount;
}

上記の bean は、MetricRegistry で次のエントリを生成します。

      com.example.Colours.redCount
      com.example.Colours.blue
      greenCount
      purple
14.6.2.6. @MetricRegistry

 MetricRegistry は、メトリクスとメタデータのコレクションを保持するために使用されます。 スコープ(アプリケーション、ベース、ベンダー)毎に MetricRegistry の共有シングルトンが 1 つ存在します。 アプリケーションを使用してメトリクスを登録すると、アプリケーション MetricRegistry にアノテーションの名前と絶対フィールドに基づく名前で登録されます。

 また、インジェクトすると、@RegistryType は修飾子として使用され、アプリケーション、ベース、ベンダーレジストリの いずれかを選択的にインジェクトします。 修飾子を使用しない場合、返却される既定値の MetricRegistry はアプリケーションレジストリです。

アプリケーションタイプとなる MetricRegistry の指定方法

アプリケーションタイプとして、MetricRegistry を指定する場合は、以下のようにします。

      @Inject
      MetricRegistry metricRegistry;
      @Inject
      @RegistryType(type=MetricRegistry.Type.APPLICATION)
      MetricRegistry metricRegistry;

ベースタイプとなる MetricRegistry の指定方法

ベースタイプとして、MetricRegistry を指定する場合は、以下のようにします。

      @Inject
      @RegistryType(type=MetricRegistry.Type.BASE)
      MetricRegistry baseRegistry;

14.6.3. Metrics の MBean 設定項目

Metrics には以下の設定項目があります。設定の反映には、ドメインの再起動が必要です。

dotted-name(CLINAME) 説明 既定値
server.microprofile.microprofile-metrics.enabled /metrics を有効にするかどうかを設定します。true の場合は有効。false の場合は無効。 true
server.microprofile.microprofile-metrics.secure HTTPS でのみ /metrics を有効にするかどうかを設定します。true の場合は有効。false の場合は無効。 true