15.3. 使用自定义指标在 KIE 服务器中扩展 Prometheus 指标监控
将 KIE 服务器实例配置为使用 Prometheus 指标监控后,您可以在 KIE 服务器中扩展 Prometheus 功能,以根据您的业务需求使用自定义指标。然后,Prometheus 会收集并存储您的自定义指标以及 KIE 服务器与 Prometheus 公开的默认指标。
例如,此流程定义由 Prometheus 收集和存储的自定义决策模型和符号(DMN)指标。
先决条件
- 为 KIE 服务器实例配置了 Prometheus 指标监控。有关内部使用 KIE Server 的 Prometheus 配置的详情,请参考 第 15.1 节 “为 KIE 服务器配置 Prometheus 指标监控”。有关在 Red Hat OpenShift Container Platform 中使用 KIE Server 的 Prometheus 配置的详情,请参考 第 15.2 节 “在 Red Hat OpenShift Container Platform 上为 KIE Server 配置 Prometheus 指标监控”。
流程
创建一个空的 Maven 项目,并在项目的
pom.xml文件中定义以下打包类型和依赖项:示例项目中的 pom.xml 文件示例
<packaging>jar</packaging> <properties> <version.org.kie>7.59.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>从
org.kie.server.services.prometheus.PrometheusMetricsProvider接口实现相关的监听程序,作为定义自定义 Prometheus 指标的自定义监听程序类的一部分,如下例所示:自定义监听器类中的
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目录中。例如,在红帽 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 Server 镜像的更多信息,请参阅使用 Operator 在 Red Hat OpenShift Container Platform 4 上部署 Red Hat Process Automation Manager 环境。
启动 KIE 服务器,并将构建的项目部署到正在运行的 KIE 服务器。您可以使用 Business Central 接口或 KIE Server REST API 部署项目(
PUT请求http://SERVER:PORT/kie-server/services/rest/server/containers/{containerId})。在运行的 KIE Server 上部署项目后,Prometheus 开始收集指标和 KIE 服务器将指标发布到 REST API 端点
http://HOST:PORT/SERVER/services/rest/metrics(或者在 Spring Boot 上)。