Pinpoint APM: distributed Java transaction tracing without code changes
APM, (Application Performance Management) tool for large-scale distributed systems.
At a glance
- What is it?
- Pinpoint is an Apache-2.0 APM tool for large distributed systems. It attaches a Java agent that traces transactions across services, and the README claims roughly a 3% increase in resource usage.
- Who is it for?
- Adopt Pinpoint when you run a JVM-heavy distributed system and want call stacks and a service topology without editing application code. Do not adopt it as a lightweight single-node tracer or on a team that cannot operate HBase, because the storage layer is part of the install.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Pinpoint APM is for, and who should care
Pinpoint is an application performance management tool aimed at large-scale distributed systems, primarily those written in Java. The README frames the problem plainly: services are made of many components that talk to each other and call external APIs, and how any single transaction actually executes is usually a black box. Pinpoint's job is to trace transaction flows between those components and show where the bottlenecks are.
The intended reader is an operations or platform engineer who owns a fleet of JVMs and needs to answer questions like which downstream call is slow, which service is issuing the failing request, and how the pieces are wired together. The README lists the payoffs it targets: application topology at a glance, real-time monitoring, code-level visibility into every transaction, agents installed without changing a line of code, and what it describes as minimal performance impact, approximately a 3% increase in resource usage. That last figure comes from the project's own README and has no published methodology behind it, so treat it as a vendor claim rather than a measured number.
Pinpoint is not a general-purpose observability suite. There is no log aggregation story in the README, no tracing of arbitrary non-JVM services beyond the separate C agent repository for PHP and Python, and no hosted option. It is infrastructure you run yourself.
How the agent, collector and web UI fit together
The architecture visible in the repository is a three-part pipeline. A Java agent attaches to your application JVM and instruments supported libraries at runtime. The agent sends trace data to a collector. The collector writes to storage, and a web application reads it back for the ServerMap, charts and CallStack views.
The top-level repository entries show these parts as separate Maven modules: agent-module, collector, web, web-frontend, and a set of shared libraries such as commons, commons-server, commons-hbase and grpc. The presence of commons-hbase, an hbase module and hbase-testcluster says the collector's storage backend is HBase. There are also otlptrace and otlpmetric modules, which indicates the project has some OpenTelemetry-facing surface, though the README does not describe how to use it.
Instrumentation lives in agent-module/plugins, one directory per supported technology. The README lists the range: JDK 8 and above, servlet containers including Tomcat, Jetty, JBoss EAP, Websphere, Weblogic, Undertow, Vertx and Akka HTTP; Spring, Spring Boot with embedded containers, Spring WebFlux, Spring TX, Spring Cloud Sleuth, RestTemplate and Ktor; HTTP clients including Apache HttpClient 3, 4 and 5, OkHttpClient, Netty and the JDK connectors; and RPC and messaging libraries such as Thrift, DUBBO, GRPC, Apache CXF, ActiveMQ and RabbitMQ. Each plugin directory carries its own supported version range, which is the authoritative place to check before you assume your stack is covered.
The user-facing output is a set of views rather than raw spans. ServerMap draws the topology and lets you click a node for its status and transaction count. The Realtime Active Thread Chart shows threads inside a running application. The Request/Response Scatter Chart plots request volume and response patterns, and you can drag over it to pull individual transactions into the CallStack view. Inspector adds CPU, memory and garbage collection figures, TPS and JVM arguments. There is also URI-metric, infrastructure and error-analysis output.
Installing Pinpoint and getting a first trace
The README points to two documents rather than embedding steps: a quick-start guide for a simple test run and an installation guide for real deployments, both on the project's GitBook site. It also links a separate pinpoint-kubernetes repository for deploying to Kubernetes. There is a quickstart directory in the repository containing a README and a testapp, which is the shortest path to seeing the UI work. The README does not reproduce the Docker or shell commands, so the exact commands come from those pages.
The README does give the agent-side contract in prose: the agent is attached to the JVM at startup, which is why no application code changes are needed, and the pieces are the agent jar, the -javaagent flag, and a properties file that carries the agent id, application name and collector address. The README does not print that command or those keys, so there is no code block to copy here. Open the quick-start guide and the agent's properties file in the distribution, and confirm the collector host, the agent id and the application name against your own deployment before starting the JVM.
After the application starts and serves traffic, the agent reports to the collector and the application appears in the web UI under the application name you configured. The ServerMap view should show the node, and clicking it should show the transaction count for the selected time window. If nothing appears, the first thing to check is whether the agent's properties file points at a collector that is actually reachable from the application host.
The current stable release is v3.1.0, published on 2026-05-21 according to the README, so pin the agent version to that rather than to an older 3.0.x line.
Where Pinpoint becomes the wrong tool
The storage dependency is the first real constraint. Because the collector writes to HBase, a production Pinpoint install is not a single binary you drop on a host. You are operating HBase alongside the collector and the web application, and the repository even carries an hbase-testcluster module, which tells you the project itself needs a throwaway cluster for testing. If your team has no HBase experience and no appetite to gain it, this is a heavy commitment for tracing alone.
The second constraint is scope. The main agent is a JVM agent, so non-Java services are only covered through the separate pinpoint-c-agent repository for PHP and Python. If most of your estate is Go, Node.js or Rust, Pinpoint is not the tool for it, and the README does not claim otherwise. There is an otlptrace module in the repository, but the README does not document an ingestion path for arbitrary OpenTelemetry producers, so you should not plan around it without reading the source.
The third is the agent's own footprint. A bytecode-instrumenting agent attaches to every JVM you monitor, and the README's approximately 3% figure is a project claim with no stated measurement conditions. The README also does not document rollback, so if an instrumented application misbehaves after attaching the agent, the documented recovery path is to start the JVM without the -javaagent flag. Plan the rollout so that is possible.
Finally, the documentation is split. The README is a landing page that links out to GitBook, and several things a reader would want, including the agent properties and the installation commands, are not in the README at all. Expect to read the GitBook pages and the plugin directories rather than the repository front page.
Pinpoint compared with OpenTelemetry-based tracing
The closest alternative approach is an OpenTelemetry instrumentation plus a tracing backend such as Jaeger or Tempo. The difference is where the work happens. OpenTelemetry's Java agent also attaches without code changes, but the ecosystem is deliberately backend-neutral: the agent exports spans over OTLP and you choose where they land, which means you can point the same instrumentation at a different store later without re-instrumenting.
Pinpoint couples the agent to its own collector and HBase storage, and its value is in the assembled views rather than the span format. ServerMap, the Realtime Active Thread Chart and the CallStack view are Pinpoint features, not generic tracing features, and the scatter chart's drag-to-select interaction for pulling a transaction into a call stack is a specific workflow you will not get by pointing the agent at a generic store. If you want that opinionated, topology-first UI and you are already comfortable running HBase, Pinpoint gives it to you in one install. If you want to keep your storage options open, or you need traces from services the JVM agent cannot reach, the OpenTelemetry route costs more assembly work but binds you to less.
A second comparison is Spring Cloud Sleuth, which the README lists as a supported plugin. That matters because it means Pinpoint can sit alongside an existing Sleuth-based setup rather than forcing you to remove it, though the README does not describe how the two interact when both are active.
Maintenance cadence, licence and upgrade cost
The repository is not archived, and the last push was on 2026-05-20, which is the same timestamp as the v3.1.0 release. The releases before it were v3.0.5 on 2026-04-01 and v3.0.4 on 2025-11-10. That pattern, a patch line through late 2025 and early 2026 followed by a minor release in May 2026, is a release cadence you can plan around, but the README does not state a support window for older lines, so there is no documented answer to how long a 3.0.x deployment stays patched.
Upgrades are not a single artifact swap. The agent, the collector and the web application are separate modules in the same repository, and the agent's instrumentation targets specific library versions through the plugin directories. Moving from 3.0.x to 3.1.0 therefore means checking the plugin directory for each framework you rely on and confirming the supported version range still covers what you run, then rolling the agent out to your JVMs. The README does not document a rolling upgrade procedure or mixed-version compatibility between an older agent and a newer collector, so that is an open question to settle before you upgrade a large fleet.
Pinpoint is licensed under Apache-2.0, which permits commercial use and modification. The repository also contains a NOTICE file, which Apache-2.0 requires you to preserve in redistributions, and a LICENSE file with the full text. If you bundle the agent into your own product, the NOTICE obligation is the part people miss. This is a description of the licence terms, not legal advice; get your own counsel for a redistribution question.
Editorial conclusion
Adopt Pinpoint when you run a JVM-heavy distributed system and want call stacks and a service topology without editing application code. Do not adopt it as a lightweight single-node tracer or on a team that cannot operate HBase, because the storage layer is part of the install. Before committing, verify the exact plugin entries for your framework and version under agent-module/plugins, and confirm your JDK is 8 or newer.
Frequently asked questions
How to install Pinpoint APM?
The README points to a quick-start guide for a simple test run and a separate installation guide for real deployments, both on the project's GitBook site. There is also a quickstart directory in the repository with a testapp, and a separate pinpoint-kubernetes repository for Kubernetes deployments.
How do you use Pinpoint to trace a Java application?
You attach the agent to the JVM at startup with the -javaagent flag and set the agent id and application name, so no application code changes are needed. Once the application serves traffic, it appears in the web UI where ServerMap and CallStack show the traced transactions.
What does the Pinpoint APM agent support?
The README lists JDK 8 and above plus plugins for servlet containers such as Tomcat, Jetty and Undertow, Spring and Spring Boot, HTTP clients including Apache HttpClient and OkHttpClient, and RPC or messaging libraries such as Thrift, DUBBO, GRPC, ActiveMQ and RabbitMQ. Each plugin directory under agent-module/plugins lists its own supported version range.
What storage does the Pinpoint collector need?
The repository contains an hbase module, commons-hbase and an hbase-testcluster, which indicates the collector writes traces to HBase. The README does not describe an alternative storage backend, so HBase is part of the deployment you have to operate.
Does Pinpoint slow down the monitored application?
The README states that Pinpoint has minimal impact on performance, approximately a 3% increase in resource usage. That figure is the project's own claim and the README gives no measurement conditions behind it.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/pinpoint-apm-pinpoint)