17.3. カスタムメトリクスを使用した Process Server の Prometheus メトリクスモニタリングの拡張
Process Server インスタンスが Prometheus メトリクスモニタリングを使用するように設定後に、ビジネス要件に合わせてカスタムのメトリクスを使用するように Process Server の Prometheus 機能を拡張できます。Prometheus は、Process Server が Prometheus に公開するデフォルトのメトリクスと、カスタムメトリクスを収集して、保存します。
たとえば、以下の手順では、Prometheus で収集して保存するように、カスタムの Decision Model and Notation (DMN) メトリックを定義します。
前提条件
- Prometheus メトリクスモニタリングが、Process Server インスタンス用に設定されている。オンプレミスの Process Server と Prometheus の設定に関する情報は、「Process Server のモニターリングを行う Prometheus メトリックスの設定」 を参照してください。Red Hat OpenShift Container Platform の Process Server と Prometheus の設定に関する情報は、「Red Hat OpenShift Container Platform の Process Server の Prometheus メトリクスモニターリングの設定」 を参照してください。
手順
空の Maven プロジェクトを作成して、以下のパッケージタイプと依存関係を、プロジェクトの
pom.xml
ファイルに定義します。サンプルプロジェクトの pom.xml ファイルの例
<packaging>jar</packaging> <properties> <version.org.kie>7.30.0.Final-redhat-00003</version.org.kie> </properties> <dependencies> <dependency> <groupId>org.kie</groupId> <artifactId>kie-api</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-api</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-services-common</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-services-drools</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie.server</groupId> <artifactId>kie-server-services-prometheus</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-dmn-api</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.kie</groupId> <artifactId>kie-dmn-core</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-services-api</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.jbpm</groupId> <artifactId>jbpm-executor</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>org.optaplanner</groupId> <artifactId>optaplanner-core</artifactId> <version>${version.org.kie}</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient</artifactId> <version>0.5.0</version> </dependency> </dependencies>
以下の例にあるように、カスタムの Prometheus メトリクスを定義する、カスタムのリスナークラスの一部として、
org.kie.server.services.prometheus.PrometheusMetricsProvider
インターフェイスを実装します。カスタムのリスナークラス内の
DMNRuntimeEventListener
リスナーの実装例package org.kie.server.ext.prometheus; import io.prometheus.client.Gauge; import org.kie.dmn.api.core.ast.DecisionNode; import org.kie.dmn.api.core.event.AfterEvaluateBKMEvent; import org.kie.dmn.api.core.event.AfterEvaluateContextEntryEvent; import org.kie.dmn.api.core.event.AfterEvaluateDecisionEvent; import org.kie.dmn.api.core.event.AfterEvaluateDecisionServiceEvent; import org.kie.dmn.api.core.event.AfterEvaluateDecisionTableEvent; import org.kie.dmn.api.core.event.BeforeEvaluateBKMEvent; import org.kie.dmn.api.core.event.BeforeEvaluateContextEntryEvent; import org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent; import org.kie.dmn.api.core.event.BeforeEvaluateDecisionServiceEvent; import org.kie.dmn.api.core.event.BeforeEvaluateDecisionTableEvent; import org.kie.dmn.api.core.event.DMNRuntimeEventListener; import org.kie.server.api.model.ReleaseId; import org.kie.server.services.api.KieContainerInstance; public class ExampleCustomPrometheusMetricListener implements DMNRuntimeEventListener { private final KieContainerInstance kieContainer; private final Gauge randomGauge = Gauge.build() .name("random_gauge_nanosecond") .help("Random gauge as an example of custom KIE Prometheus metric") .labelNames("container_id", "group_id", "artifact_id", "version", "decision_namespace", "decision_name") .register(); public ExampleCustomPrometheusMetricListener(KieContainerInstance containerInstance) { kieContainer = containerInstance; } public void beforeEvaluateDecision(BeforeEvaluateDecisionEvent e) { } public void afterEvaluateDecision(AfterEvaluateDecisionEvent e) { DecisionNode decisionNode = e.getDecision(); ReleaseId releaseId = kieContainer.getResource().getReleaseId(); randomGauge.labels(kieContainer.getContainerId(), releaseId.getGroupId(), releaseId.getArtifactId(), releaseId.getVersion(), decisionNode.getModelName(), decisionNode.getModelNamespace()) .set((int) (Math.random() * 100)); } public void beforeEvaluateBKM(BeforeEvaluateBKMEvent event) { } public void afterEvaluateBKM(AfterEvaluateBKMEvent event) { } public void beforeEvaluateContextEntry(BeforeEvaluateContextEntryEvent event) { } public void afterEvaluateContextEntry(AfterEvaluateContextEntryEvent event) { } public void beforeEvaluateDecisionTable(BeforeEvaluateDecisionTableEvent event) { } public void afterEvaluateDecisionTable(AfterEvaluateDecisionTableEvent event) { } public void beforeEvaluateDecisionService(BeforeEvaluateDecisionServiceEvent event) { } public void afterEvaluateDecisionService(AfterEvaluateDecisionServiceEvent event) { } }
PrometheusMetricsProvider
インターフェイスには、Prometheus メトリクス収集に必要なリスナーが含まれます。このインターフェイスは、プロジェクトのpom.xml
ファイルで宣言したkie-server-services-prometheus
依存関係に組み込まれます。以下の例では、
ExampleCustomPrometheusMetricListener
クラスは、(PrometheusMetricsProvider
インターフェイスからの)DMNRuntimeEventListener
リスナーを実装し、Prometheus で収集、保存するカスタムの DMN メトリクスを定義します。以下の例にあるように、
PrometheusMetricsProvider
インターフェイスとカスタムのリスナーを関連付ける、カスタムのメトリクスプロバイダーの一部としてPrometheusMetricsProvider
インターフェイスを実装します。カスタムメトリクスプロバイダークラスの
PrometheusMetricsProvider
インターフェイスの実装例package org.kie.server.ext.prometheus; import org.jbpm.executor.AsynchronousJobListener; import org.jbpm.services.api.DeploymentEventListener; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.DefaultAgendaEventListener; import org.kie.dmn.api.core.event.DMNRuntimeEventListener; import org.kie.server.services.api.KieContainerInstance; import org.kie.server.services.prometheus.PrometheusMetricsProvider; import org.optaplanner.core.impl.phase.event.PhaseLifecycleListener; import org.optaplanner.core.impl.phase.event.PhaseLifecycleListenerAdapter; public class MyPrometheusMetricsProvider implements PrometheusMetricsProvider { public DMNRuntimeEventListener createDMNRuntimeEventListener(KieContainerInstance kContainer) { return new ExampleCustomPrometheusMetricListener(kContainer); } public AgendaEventListener createAgendaEventListener(String kieSessionId, KieContainerInstance kContainer) { return new DefaultAgendaEventListener(); } public PhaseLifecycleListener createPhaseLifecycleListener(String solverId) { return new PhaseLifecycleListenerAdapter() { }; } public AsynchronousJobListener createAsynchronousJobListener() { return null; } public DeploymentEventListener createDeploymentEventListener() { return null; } }
以下の例では、
MyPrometheusMetricsProvider
クラスはPrometheusMetricsProvider
インターフェイスを実装し、このクラスには、カスタムのExampleCustomPrometheusMetricListener
リスナークラスが含まれます。-
新規メトリクスプロバイダーを Process Server で検出できるようにするには、Maven プロジェクトに
META-INF/services/org.kie.server.services.prometheus.PrometheusMetricsProvider
ファイルを作成し、このファイルにPrometheusMetricsProvider
実装クラスの完全修飾クラス名を追加します。以下の例では、このファイルにorg.kie.server.ext.prometheus.MyPrometheusMetricsProvider
の 1 行が含まれています。 -
プロジェクトを構築して、作成された JAR ファイルをプロジェクトの
~/kie-server.war/WEB-INF/lib
ディレクトリーにコピーします。たとえば、Red Hat JBoss EAP ではこのディレクトリーへのパスはEAP_HOME/standalone/deployments/kie-server.war/WEB-INF/lib
です。 Process Server を起動して、実行中の Process Server に構築したプロジェクトをデプロイします。プロジェクトは、Business Central インターフェースまたは Process Server REST API(
http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId}
へのPUT
要求)を使用してデプロイできます。実行中の Process Server にプロジェクトをデプロイした後に、Prometheus はメトリクスの収集を開始し、Process Server はメトリクスを REST API エンドポイント
http://HOST:PORT/SERVER/services/rest/metrics
(または Spring Boot ではhttp://HOST:PORT/rest/metrics
)に公開します。