perwendel / spark

A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Integration with micrometer

Paxa opened this issue · comments

Kinda dirty hack but it works, may be will be useful for someone

Spark creates jetty server after Spark.init() is called
This code try to access private field that holds embedded server and if server not initialized yet then wait 1 sec and try again

This can be also useful to get jetty thread pool status

    public static void bindStarkAsync() {
        new Thread(() -> {
            int retryCount = 0;
            while (retryCount < 20) {
                try {
                    boolean registered = bindStark();
                    if (registered) {
                        break;
                    }
                    retryCount += 1;
                    Thread.sleep(1000);
                } catch (Throwable error) {
                    logger.error("bindStark failed", error);
                }
            }
        }).start();
    }

    @SuppressWarnings("PMD.UnusedAssignment")
    public static boolean bindStark() {
        spark.Service sparkService = null;
        try {
            Method m = Spark.class.getDeclaredMethod("getInstance");
            m.setAccessible(true);
            sparkService = (spark.Service) m.invoke(null);
        } catch (Exception error) {
            logger.error("can not invoke Spark.getInstance()", error);
            return false;
        }
        if (sparkService == null) {
            logger.warn("sparkService is null");
            return false;
        }

        EmbeddedJettyServer embeddedServer = null;
        try {
            embeddedServer = (EmbeddedJettyServer) FieldUtils.readDeclaredField(sparkService, "server", true);
        } catch (Exception error) {
            logger.error("can not read sparkService.server", error);
            return false;
        }
        if (embeddedServer == null) {
            logger.warn("embeddedServer is null");
            return false;
        }

        Server jettyServer = null;
        try {
            jettyServer = (Server) FieldUtils.readDeclaredField(embeddedServer, "server", true);
        } catch (Exception error) {
            logger.error("can not read embeddedServer.server", error);
            return false;
        }
        if (jettyServer == null) {
            logger.warn("jettyServer is null");
            return false;
        }

        JettyConnectionMetrics.addToAllConnectors(jettyServer, metricRegistry);
        new JettyServerThreadPoolMetrics(jettyServer.getThreadPool(), Tags.empty()).bindTo(metricRegistry);

        logger.info("JETTY server registerred to micrometer");
        return true;
    }