指標と管理

このセクションでは、Spring Integration のメトリクスをキャプチャーする方法について説明します。最近のバージョンでは、Micrometer(https://micrometer.io (英語) を参照)にさらに依存しており、将来のリリースでは Micrometer をさらに使用する予定です。

メトリクスキャプチャーの構成

バージョン 4.2 より前は、メトリクスは JMX が有効になっている場合にのみ使用可能でした。JMX サポートを参照してください。

MessageSourceMessageChannelMessageHandler メトリクスを有効にするには、<int:management/> Bean をアプリケーションコンテキスト(XML)に追加するか、@Configuration クラスの 1 つに @EnableIntegrationManagement (Java)でアノテーションを付けます。MessageSource インスタンスはカウントのみを維持し、MessageChannel インスタンスと MessageHandler インスタンスはカウントに加えて期間統計を維持します。この章で後述する MessageChannel メトリクス機能および MessageHandler メトリクス機能を参照してください。

これにより、アプリケーションコンテキストで IntegrationManagementConfigurer Bean が自動的に登録されます。このような Bean はコンテキストに 1 つだけ存在でき、<bean/> 定義を介して手動で登録する場合は、Bean 名を integrationManagementConfigurer に設定する必要があります。この Bean は、コンテキスト内のすべての Bean がインスタンス化された後、その構成を Bean に適用します。

メトリクスに加えて、メインメッセージフローでデバッグロギングを制御できます。非常に大量のアプリケーションでは、isDebugEnabled() の呼び出しでさえ、一部のロギングサブシステムでは非常に高負荷になる可能性があります。このオーバーヘッドを回避するために、このようなロギングをすべて無効にすることができます。例外ロギング(デバッグまたはその他)は、この設定の影響を受けません。

次のリストは、ロギングを制御するために使用可能なオプションを示しています。

<int:management
    default-logging-enabled="true" (1)
    default-counts-enabled="false" (2)
    default-stats-enabled="false" (3)
    counts-enabled-patterns="foo, !baz, ba*" (4)
    stats-enabled-patterns="fiz, buz" (5)
    metrics-factory="myMetricsFactory" /> (6)
@Configuration
@EnableIntegration
@EnableIntegrationManagement(
    defaultLoggingEnabled = "true", (1)
    defaultCountsEnabled = "false", (2)
    defaultStatsEnabled = "false", (3)
    countsEnabled = { "foo", "${count.patterns}" }, (4)
    statsEnabled = { "qux", "!*" }, (5)
    MetricsFactory = "myMetricsFactory") (6)
public static class ContextConfiguration {
...
}
1false に設定すると、ログシステムのカテゴリ設定に関係なく、メインメッセージフローのすべてのロギングが無効になります。デバッグログを有効にするには、"true" に設定します(ログサブシステムでも有効になっている場合)。Bean 定義で設定を明示的に構成していない場合にのみ適用されます。デフォルトは true です。
2<4> のパターンのいずれかに一致しないコンポーネントのカウントメトリクスを有効または無効にします。Bean 定義で設定を明示的に構成していない場合にのみ適用されます。デフォルトは false です。
3<5> のパターンのいずれかに一致しないコンポーネントの統計メトリクスを有効または無効にします。Bean 定義で設定を明示的に構成していない場合にのみ適用されます。デフォルトは "false" です。
4 カウントを有効にする必要がある Bean のパターンのコンマ区切りリスト。! でパターンを無効にすることができます。最初の一致(正または負)が勝ちます。まれに、! で始まる Bean 名がある場合、パターン内の ! をエスケープします。例: \!something は、!something という名前の Bean と完全に一致します。
5 統計メトリクスを有効にする必要がある Bean のパターンのコンマ区切りリスト。! で pattern \ を無効にすることができます。最初の一致(正または負)が勝ちます。まれに、! で始まる Bean 名がある場合、パターン内の ! をエスケープします。\!something は、!something という名前の Bean と確実に一致します。統計の収集は、カウントの収集を意味します。
6MetricsFactory への参照。メトリクスファクトリを参照してください。

実行時に、カウントと統計は、それぞれ MessageChannelMetricsMessageHandlerMetricsMessageSourceMetrics を返す getChannelMetricsgetHandlerMetricsgetSourceMetrics (すべて IntegrationManagementConfigurer クラスから)を呼び出すことによって取得できます。

これらのクラスの詳細については、Javadoc を参照してください。

JMX が有効な場合(JMX サポートを参照)、IntegrationMBeanExporter はこれらのメトリクスも公開します。

IMPORTANT: defaultLoggingEnableddefaultCountsEnableddefaultStatsEnabled は、Bean 定義で対応する設定を明示的に構成していない場合にのみ適用されます。

バージョン 5.0.2 以降、フレームワークは、アプリケーションコンテキストに単一の MetricsFactory Bean が存在するかどうかを自動的に検出し、存在する場合はデフォルトのメトリクスファクトリの代わりにそれを使用します。

これらのレガシーメトリクスは、以下で説明する Micrometer メトリクスを推奨して非推奨となりました。レガシーメトリクスのサポートは、将来のリリースで削除される予定です。

Micrometer 統合

バージョン 5.0.3 以降、アプリケーションコンテキストに Micrometer (英語)  MeterRegistry が存在すると、組み込みメトリクスに加えて Micrometer メトリクスのサポートがトリガーされます(従来の組み込みメトリクスは将来のリリースで削除されることに注意してください)。

Micrometer は、バージョン 5.0.2 で最初にサポートされましたが、バージョン 5.0.3 で Micrometer Meters に変更が加えられ、次元システムでの使用により適したものになりました。5.0.4 ではさらに変更が加えられました。Micrometer を使用する場合、5.0.4 の変更の一部が API の変更を壊していたため、最小限のバージョン 5.0.4 をお勧めします。

Micrometer を使用するには、MeterRegistry Bean の 1 つをアプリケーションコンテキストに追加します。IntegrationManagementConfigurer は、MeterRegistry Bean を 1 つだけ検出した場合、integrationMicrometerMetricsCaptor という名前で MicrometerMetricsCaptor Bean を構成します。

MessageHandler および MessageChannel ごとに、タイマーが登録されます。MessageSource ごとに、カウンターが登録されます。

これは、AbstractMessageHandlerAbstractMessageChannelAbstractMessageSource を継承するオブジェクトにのみ適用されます(ほとんどのフレームワークコンポーネントに当てはまります)。

Micrometer メトリクスでは、統計のキャプチャーは Micrometer に委譲されるため、statsEnabled フラグは効果がありません。countsEnabled フラグは、各メッセージを処理するときに Micrometer Meter インスタンスを更新するかどうかを制御します。

メッセージチャネルの送信操作用の Timer メーターには、次の名前またはタグがあります。

  • namespring.integration.send

  • tagtype:channel

  • tagname:<componentName>

  • tagresult:(success|failure)

  • tagexception:(none|exception simple class name)

  • descriptionSend processing time

none 例外を含む failure 結果は、チャネルの send() 操作が false を返したことを意味します)

