Monitor Spring Boot Performance Locally with Pulse

Pulse attaches with -javaagent at startup, captures SQL/HTTP/JVM telemetry, and exposes a local UI with no external collector.

  • Java
  • Spring Boot
  • Offline-first
  • SQL / HTTP / JVM

Designed for local-first engineering workflows

Spring BootJDBCJVMObservabilityIncident Debugging

Why Pulse

A focused local APM workflow

Zero external collector

No collector process, no cloud bridge, no external pipeline. Telemetry stays where your app runs.

Single -javaagent entrypoint

Attach one jar at JVM startup and start collecting SQL, HTTP, and JVM metrics immediately.

Built for local workflows

Fast debugging loops with a local web UI and no external service dependencies.

Features

Telemetry where debugging actually happens

SQL Collection

  • JDBC instrumentation for Statement and PreparedStatement.
  • SQL type, duration, errors, and Spring context capture.
  • Correlation SQL ↔ HTTP via traceId with thread+time fallback.

HTTP Collection

  • Transactions by method + path with status, duration, and errors.
  • Stack hotspots and sampled call stacks for slow paths.
  • Query params, header filtering, masked auth, and best-effort body capture.

JVM Collection

  • Heap, process CPU, thread count, GC count, and GC pause.
  • Average and p95 HTTP latency snapshots.
  • Dedicated Endpoint, Database, and JVM tabs in local UI.

Quickstart

Launch Pulse in three steps

  1. Step 1

    Download the agent .jar from GitHub

    Get the prebuilt Pulse agent from the repository releases.

    Open: https://github.com/briacdev/Pulse/releases

    Download: pulse-0.1.0-agent.jar

  2. Step 2

    Start app with -javaagent

    Attach the downloaded agent jar when launching your Spring Boot app.

    java \
      -javaagent:/path/to/pulse-agent.jar \
      -jar /path/to/your-app.jar
  3. Step 3

    Open local UI

    Use the local dashboard to inspect SQL, HTTP, and JVM metrics.

    http://127.0.0.1:17321

Possible optional -javaagent parameters

  • port=17321
  • bind=127.0.0.1
  • retentionMs=900000
  • slowMs=300
  • slowHttpMs=500
  • sampleRate=1.0
  • appName=my-app

Example with optional parameters

-javaagent:/path/to/pulse-agent.jar=port=17321,bind=127.0.0.1,retentionMs=900000,slowMs=300,slowHttpMs=500,sampleRate=1.0,appName=my-app

Local API

Endpoints exposed by Pulse

Pulse serves snapshots and trace lookup routes directly from the local process on the configured bind and port.

  • GET /api/sql/snapshot
  • GET /api/sql/config
  • GET /api/http/snapshot
  • GET /api/http/trace/{id}
  • GET /api/jvm/snapshot
  • GET /

Security

Clear boundaries for captured data

Sensitive headers masked

Authorization, Proxy-Authorization, Cookie, and Set-Cookie are excluded from raw header output.

Best-effort body capture

Textual payloads can be captured and truncated for size control. Binary content is ignored.

No SQL bind values

Bind values are intentionally not captured to reduce risk around sensitive data exposure.

FAQ

Troubleshooting without guesswork

Fast answers for the most common startup and capture issues.

Open Repository
No HTTP data appears

Confirm the target application starts with -javaagent, restart the JVM after agent changes, and verify the Pulse port is reachable.

HTTP request body is missing

Body capture is best effort. Some proxies, filters, and non-text payloads can prevent capture in specific flows.

Port already in use

Pulse fails fast when the configured port is unavailable. Change the argument, for example: port=17322.

Start Local

Attach Pulse. Inspect performance. Ship with confidence.

One agent jar. Local observability for real debugging sessions.