JVM Observability Platform GitHub

Argus JVM Observability Platform

A lightweight JVM observability platform that helps you understand what your Java application is doing — right now, in production.

Java 11+ CLI Java 17+ Dashboard Java 21+ Full Features 50 Commands Zero Dependencies

Argus gives you two tools for JVM diagnostics:

  • Argus CLI — 50 diagnostic commands that work on any running JVM. No agent, no restart, no configuration. Point at a PID and get answers in seconds.
  • Argus Agent — Attach as a Java agent and get a live web dashboard with GC timelines, CPU graphs, heap usage, flame graphs, and thread analysis, all streaming in real time.

Philosophy: Argus is not an APM. It's a diagnostic tool designed for the moments when you need to look inside a JVM and understand what's happening — quickly, without setup overhead, without external dependencies.

Why Argus?

Every Java developer has been there. Your application is running in production, and something is wrong. Response times are climbing. Memory usage is creeping up. The GC is pausing more often than it should. You know something is happening inside the JVM, but you can't see it.

Traditional monitoring tools tell you that your app is slow, but they don't tell you why. APM solutions are expensive and heavy. JMX is clunky. JFR dumps require post-processing. By the time you've gathered the data, the incident is over.

Argus was built to solve this problem.

Instant CLI Diagnostics

50 commands that work on any running JVM. No agent, no restart, no configuration. Just point at a PID and get answers in seconds.

Real-time Dashboard

Attach as a Java agent and get a live web dashboard with GC timelines, CPU graphs, heap usage, flame graphs, and thread analysis — all streaming in real time.

Virtual Thread Aware

First-class support for Java 21 virtual threads. Detect pinning, analyze carrier thread distribution, and monitor thread lifecycle events as they happen.

Zero Overhead Design

Built on JFR and JMX MXBeans — the same low-overhead infrastructure that the JVM uses internally. No bytecode modification, no sampling bias.

Installation

One command. Takes about 10 seconds.

curl -fsSL https://raw.githubusercontent.com/rlaope/argus/master/install.sh | bash

This downloads the Argus CLI to ~/.argus/ and adds it to your PATH. After installation, type argus with no arguments to see all available commands.

CLI Commands

The CLI is a standalone tool that works on any running JVM process. You don't need to have started the application with any special flags. You don't need to install an agent. If you can see the process in jps, Argus can diagnose it.

Your First Diagnosis

Let's say you have a Java application that's behaving strangely. Here's how you'd investigate:

# Step 1: Find your application's PID
argus ps

# Step 2: Get an overview of the JVM
argus info 12345

# Step 3: Check GC behavior — is the GC working too hard?
argus gc 12345

# Step 4: Look at memory — is something leaking?
argus heap 12345

# Step 5: Check threads — are there too many? Any deadlocked?
argus threads 12345
argus deadlock 12345

# Step 6: If memory is the issue, find what's consuming it
argus histo 12345

Argus CLI in action — diagnosing a running JVM process

All 50 Commands

Every command follows the same pattern: argus <command> <pid>. All commands support --format=json for scripting and --source=auto|agent|jdk to control the data source.

Category Commands What they tell you
Processps, info, initFind and identify JVM processes
Memoryheap, histo, heapdump, diff, nmtHeap usage, object distribution, native memory
GCgc, gcutil, gccause, gcnewGC frequency, pause times, causes, generation stats
Threadsthreads, deadlock, poolThread states, deadlocks, pool analysis
CPUprofile, jfrCPU profiling, flight recording
Classesclassloader, classstat, stringtable, symboltableClass loading, interned strings, symbols
Runtimesysprops, vmflag, vmset, vmlog, env, dynlibsConfiguration, flags, environment
Advancedmetaspace, compiler, finalizer, jmx, report, topMetaspace, JIT, finalizers, diagnostics

Dashboard

While the CLI is great for quick checks, sometimes you need to watch what's happening over time. That's where the Argus Agent comes in. Attach it to your JVM, and you get a real-time web dashboard that shows you everything.

Starting the Dashboard

Add the -javaagent flag when starting your application:

java -javaagent:argus-agent.jar \
  -Dargus.gc.enabled=true \
  -Dargus.cpu.enabled=true \
  -Dargus.allocation.enabled=true \
  -jar your-application.jar

Open http://localhost:9202/ in your browser and you'll see the dashboard immediately. No configuration files, no external services, no database.

Argus Dashboard — real-time JVM monitoring with GC, CPU, memory, and thread analysis

What the Dashboard Shows

The dashboard is organized in a JVM-health-first layout. When you're responding to an incident, you look at the most critical metrics first:

Memory & GC

Heap usage over time, GC pause timeline, GC cause distribution, overhead percentage. See immediately if GC is your bottleneck.

CPU Utilization

JVM and system CPU load plotted over the last 60 seconds. Spot CPU spikes and correlate them with GC pauses.

Allocation & Metaspace

Object allocation rate, peak rate, top allocating classes, metaspace growth rate. Detect memory pressure before it becomes an OOM.

Profiling & Contention

CPU hot methods, lock contention hotspots, interactive flame graph. Find exactly which code paths are consuming resources.

Virtual Threads

Thread creation rate, active count, pinning detection with stack traces, carrier thread distribution. Java 21+ only.

