2.3. 添加自定义 Camel K 集成指标
您可以通过在 Java 代码中使用 Camel MicroProfile Metrics 组件和注解,将自定义指标添加到 Camel K 集成。然后,Prometheus 会自动发现并显示这些自定义指标。
本节介绍在 Camel K 集成和服务实施代码中添加 Camel MicroProfile Metrics 注释的示例。
先决条件
- 您必须已在 OpenShift 中启用对您自己的服务的监控。请参阅在 OpenShift 中启用用户工作负载监控。
流程
使用 Camel MicroProfile Metrics 组件注解在 Camel 集成代码中注册自定义指标。以下示例显示了
Metrics.java
集成:// camel-k: language=java trait=prometheus.enabled=true dependency=mvn:org.my/app:1.0 1 import org.apache.camel.Exchange; import org.apache.camel.LoggingLevel; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.microprofile.metrics.MicroProfileMetricsConstants; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class Metrics extends RouteBuilder { @Override public void configure() { onException() .handled(true) .maximumRedeliveries(2) .logStackTrace(false) .logExhausted(false) .log(LoggingLevel.ERROR, "Failed processing ${body}") // Register the 'redelivery' meter .to("microprofile-metrics:meter:redelivery?mark=2") // Register the 'error' meter .to("microprofile-metrics:meter:error"); 2 from("timer:stream?period=1000") .routeId("unreliable-service") .setBody(header(Exchange.TIMER_COUNTER).prepend("event #")) .log("Processing ${body}...") // Register the 'generated' meter .to("microprofile-metrics:meter:generated") 3 // Register the 'attempt' meter via @Metered in Service.java .bean("service") 4 .filter(header(Exchange.REDELIVERED)) .log(LoggingLevel.WARN, "Processed ${body} after ${header.CamelRedeliveryCounter} retries") .setHeader(MicroProfileMetricsConstants.HEADER_METER_MARK, header(Exchange.REDELIVERY_COUNTER)) // Register the 'redelivery' meter .to("microprofile-metrics:meter:redelivery") 5 .end() .log("Successfully processed ${body}") // Register the 'success' meter .to("microprofile-metrics:meter:success"); 6 } }
根据需要,将 Camel MicroProfile 指标注释添加到任何实施文件中。以下示例显示了 Camel K 集成调用的服务 bean,该服务会生成随机故障:
package com.redhat.integration; import java.util.Random; import org.apache.camel.Exchange; import org.apache.camel.RuntimeExchangeException; import org.eclipse.microprofile.metrics.Meter; import org.eclipse.microprofile.metrics.annotation.Metered; import org.eclipse.microprofile.metrics.annotation.Metric; import javax.inject.Named; import javax.enterprise.context.ApplicationScoped; @Named("service") @ApplicationScoped @io.quarkus.arc.Unremovable public class Service { //Register the attempt meter @Metered(absolute = true) public void attempt(Exchange exchange) { 1 Random rand = new Random(); if (rand.nextDouble() < 0.5) { throw new RuntimeExchangeException("Random failure", exchange); 2 } } }
按照 配置 Camel K 集成指标 中的步骤运行集成,并在 Prometheus 中查看自定义 Camel K 指标。
在这种情况下,示例已在
Metrics.java
中使用 Camel K 模式行来自动配置 Prometheus 和Service.java
所需的 Maven 依赖项。