第104章 メトリクス
メトリクスコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.14 から利用可能
metrics: コンポーネントを使用すると、Camel ルートからさまざまなメトリクスを直接収集できます。サポートされるメトリックタイプは、カウンター、ヒストグラム、メーター、タイマー です。メトリクス を使用すると、アプリケーションの動作を測定するための簡単な方法が提供されます。設定可能なレポートバックエンドは、統計を収集し、視覚化するためのさまざまな統合オプションを有効にします。コンポーネントは、
MetricsRoutePolicyFactory も提供します。これにより、codehale メトリクスを使用してルート統計を公開できます。詳細は、ページ下部を参照してください。
Maven ユーザーは、このコンポーネントの以下の依存関係を
pom.xml に追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-metrics</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
metrics:[ meter | counter | histogram | timer ]:metricname[?options]
metric Registry リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel Metrics Component はデフォルトで
MetricRegistry を使用し、Slf4jReporter と 60 秒のレポート間隔を使用します。デフォルトレジストリーは、Camel レジストリーで metricRegistry という名前の Bean を提供することで、カスタムレジストリーに置き換えることができます。たとえば、Spring Java Configuration を使用します。
@Configuration
public static class MyConfig extends SingleRouteCamelConfiguration {
@Bean
@Override
public RouteBuilder route() {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// define Camel routes here
}
};
}
@Bean(name = MetricsComponent.METRIC_REGISTRY_NAME)
public MetricRegistry getMetricRegistry() {
MetricRegistry registry = ...;
return registry;
}
}
警告
MetricRegistry レポートに内部スレッドを使用します。バージョン 3.0.1 には、ユーザーが終了時にクリーンアップするパブリック API はありません。そのため、Camel Metrics Component を使用すると、Java クラ出力ダーがリークし、OutOfMemoryErrors が発生する可能性があります。
使用方法 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
URI で定義されたメトリクス名は、ヘッダーと名前
CamelMetricsName を使用して上書きできます。
以下に例を示します。
from("direct:in")
.setHeader(MetricsConstants.HEADER_METRIC_NAME, constant("new.name"))
.to("metrics:counter:name.not.used")
.to("direct:out");
name.not.used ではなく、new.name という名前のカウンターを更新します。
Metrics エンドポイントがエクスチェンジの処理を終了すると、Metrics 固有のヘッダーはすべてメッセージから削除されます。エクスチェンジのエンドポイントの処理中に、Metrics エンドポイントはすべての例外をキャッチし、レベル
warn を使用してログエントリーを書き込みます。
メトリクスタイプのカウンター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
metrics:counter:metricname[?options]
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト
|
説明
|
|
Increment
|
-
|
カウンターに追加する長い値
|
|
decrement
|
-
|
カウンターから減算する長い値
|
increment または decrement が定義されていない場合、カウンター値は 1 つずつ増えます。increment と decrement の両方が定義されている場合は、インクリメント操作のみが呼び出されます。
// update counter simple.counter by 7
from("direct:in")
.to("metric:counter:simple.counter?increment=7")
.to("direct:out");
// increment counter simple.counter by 1
from("direct:in")
.to("metric:counter:simple.counter")
.to("direct:out");
// decrement counter simple.counter by 3
from("direct:in")
.to("metric:counter:simple.counter?decrement=3")
.to("direct:out");
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージヘッダーは、Metrics コンポーネント URI で指定される
increment および decrement の値を上書きするために使用できます。
|
名前
|
説明
|
想定されるタイプ
|
|
CamelMetricsCounterIncrement
|
URI のインクリメント値を上書きします。
|
Long
|
|
CamelMetricsCounterDecrement
|
URI のデクリメント値の上書き
|
Long
|
// update counter simple.counter by 417
from("direct:in")
.setHeader(MetricsConstants.HEADER_COUNTER_INCREMENT, constant(417L))
.to("metric:counter:simple.counter?increment=7")
.to("direct:out");
// updates counter using simple language to evaluate body.length
from("direct:in")
.setHeader(MetricsConstants.HEADER_COUNTER_INCREMENT, simple("${body.length}"))
.to("metrics:counter:body.length")
.to("mock:out");
メトリックのタイプヒストグラム リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
metrics:histogram:metricname[?options]
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト
|
説明
|
|
value
|
-
|
ヒストグラムで使用する値
|
value が設定されていない場合、ヒストグラムには何も追加されず、警告が記録されます。
// adds value 9923 to simple.histogram
from("direct:in")
.to("metric:histogram:simple.histogram?value=9923")
.to("direct:out");
// nothing is added to simple.histogram; warning is logged
from("direct:in")
.to("metric:histogram:simple.histogram")
.to("direct:out");
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージヘッダーを使用して、Metrics コンポーネント URI に指定された値をオーバーライドできます。
|
名前
|
説明
|
想定されるタイプ
|
|
CamelMetricsHistogramValue
|
URI のヒストグラム値の上書き
|
Long
|
// adds value 992 to simple.histogram
from("direct:in")
.setHeader(MetricsConstants.HEADER_HISTOGRAM_VALUE, constant(992L))
.to("metric:histogram:simple.histogram?value=700")
.to("direct:out")
メトリックタイプのメーター リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
metrics:meter:metricname[?options]
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト
|
説明
|
|
mark
|
-
|
マークとして使用する長い値
|
mark が設定されていない場合、meter.mark() は引数なしで呼び出されます。
// marks simple.meter without value
from("direct:in")
.to("metric:simple.meter")
.to("direct:out");
// marks simple.meter with value 81
from("direct:in")
.to("metric:meter:simple.meter?mark=81")
.to("direct:out");
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージヘッダーを使用して、Metrics コンポーネント URI に指定された
mark 値を上書きできます。
|
名前
|
説明
|
想定されるタイプ
|
|
CamelMetricsMeterMark
|
URI のマーク値の上書き
|
Long
|
// updates meter simple.meter with value 345
from("direct:in")
.setHeader(MetricsConstants.HEADER_METER_MARK, constant(345L))
.to("metric:meter:simple.meter?mark=123")
.to("direct:out");
メトリクスタイプタイマー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
metrics:timer:metricname[?options]
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト
|
説明
|
|
action
|
-
|
start または stop
|
action または無効な値が指定されていない場合、警告はタイマー更新なしでログに記録されます。実行中のタイマーまたは stop でアクション start が呼び出されている場合は、何も更新されず、警告が記録されます。
// measure time taken by route "calculate"
from("direct:in")
.to("metrics:timer:simple.timer?action=start")
.to("direct:calculate")
.to("metrics:timer:simple.timer?action=stop");
TimerContext オブジェクトは、異なる Metrics コンポーネント呼び出し間で Exchange プロパティーとして保存されます。
Headers リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
メッセージヘッダーは、Metrics コンポーネント URI に指定されたアクション値を上書きするために使用できます。
|
名前
|
説明
|
想定されるタイプ
|
|
CamelMetricsTimerAction
|
URI でのタイマーアクションの上書き
|
org.apache.camel.component.metrics.timer.TimerEndpoint.TimerAction
|
// sets timer action using header
from("direct:in")
.setHeader(MetricsConstants.HEADER_TIMER_ACTION, TimerAction.start)
.to("metric:timer:simple.timer")
.to("direct:out");
MetricsRoutePolicyFactory リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このファクトリーを使用すると、コード化されたメトリクスを使用してルートの使用状況の統計を公開する各ルートに RoutePolicy を追加できます。このファクトリーは、以下の例のように Java および XML で使用できます。
ヒント
MetricsRoutePolicyFactory を使用する代わりに、選択したいくつかのルートのみをインストルメント化する場合に、インストルメント化するルートごとに MetricsRoutePolicy を定義できます。
Java の場合は、以下のようにファクトリーを
CamelContext に追加します。
context.addRoutePolicyFactory(new MetricsRoutePolicyFactory());
XML DSL の場合は、以下のように <bean> を定義します。
<!-- use camel-metrics route policy to gather metrics for all routes -->
<bean id="metricsRoutePolicyFactory" class="org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory"/>
MetricsRoutePolicyFactory および MetricsRoutePolicy は以下のオプションをサポートします。
|
名前
|
デフォルト
|
説明
|
useJmx
|
false
|
com.codahale.metrics.JmxReporter を使用して、詳細な統計を JMX に報告するかどうか。CamelContext で JMX が有効になっている場合、JMX ツリーのサービスタイプの下に MetricsRegistryService mbean が登録されていることに注意してください。この mbean には、統計を JSON 出力する 1 つのオペレーションがあります。useJmx を true に設定することは、統計タイプごとに詳細な mbeans が必要な場合にのみ必要です。
|
jmxDomain
|
org.apache.camel.metrics
|
JMX ドメイン名
|
prettyPrint
|
false
|
統計を json 形式で出力する際に pretty print を使用するかどうか。
|
metricsRegistry
|
|
共有
com.codahale.metrics.MetricRegistry の使用を許可します。指定しない場合は、Camel はこの CamelContext によって使用される共有インスタンスを作成します。
|
rateUnit
|
TimeUnit.SECONDS
|
メトリクスレポーターまたは統計を json 出力するときのレートに使用する単位。
|
durationUnit
|
TimeUnit.MILLISECONDS
|
メトリクスレポーターまたは統計を json 出力するときの期間に使用する単位。
|
namePattern
|
##name##.##routeId##.##type##
|
Camel 2.17: 使用する名前パターン。区切り文字としてドットを使用しますが、変更できます。
##name##、##routeId##、および ##type## の値は実際の値に置き換えられます。###name### は CamelContext の名前で、###routeId### はルートの名前、###type### は応答の値になります。
|
Java コード tou からは、以下のように
org.apache.camel.component.metrics.routepolicy.MetricsRegistryService から com.codahale.metrics.MetricRegistry を保持できます。
MetricRegistryService registryService = context.hasService(MetricsRegistryService.class);
if (registryService != null) {
MetricsRegistry registry = registryService.getMetricsRegistry();
...
}
MetricsMessageHistoryFactory リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このファクトリーを使用すると、メッセージのルーティング中にメトリクスを使用してメッセージ履歴のパフォーマンス統計をキャプチャーできます。これは、すべてのルートの各ノードにメトリクスタイマーを使用して機能します。このファクトリーは、以下の例のように Java および XML で使用できます。
Java の場合は、以下のようにファクトリーを CamelContext に設定します。
context.setMessageHistoryFactory(new MetricsMessageHistoryFactory());
XML DSL の場合は、以下のように <bean> を定義します。
<!-- use camel-metrics message history to gather metrics for all messages being routed -->
<bean id="metricsMessageHistoryFactory" class="org.apache.camel.component.metrics.messagehistory.MetricsMessageHistoryFactory"/>
以下のオプションはファクトリーでサポートされます。
| 名前 | デフォルト | 説明 |
|---|---|---|
useJmx | false | com.codahale.metrics.JmxReporter を使用して、詳細な統計を JMX に報告するかどうか。CamelContext で JMX が有効になっている場合、MetricsRegistryService MBean は JMX ツリーのサービスタイプの下に登録されることに注意してください。この MBean には、JSon を使用して統計を出力する 1 つの操作があります。useJmx を true に設定する必要があるのは、統計タイプごとに詳細な MBean が必要な場合のみです。 |
jmxDomain | org.apache.camel.metrics | JMX ドメイン名。 |
prettyPrint | false | JSon 形式で統計を出力するときに pretty print を使用するかどうか。 |
metricsRegistry | 共有 com.codahale.metrics.MetricRegistry を有効にします。指定がない場合は、Camel はこの CamelContext の共有インスタンスを作成します。 | |
rateUnit | TimeUnit.SECONDS | メトリクスレポーターのレートに使用する単位、または統計を JSon としてダンプする場合。 |
durationUnit | TimeUnit.MILLISECONDS | メトリクスレポーターまたは統計を JSon としてダンプするときの期間に使用する単位。 |
namePattern | ##name##.##routeId##.###id###.##type## | 使用する名前パターン。区切り文字としてドットを使用しますが、変更できます。##name##、##routeId##、##type##、および ###id### の値は、実際の値に置き換えられます。###name### は CamelContext の名前で、###routeId### パターンはルートの名前、###id### パターンはノード ID を表し、###type### は履歴の値になります。 |
実行時に、Java API または JMX からメトリクスにアクセスできます。これにより、データを JSon 出力として収集できます。Java コードから、以下のように CamelContext からサービスを取得できます。
MetricsMessageHistoryService service = context.hasService(MetricsMessageHistoryService.class);
String json = service.dumpStatisticsAsJson();
また、MBean は
name=MetricsMessageHistoryService を使用して type=services ツリーに登録される JMX API です。