基于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指标:
- 定义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(); }
- 自定义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(); } } }
- 在
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
相关产品推荐
相关产品推荐

