I'm currently working with native executables created using GraalVM, and I'm interested in monitoring various performance metrics, such as CPU usage, thread activity, and memory usage. However, when I run the application, it doesn't appear in VisualVM's local application list.
When i attempt to establish a manual connection using "Add JMX Connection," the following stack trace was displayed in the application's running terminal.
2023-10-26T21:58:48.560+05:45 INFO 15900 --- [nio-8080-exec-2] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name [JRMI0x000x02K...]. HTTP method names must be tokens
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:407) ~[na:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:264) ~[na:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[graalvm.exe:10.1.15]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[graalvm.exe:10.1.15]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[na:na]
at [email protected]/java.lang.Thread.run(Thread.java:833) ~[graalvm.exe:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:807) ~[graalvm.exe:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.windows.WindowsPlatformThreads.osThreadStartRoutine(WindowsPlatformThreads.java:179) ~[na:na]
I'd like to understand how to effectively monitor the performance of GraalVM native images. What tools and approaches can I use to achieve this? Any insights or guidance would be greatly appreciated.
what is available in Native Image in terms of monitoring is the following:
You need to enable monitoring with a flag, for example
--enable-monitoring=jvmstat
. For what you are looking to monitor, jvmstat and VisualVM would be a good fit.Micrometer should work with GraalVM as well.
Depending on how exactly you want to monitor these metrics, you can also use external tooling, such as psrecord.