ポーリング可能なメッセージチャネルでの受信操作用の Counter メーターには、次の名前またはタグがあります。

  • namespring.integration.receive

  • tagtype:channel

  • tagname:<componentName>

  • tagresult:(success|failure)

  • tagexception:(none|exception simple class name)

  • descriptionMessages received

メッセージハンドラーの操作用の Timer メーターには、次の名前またはタグがあります。

  • namespring.integration.send

  • tagtype:handler

  • tagname:<componentName>

  • tagresult:(success|failure)

  • tagexception:(none|exception simple class name)

  • descriptionSend processing time

メッセージソースの Counter メーターには、次の名前 / タグがあります。

  • namespring.integration.receive

  • tagtype:source

  • tagname:<componentName>

  • tagresult:success

  • tagexception:none

  • descriptionMessages received

さらに、3 つの Gauge メーターがあります。

  • spring.integration.channels: アプリケーション内の MessageChannels の数。

  • spring.integration.handlers: アプリケーション内の MessageHandlers の数。

  • spring.integration.sources: アプリケーション内の MessageSources の数。

MicrometerMetricsCaptor のサブクラスを提供することにより、統合コンポーネントによって作成された Meters の名前とタグをカスタマイズできます。MicrometerCustomMetricsTests [GitHub] (英語) テストケースは、その方法の簡単な例を示しています。ビルダーサブクラスの build() メソッドをオーバーロードすることにより、メーターをさらにカスタマイズすることもできます。

MessageChannel メトリクス機能

