启用Micrometer TomcatMetrics而不使用Spring(如何获取Tomcat管理器)

4
我希望将Micrometer TomcatMetrics度量类插入到一个没有Spring集成的现有Tomcat应用程序中。
从源代码看,似乎只需调用即可实现。
 public static void monitor(MeterRegistry registry, @Nullable Manager manager, String... tags) 

然而,我似乎无法弄清如何获得org.apache.catalina.Manager实例。

没有管理器(null),它可以工作但缺少我想要的会话信息。

那么如何以正确的方式获取它(使用servletContextListener或其他方法)?

2个回答

3
private static Manager manager;

private static synchronized Manager getManager(ServletContext servletContext) {
    if (manager == null) {
        try {
            Field applicationContextField = servletContext.getClass().getDeclaredField("context");
            applicationContextField.setAccessible(true);
            ApplicationContext appContextObj = (ApplicationContext) applicationContextField.get(servletContext);
            Field standardContextField = appContextObj.getClass().getDeclaredField("context");
            standardContextField.setAccessible(true);
            StandardContext standardContextObj = (StandardContext) standardContextField.get(appContextObj);
            manager = standardContextObj.getManager();
        } catch (ReflectiveOperationException e) {
            throw new RuntimeException(e);
        }
    }
    return manager;
}

1

Prometheus注册表与JVM和Tomcat指标的示例micrometer.jsp页面。

在您的应用程序类加载器中包含micrometer jars(例如micrometer-core-1.8.2.jar,micrometer-registry-prometheus-1.8.2.jar)。

<%@ page contentType="text/plain" trimDirectiveWhitespaces="true" %>
<%@ page import="io.micrometer.prometheus.PrometheusMeterRegistry" %>
<%@ page import="io.micrometer.prometheus.PrometheusConfig" %>
<%@ page import="io.prometheus.client.exporter.common.TextFormat" %>
<%@ page import="io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics"%>
<%@ page import="io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics"%>
<%@ page import="io.micrometer.core.instrument.binder.jvm.JvmGcMetrics"%>
<%@ page import="io.micrometer.core.instrument.binder.system.ProcessorMetrics"%>
<%@ page import="io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics"%>
<%@ page import="io.micrometer.core.instrument.binder.tomcat.TomcatMetrics"%>
<%@ page import="org.apache.catalina.core.ApplicationContextFacade"%>
<%@ page import="java.lang.reflect.Field"%>
<%@ page import="org.apache.catalina.core.ApplicationContext"%>
<%@ page import="org.apache.catalina.core.StandardContext"%>
<%
    PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
    prometheusRegistry.config().commonTags("application", "myset-worker");
    //prometheusRegistry.config().meterFilter(new PrometheusRenameFilter());

    // JVM metrics
    new ClassLoaderMetrics().bindTo(prometheusRegistry);
    new JvmMemoryMetrics().bindTo(prometheusRegistry);
    new JvmGcMetrics().bindTo(prometheusRegistry);
    new ProcessorMetrics().bindTo(prometheusRegistry);
    new JvmThreadMetrics().bindTo(prometheusRegistry);

    // Tomcat metrics
    ApplicationContextFacade acf = (ApplicationContextFacade)request.getServletContext();
    Field applicationContextFacadeField = ApplicationContextFacade.class.getDeclaredField("context");
    applicationContextFacadeField.setAccessible(true);
    ApplicationContext appContext = (ApplicationContext) applicationContextFacadeField.get(acf);
    Field applicationContextField = ApplicationContext.class.getDeclaredField("context");
    applicationContextField.setAccessible(true);
    StandardContext stdContext = (StandardContext) applicationContextField.get(appContext);
    new TomcatMetrics(stdContext.getManager(),null).bindTo(prometheusRegistry);

    // Print metrics
    //out.print(prometheusRegistry.scrape());
    out.print(prometheusRegistry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100));
%>

1
这里藏着一颗宝石。 - Mert Ülkgün

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接