perwendel / spark

A simple expressive web framework for java. Spark has a kotlin DSL https://github.com/perwendel/spark-kotlin
Apache License 2.0
9.63k stars 1.56k forks source link

Integration with micrometer #1263

Open Paxa opened 1 year ago

Paxa commented 1 year ago

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;
    }