JVM Observability Platform GitHub

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 (71 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 eleven 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-cli71 diagnostic commands using jcmd/jstat
argus-micrometerFramework-agnostic Micrometer MeterBinder
argus-spring-boot-starterSpring Boot auto-configuration: argus.mode=full|diagnostics|off, injectable DoctorService / GcLogAnalyzerService / GcScoreService beans, /actuator/argus-doctor and /actuator/argus-gc endpoints, and a scheduled doctor — all delegating to argus-diagnostics
argus-diagnosticsFramework-agnostic diagnostics library (DoctorEngine, GC-log analysis, health rules) that non-Spring JVM apps can embed; the Spring starter's service beans delegate to it
argus-aggregatorFleet-level aggregation server: multi-JVM health roll-up, alert evaluation, /fleet/rightsize, and profile push (Pyroscope / OTLP Profiles)
argus-operatorKubernetes operator (ArgusFleet / ArgusTarget CRDs + reconcilers)
argus-instrumentOpt-in live bytecode instrumentation agent (ByteBuddy-based), default OFF, used by argus instrument

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.server.enabledtrueStart the built-in HTTP dashboard/metrics server
argus.gc.enabledtrueGC event collection via JFR
argus.cpu.enabledtrueCPU load sampling
argus.cpu.interval1000CPU sampling interval in milliseconds
argus.allocation.enabledfalseObject allocation tracking (higher overhead)
argus.allocation.threshold1048576Minimum allocation size to track (bytes)
argus.profiling.enabledfalseCPU method profiling via JFR
argus.profiling.interval20CPU profiling sampling interval in milliseconds
argus.contention.enabledfalseLock contention monitoring
argus.contention.threshold50Minimum lock contention duration to record (milliseconds)
argus.metaspace.enabledtrueMetaspace usage tracking
argus.buffer.size65536Ring buffer size in bytes
argus.correlation.enabledtrueCross-metric correlation analysis
argus.anomaly.modefixedAnomaly detection mode: fixed | learned | both (learned uses z-score/EWMA/IQR baselines)
argus.metrics.prometheus.enabledtrueExpose Prometheus endpoint at /prometheus
argus.metrics.legacyNamestrueEmit legacy argus_* series alongside OTel semconv jvm.* names; set false to emit only the standard names
argus.otlp.enabledfalseExport metrics via OTLP
argus.otlp.endpointhttp://localhost:4318/v1/metricsOTLP HTTP endpoint for metrics export
argus.otlp.interval15000OTLP export interval in milliseconds
argus.otlp.service.nameargusService name reported in OTLP resource attributes

CLI Flags

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