Trouble Monitoring Performance Metrics for Native Executables Built with GraalVM

131 Views Asked by At

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.

1

There are 1 best solutions below

2
On

what is available in Native Image in terms of monitoring is the following:

  • JFR
  • jvmstat
  • JMX (experimental)
  • heap dump.

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.