11.3. カスタムのメトリクスを使用した KIE Server の Prometheus メトリクスモニターリングの拡張
KIE Server インスタンスが Prometheus メトリクスモニターリングを使用するように設定後に、ビジネス要件に合わせてカスタムのメトリクスを使用するように、KIE Server の Prometheus 機能を拡張できます。Prometheus は、KIE Server が Prometheus に公開するデフォルトのメトリクスと、カスタムのメトリクスを収集して、保存します。
たとえば、以下の手順では、Prometheus で収集して保存するように、カスタムの Decision Model and Notation (DMN) メトリックを定義します。
前提条件
- Prometheus メトリクスモニターリングが、KIE Server インスタンス用に設定されている。オンプレミス型 KIE Server を使用した Prometheus 設定に関する詳細は、「KIE Server のモニターリングを行う Prometheus メトリクスの設定」 を参照してください。Red Hat OpenShift Container Platform の KIE Server を使用した Prometheus 設定に関する詳細は、「Red Hat OpenShift Container Platform の KIE Server の Prometheus メトリクスモニターリングの設定」 を参照してください。
手順
空の Maven プロジェクトを作成して、以下のパッケージタイプと依存関係を、プロジェクトの
pom.xmlファイルに定義します。サンプルプロジェクトの pom.xml ファイルの例
<packaging>jar</packaging> <properties> <version.org.kie>7.44.0.Final-redhat-00006</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リスナークラスが含まれます。-
新規メトリクスプロバイダーを KIE 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です。Red Hat OpenShift Container Platform に Red Hat Decision Manager をデプロイする場合は、カスタム KIE Server イメージを作成し、この JAR ファイルをイメージに追加します。追加の JAR ファイルを含むカスタム KIE Server イメージの作成に関する詳細は、Operator を使用した Red Hat OpenShift Container Platform への Red Hat Decision Manager 環境のデプロイメント を参照してください。
KIE Server を起動して、実行中の KIE Server に構築したプロジェクトをデプロイします。プロジェクトは、Business Central インターフェイスまたは KIE Server REST API (
http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId}へのPUT要求) を使用してデプロイできます。実行中の KIE Server にプロジェクトをデプロイした後に、Prometheus はメトリクスの収集を開始し、KIE Server はメトリクスを REST API エンドポイント
http://HOST:PORT/SERVER/services/rest/metrics(または Spring Boot ではhttp://HOST:PORT/rest/metrics) に公開します。