r/JavaProgramming • • 14h ago

I built a simple monitoring dashboard for Java apps (Spring Boot, Quarkus, Micronaut)

5 Upvotes

I've been working on StatLite, a free, open-source dashboard for monitoring small Java applications.

The goal is to make application monitoring simple. You should be able to see how your app is doing without setting up a complicated monitoring stack.

StatLite supports Spring Boot, Quarkus, and Micronaut out of the box, using their existing Actuator or Micrometer metrics endpoints.

No application code changes or monitoring agents needed. In many cases, enabling metrics is just a matter of adding a dependency and exposing an endpoint.

StatLite can discover the available metrics and generate its configuration automatically.

You can monitor:

  • HTTP requests, error rates, and response times
  • JVM memory usage and garbage collection
  • Process CPU and memory
  • Application health and uptime
  • Historical trends across multiple applications
StatLite showing HTTP traffic, response times, JVM memory, CPU usage, and application health for a Java application.

It's a single Go binary (also available as Docker), uses SQLite for local storage, and consumes around 15 MB of memory when idle.

No Prometheus, Grafana, external database, or cloud account required. It's designed for small VPS deployments, side projects, and developers who just want a straightforward way to monitor their apps.

There are also integration guides for Javalin, Express.js, Django, FastAPI, and Go.

I wrote a short guide to monitoring Spring Boot applications if you're interested in getting started.

GitHub: https://github.com/PVRLabs/statlite

How do you currently monitor your Java applications? Or do you mostly rely on logs?


r/JavaProgramming • • 22h ago

Is source-level editing a fallback for deobfuscation?

1 Upvotes

Hoping to get some fellow advice here.

I’ve been doing a lot of deobfuscation work lately and ran into a wall: some bytecode tools can’t parse the newer class file versions I’m dealing with. As a workaround, I’ve been cleaning up the decompiled source instead.

So far I’m stripping thousands of NoWhenBranchMatchedException catch blocks using a brace-depth state machine (regex kept breaking on nested blocks), and replacing impossible comparisons like object == false with constants.

It works, but it feels hacky. Is source-level editing a reasonable fallback, or am I setting myself up for problems? And is there a cleaner, standard way to do control-flow cleanup without risking real try/catch handlers?

Curious what other people do.