You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于javax.servlet的Struts项目适配Prometheus指标采集依赖咨询

适配javax.servlet的Prometheus依赖及实现方案

依赖替换

将当前使用的prometheus-metrics-exporter-servlet-jakarta替换为针对javax.servlet的专属依赖,artifactId去掉-jakarta后缀即可,版本保持1.1.0(与你现有核心依赖版本一致,避免兼容性问题):

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>prometheus-metrics-exporter-servlet</artifactId>
    <version>1.1.0</version>
</dependency>

保留原有的prometheus-metrics-core和prometheus-metrics-instrumentation-jvm依赖无需改动。

配置指标导出Servlet

依赖替换后,即可使用适配javax.servlet的io.prometheus.metrics.exporter.servlet.PrometheusMetricsServlet,在web.xml中配置该Servlet暴露指标端点:

<servlet>
    <servlet-name>prometheusMetrics</servlet-name>
    <servlet-class>io.prometheus.metrics.exporter.servlet.PrometheusMetricsServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>prometheusMetrics</servlet-name>
    <url-pattern>/metrics</url-pattern>
</servlet-mapping>

Struts API指标采集实现

要采集各API的请求数和响应时间,需结合Struts拦截器与Prometheus指标:

  1. 定义Prometheus核心指标:
import io.prometheus.metrics.core.metrics.Counter;
import io.prometheus.metrics.core.metrics.Histogram;

public class StrutsApiMetrics {
    // 总请求数指标,按Action、方法、响应状态区分
    public static final Counter requestCounter = Counter.builder()
            .name("struts_api_requests_total")
            .help("Total count of Struts API requests")
            .labelNames("action", "method", "status")
            .register();

    // 请求响应时间指标,按Action、方法区分
    public static final Histogram requestDuration = Histogram.builder()
            .name("struts_api_request_duration_seconds")
            .help("Duration of Struts API requests in seconds")
            .labelNames("action", "method")
            .register();
}
  1. 自定义Struts拦截器实现指标采集:
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import io.prometheus.metrics.core.timer.Timer;

public class PrometricsCollectInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        String actionName = invocation.getAction().getClass().getSimpleName();
        String methodName = invocation.getProxy().getMethod();
        String status = "success";

        // 启动响应时间计时器
        Timer.TimerContext timer = StrutsApiMetrics.requestDuration.labelValues(actionName, methodName).startTimer();
        try {
            return invocation.invoke();
        } catch (Exception e) {
            status = "error";
            throw e;
        } finally {
            // 记录响应时间
            timer.observeDuration();
            // 累加请求数
            StrutsApiMetrics.requestCounter.labelValues(actionName, methodName, status).inc();
        }
    }
}
  1. 在struts.xml中配置拦截器栈:
<struts>
    <package name="default" extends="struts-default">
        <interceptors>
            <interceptor name="prometheusCollect" class="com.your.package.PrometricsCollectInterceptor"/>
            <interceptor-stack name="metricsStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="prometheusCollect"/>
            </interceptor-stack>
        </interceptors>
        <!-- 全局应用包含指标采集的拦截器栈 -->
        <default-interceptor-ref name="metricsStack"/>
    </package>
</struts>

完成以上配置后,启动项目即可通过/metrics端点获取包含JVM指标、Struts API请求数及响应时间的Prometheus格式指标数据。

内容的提问来源于stack exchange,提问作者Bulbul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:35:13