Integration with micrometer
Paxa opened this issue · comments
Pavel Evstigneev commented
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;
}