WildFly 28与Prometheus结合创建自定义指标的方法问询
在WildFly 28/29中实现Prometheus兼容的拉取式自定义指标
下面是几种无需依赖opentelemetry-collector、支持Prometheus拉取的方案:
方案1:配置MicroProfile Telemetry(OpenTelemetry)暴露拉取端点
虽然官方默认是推送模式,但可以调整配置让OpenTelemetry直接提供Prometheus可拉取的指标端点:
- 在
standalone.xml中启用microprofile-telemetry子系统:<subsystem xmlns="urn:wildfly:microprofile-telemetry-smallrye:1.0"/> - 修改
standalone.conf(或domain.conf)添加系统属性,开启Prometheus导出器:JAVA_OPTS="$JAVA_OPTS -Dotel.exporter.prometheus.enabled=true" JAVA_OPTS="$JAVA_OPTS -Dotel.exporter.prometheus.host=0.0.0.0" JAVA_OPTS="$JAVA_OPTS -Dotel.exporter.prometheus.port=9464" - 在代码里创建自定义指标,比如请求计数器:
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.api.metrics.LongCounter; public class AppMetrics { private static final Meter METER = GlobalOpenTelemetry.getMeter("com.yourcompany.yourapp"); private static final LongCounter REQUEST_COUNTER = METER.counterBuilder("app_requests_total") .setDescription("Total number of application requests") .build(); public static void countRequest(String endpoint) { REQUEST_COUNTER.add(1, METER.commonKey("endpoint").of(endpoint)); } } - 启动WildFly后,访问
http://localhost:9464/metrics就能拿到指标数据,直接配置Prometheus拉取这个地址即可。
方案2:手动实现JAX-RS指标端点
完全自定义,用Prometheus官方Java客户端写一个暴露指标的接口:
- 给项目添加Prometheus依赖(以Maven为例):
<dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient</artifactId> <version>0.16.0</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_common</artifactId> <version>0.16.0</version> </dependency> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_jaxrs</artifactId> <version>0.16.0</version> </dependency> - 定义自定义指标:
import io.prometheus.client.Counter; public class CustomMetrics { public static final Counter REQUEST_COUNTER = Counter.build() .name("app_requests_total") .help("Total requests to application endpoints") .labelNames("endpoint") .register(); } - 写一个JAX-RS端点来输出指标:
import io.prometheus.client.exporter.common.TextFormat; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.Response; import java.io.StringWriter; @Path("/metrics") public class MetricsEndpoint { @GET @Produces(TextFormat.CONTENT_TYPE_004) public Response getMetrics() { StringWriter writer = new StringWriter(); try { TextFormat.write004(writer, io.prometheus.client.CollectorRegistry.defaultRegistry.metricFamilySamples()); return Response.ok(writer.toString()).build(); } catch (Exception e) { return Response.serverError().build(); } } } - 部署应用后,访问
http://localhost:8080/你的应用上下文/metrics就能获取指标,把这个地址配置给Prometheus拉取即可。
方案3:配置Micrometer启用Prometheus拉取模式
Micrometer同样支持切换为拉取模式,无需推送:
- 在
standalone.xml中启用micrometer子系统并配置Prometheus导出器:<subsystem xmlns="urn:wildfly:micrometer:1.0"> <exporter name="prometheus" enabled="true" /> </subsystem> - 修改
standalone.conf添加系统属性,设置拉取端点的端口和地址:JAVA_OPTS="$JAVA_OPTS -Dmicrometer.prometheus.port=9090" JAVA_OPTS="$JAVA_OPTS -Dmicrometer.prometheus.host=0.0.0.0" - 用Micrometer API创建自定义指标:
import io.micrometer.core.instrument.MeterRegistry; import jakarta.inject.Inject; public class OrderService { private final MeterRegistry registry; @Inject public OrderService(MeterRegistry registry) { this.registry = registry; } public void processOrder(String orderType) { registry.counter("order_processed_total", "order_type", orderType).increment(); } } - 启动后访问
http://localhost:9090/prometheus获取指标,配置Prometheus拉取这个端点。
内容的提问来源于stack exchange,提问作者sascha
相关产品推荐
相关产品推荐

