16.3. 使用自定义指标在 KIE 服务器中扩展 Prometheus 指标监控

将 KIE 服务器实例配置为使用 Prometheus 指标监控后,您可以在 KIE 服务器中扩展 Prometheus 功能,以根据您的业务需求使用自定义指标。然后,Prometheus 会收集并存储您的自定义指标,以及 KIE 服务器通过 Prometheus 公开的默认指标。

例如,此步骤定义了由 Prometheus 收集和存储的自定义决策模型和表示法(DMN)指标。

先决条件

流程

  1. 创建一个空的 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>

  2. 作为定义自定义 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 指标。

  3. 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 侦听器类。

  4. 要使新指标提供程序可以被 KIE 服务器发现,请在 Maven 项目中创建一个 META-INF/services/org.kie.server.services.prometheus.PrometheusMetricsProvider 文件,并在文件中添加 PrometheusMetricsProvider 实现类的完全限定域名。在本例中,文件包含一行 org.kie.server.ext.prometheus.MyPrometheusMetricsProvider
  5. 构建您的项目,并将生成的 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 环境

  6. 启动 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)。