これらのレガシーメトリクスは、将来のリリースで削除される予定です。Micrometer 統合を参照してください。

メッセージチャネルは、具象型に従ってメトリクスをレポートします。DirectChannel を見ている場合、送信操作の統計が表示されます。QueueChannel の場合、受信操作の統計と、この QueueChannel によって現在バッファリングされているメッセージの数も表示されます。どちらの場合も、一部のメトリクスは単純なカウンター(メッセージカウントとエラーカウント)であり、一部は興味深い量の平均の推定値です。これらの推定値の計算に使用されるアルゴリズムについて、次の表で簡単に説明します。

表 1: MessageChannel メトリクス
メトリクス型 サンプル アルゴリズム

カウント

送信数

シンプルなインクリメンター。イベントが発生すると 1 ずつ増加します。

エラー数

エラーカウントの送信

シンプルなインクリメンター。送信でエラーが発生すると、1 ずつ増加します。

持続時間

送信時間 (ミリ秒単位のメソッド実行時間)

減衰係数を伴う指数移動平均(デフォルトでは 10)。ほぼ最後の 10 回(デフォルト)の測定でのメソッド実行時間の平均。

レート

送信レート (1 秒あたりの操作数)

時間の減衰があるイベント間の間隔の指数移動平均の逆数(デフォルトでは 60 秒以上経過)および測定ごと(デフォルトでは最後の 10 イベント)。

エラー率

エラー率を送信 (1 秒あたりのエラー数)

時間の減衰を伴うエラーイベント(デフォルトでは 60 秒以上)と測定単位(デフォルトでは最後の 10 イベント)の間隔の指数移動平均の逆数。

比率

成功率を送信 (合計送信に対する成功の比率)

値で構成される系列の指数移動平均として成功率を推定します(成功の場合は 1、失敗の場合は 0、デフォルトでは時間とイベントに伴うレート測定に従って減衰します)。エラー率は次のとおりです。1- 成功率。

MessageHandler メトリクス機能

これらのレガシーメトリクスは、将来のリリースで削除される予定です。Micrometer 統合を参照してください。

次の表は、メッセージハンドラーについて維持される統計を示しています。一部のメトリクスは単純なカウンター(メッセージカウントとエラーカウント)であり、1 つは送信期間の平均の推定値です。これらの推定値の計算に使用されるアルゴリズムについて、次の表で簡単に説明します。

表 2: MessageHandlerMetrics
メトリクス型 サンプル アルゴリズム

カウント

ハンドル数

シンプルなインクリメンター。イベントが発生すると 1 ずつ増加します。

エラー数

ハンドラーのエラー数

シンプルなインクリメンター。呼び出しでエラーが発生すると、1 ずつ増加します。

アクティブカウント

ハンドラーのアクティブカウント

現在ハンドラー(または任意のダウンストリーム同期フロー)を呼び出している現在アクティブなスレッドの数を示します。

持続時間

処理時間 (ミリ秒単位のメソッド実行時間)

減衰係数を伴う指数移動平均(デフォルトでは 10)。およそ最後の 10 回(デフォルト)の測定でのメソッド実行時間の平均。

時間ベースの平均推定

時間ベースの平均推定値の特徴は、新しい測定値が到着しなければ時間とともに減衰することです。経時的な動作の解釈に役立つように、最後の測定からの時間(秒単位)もメトリクスとして公開されます。

2 つの基本的な指数モデルがあります: 測定ごとの減衰(期間と測定回数がメトリクスの一部である場合に適切)および時間単位ごとの減衰(測定間の時間がメトリクスの一部であるレート測定により適しています)。両方のモデルは、w(i) = r^i が r=constantS(n) = x(n) + r S(n-1) の場合、S(n) = sum(i=0,i=n) w(i) x(i) が特別な形式を持っているという事実に依存します(したがって、S(n-1) (シリーズ x(i) 全体ではなく)のみを保存して、最後の測定から新しいメトリクス推定値を生成します)。期間メトリクスで使用されるアルゴリズムは、r=exp(-1/M) と M=10 を使用します。最終的な影響は、推定値 S(n) が最近の測定値により大きく重み付けされ、おおよそ最後の M 測定値で構成されることです。M は推定の「ウィンドウ」または失効率です。バニラ移動平均の場合、i は測定回数のカウンターです。レートについては、i を経過時間または経過時間とカウンターの組み合わせとして解釈します(したがって、メトリクス推定値には、最後の M 測定値と最後の T 秒からのおおよそのコントリビュートが含まれます)。