Recommendations

Auto-generated insights from cross-correlating GC, CPU, memory, and thread metrics. The dashboard tells you what to investigate.

Interactive Console

The dashboard includes an interactive console at /console.html where you can run diagnostic commands directly in the browser. Click a command button, watch the typing animation, and see the results — all without leaving the dashboard.

Configuration Options

Production tip: Start with just gc and cpu enabled. These have negligible overhead. Enable allocation, profiling, and contention only when actively investigating — they generate more JFR events and use more memory.

PropertyDefaultDescription
argus.server.port9202Dashboard HTTP port
argus.gc.enabledtrueGC event collection
argus.cpu.enabledtrueCPU load sampling
argus.allocation.enabledfalseObject allocation tracking (higher overhead)
argus.profiling.enabledfalseCPU method profiling (higher overhead)
argus.contention.enabledfalseLock contention monitoring
argus.metaspace.enabledtrueMetaspace usage tracking
argus.metrics.prometheus.enabledtruePrometheus metrics endpoint at /prometheus

Spring Boot Integration

If you're building a Spring Boot application (3.2+), you don't need to use the -javaagent flag at all. Just add a single dependency and Argus starts automatically with your application.

Setup

// build.gradle.kts
implementation("io.argus:argus-spring-boot-starter:0.8.0")

When your Spring Boot application starts, Argus will:

  • Start the JFR streaming engine automatically
  • Launch the dashboard on port 9202
  • Register with Spring Boot Actuator at /actuator/health/argus
  • Export ~25 Micrometer metrics to your configured backend (Prometheus, Datadog, etc.)

Configuration via application.yml

argus:
  buffer-size: 131072
  server:
    port: 9202
  gc:
    enabled: true
  cpu:
    enabled: true
    interval-ms: 500
  allocation:
    enabled: true
    threshold: 524288

All properties have IDE autocomplete support. The defaults match the standard agent configuration.

Micrometer Metrics

When Micrometer is on the classpath (it is in most Spring Boot apps), Argus automatically registers ~25 JVM diagnostic metrics:

# Example Prometheus queries
argus_heap_used_bytes                    # Current heap usage
argus_gc_pause_time_max_seconds          # Worst GC pause
argus_cpu_jvm_user_ratio * 100           # JVM CPU %
argus_virtual_threads_active             # Active virtual threads
argus_allocation_rate_bytes_per_second   # Allocation pressure

Framework-agnostic: The argus-micrometer module works without Spring. If you're using Quarkus, Micronaut, or standalone Micrometer, add argus-micrometer directly and register the ArgusMeterBinder with your MeterRegistry.

Java Version Compatibility

Argus adapts its capabilities based on the Java version at runtime. You don't need to configure anything — it detects the version automatically and enables what's available.

FeatureJava 11+Java 17+Java 21+
CLI (50 commands)YesYesYes
Dashboard & Web UIYes (MXBean)Yes (JFR)
GC / CPU / MemoryCLI onlyYesYes
Allocation TrackingYes
Virtual ThreadsYes
Flame GraphYes
Lock ContentionYes
Spring Boot StarterYesYes
Micrometer MetricsYesYes

How it works: On Java 17–20, the agent uses an MXBean polling engine that queries ManagementFactory MXBeans for GC, CPU, and memory data at regular intervals. On Java 21+, it uses JFR streaming for lower overhead and richer event data. The dashboard automatically hides features that aren't available on your Java version.

Architecture

Argus is organized into seven modules, each with a clear responsibility:

ModulePurpose
argus-coreShared event types, configuration, ring buffer transport
argus-agentJava agent entry point, JFR streaming engine, MXBean polling engine
argus-serverNetty HTTP/WebSocket server, 10 analyzers, metrics export
argus-frontendDashboard web UI (vanilla JS, Chart.js, D3 flame graph)
argus-cli50 diagnostic commands using jcmd/jstat
argus-micrometerFramework-agnostic Micrometer MeterBinder
argus-spring-boot-starterSpring Boot auto-configuration

The agent and server communicate through lock-free ring buffers in shared memory — there is no network protocol between them. This means zero serialization overhead and minimal latency from event capture to dashboard display.

Configuration Reference

All Argus properties can be set as JVM system properties (-Dargus.xxx=value) when using the agent, or in application.yml / application.properties when using the Spring Boot starter.

Agent Properties

PropertyDefaultDescription
argus.server.port9202Dashboard HTTP port
argus.gc.enabledtrueGC event collection via JFR
argus.cpu.enabledtrueCPU load sampling
argus.cpu.interval-ms500CPU sampling interval in milliseconds
argus.allocation.enabledfalseObject allocation tracking (higher overhead)
argus.allocation.threshold524288Minimum allocation size to track (bytes)
argus.profiling.enabledfalseCPU method profiling via JFR
argus.contention.enabledfalseLock contention monitoring
argus.metaspace.enabledtrueMetaspace usage tracking
argus.buffer-size131072Ring buffer size in bytes
argus.metrics.prometheus.enabledtrueExpose Prometheus endpoint at /prometheus

CLI Flags

FlagValuesDescription
--formattext, jsonOutput format (default: text)
--sourceauto, agent, jdkData source selection (default: auto)