16.3. 使用自定义指标在 KIE 服务器中扩展 Prometheus 指标监控
将 KIE 服务器实例配置为使用 Prometheus 指标监控后,您可以在 KIE 服务器中扩展 Prometheus 功能,以根据您的业务需求使用自定义指标。然后,Prometheus 会收集并存储您的自定义指标,以及 KIE 服务器通过 Prometheus 公开的默认指标。
例如,此步骤定义了由 Prometheus 收集和存储的自定义决策模型和表示法(DMN)指标。
先决条件
- Prometheus 指标监控为您的 KIE 服务器实例配置。有关内部使用 KIE 服务器的 Prometheus 配置的详情,请参考 第 16.1 节 “为 KIE 服务器配置 Prometheus 指标监控”。有关在 Red Hat OpenShift Container Platform 上使用 KIE 服务器的 Prometheus 配置的详情,请参考 第 16.2 节 “在 Red Hat OpenShift Container Platform 上为 KIE 服务器配置 Prometheus 指标监控”。
流程
创建一个空的 Maven 项目,并在项目的
pom.xml
文件中定义以下打包类型和依赖项:示例项目中的 pom.xml 文件示例
<packaging>jar</packaging> <properties> <version.org.kie>7.52.0.Final-redhat-00007</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
类实现DMNRuntimeEventListener
侦听器(来自PrometheusMetricsProvider
接口),并定义要由 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 服务器发现,请在 Maven 项目中创建一个
META-INF/services/org.kie.server.services.prometheus.PrometheusMetricsProvider
文件,并在文件中添加PrometheusMetricsProvider
实现类的完全限定域名。在本例中,文件包含一行org.kie.server.ext.prometheus.MyPrometheusMetricsProvider
。 构建您的项目,并将生成的 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 Process Automation Manager,请创建一个自定义 KIE Server 镜像,并将此 JAR 文件添加到镜像中。有关使用额外 JAR 文件创建自定义 KIE 服务器镜像的更多信息,请参阅使用 Operator 在 Red Hat OpenShift Container Platform 4 上部署 Red Hat Process Automation Manager 环境。
启动 KIE 服务器,并将构建的项目部署到正在运行的 KIE 服务器中。您可以使用 Business Central 接口或 KIE Server REST API (到
http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId}
的PUT
请求)部署项目。在项目部署到正在运行的 KIE 服务器上后,Prometheus 开始收集指标和 KIE 服务器将指标发布到 REST API 端点
http://HOST:PORT/SERVER/services/rest/metrics
(或在 Spring Boot 中,或将指标发布到http://HOST:PORT/rest/metrics)。