メトリクスファクトリ

MessageChannel インスタンスおよび MessageHandler インスタンスにカスタムチャネルメトリクスを提供できるように、戦略インターフェース MetricsFactory が導入されました。デフォルトでは、DefaultMetricsFactory は MessageChannelMetrics と MessageHandlerMetrics のデフォルト実装を提供し、先に説明しました。デフォルトの MetricsFactory をオーバーライドするには、MetricsFactory Bean インスタンスへの参照を提供して、前述のように構成します。次のセクションで説明するように、デフォルトの実装をカスタマイズするか、AbstractMessageChannelMetrics または AbstractMessageHandlerMetrics を継承してまったく異なる実装を提供できます。

Micrometer 統合も参照してください。

前述のデフォルトのメトリクスファクトリに加えて、フレームワークは AggregatingMetricsFactory を提供します。このファクトリは、AggregatingMessageChannelMetrics および AggregatingMessageHandlerMetrics インスタンスを作成します。非常に大容量のシナリオでは、統計をキャプチャーするコストが非常に高くなる可能性があります(システムに 2 回呼び出して、各メッセージのデータを保存する時間)。集約メトリクスは、メッセージのサンプル全体のレスポンス時間を集約します。これにより、CPU 時間を大幅に節約できます。

メッセージがバーストで到着した場合、統計が歪む可能性があります。これらのメトリクスは、高一定のメッセージレートで使用することを目的としています。

次の例は、集約メトリクスファクトリを定義する方法を示しています。

<bean id="aggregatingMetricsFactory"
            class="org.springframework.integration.support.management.AggregatingMetricsFactory">
    <constructor-arg value="1000" /> <!-- sample size -->
</bean>

上記の構成では、1000 メッセージを超える期間が集約されます。カウント(送信およびエラー)はメッセージごとに維持されますが、統計はメッセージ 1000 個ごとです。

デフォルトのチャネルおよびハンドラー統計のカスタマイズ

これらの値の詳細については、ExponentialMovingAverage* クラスの時間ベースの平均推定および Javadoc を参照してください。

デフォルトでは、DefaultMessageChannelMetrics および DefaultMessageHandlerMetrics は、10 回の測定の「ウィンドウ」、1 秒のレート期間(1 秒あたりの平均レート)、1 分の減衰経過期間を使用します。

これらのデフォルトをオーバーライドする場合は、適切に構成されたメトリクスを返すカスタム MetricsFactory を提供し、前述のように MBean エクスポーターでそれへの参照を提供できます。

次の例は、その方法を示しています。

public static class CustomMetrics implements MetricsFactory {

    @Override
    public AbstractMessageChannelMetrics createChannelMetrics(String name) {
        return new DefaultMessageChannelMetrics(name,
                new ExponentialMovingAverage(20, 1000000.),
                new ExponentialMovingAverageRate(2000, 120000, 30, true),
                new ExponentialMovingAverageRatio(130000, 40, true),
                new ExponentialMovingAverageRate(3000, 140000, 50, true));
    }

    @Override
    public AbstractMessageHandlerMetrics createHandlerMetrics(String name) {
        return new DefaultMessageHandlerMetrics(name, new ExponentialMovingAverage(20, 1000000.));
    }

}
高度なカスタマイズ

前述のカスタマイズは大規模であり、MBean エクスポーターによってエクスポートされるすべての適切な Bean に適用されます。これは、XML 構成を使用するときに利用できるカスタマイズの範囲です。

AbstractMessageChannel および AbstractMessageHandler で configureMetrics メソッドを呼び出すことにより、Java @Configuration を使用して、または実行時にプログラムで(アプリケーションコンテキストがリフレッシュされた後)個別の Bean に異なる実装を提供できます。

パフォーマンスの改善

以前は、時間ベースのメトリクス(時間ベースの平均推定を参照)はリアルタイムで計算されていました。代わりに、取得時に統計が計算されるようになりました。これにより、統計ごとに少量のメモリが追加されますが、パフォーマンスが大幅に向上しました。前述のように、Lifecycle メソッドの呼び出しを許可する MBean を保持したまま、統計を完全に無効にすることができます。