Top 13 open source Application Performance Monitoring(APM) tools in 2021
Tags: devops, opensource, sre, monitoring
Published: 2021-07-28 12:46:27

Businesses are embracing digital transformation now more than ever. In most cases, the digital channel is the primary driver of revenue and growth. Customers and end-users are going online to fulfill both their daily and long-term needs.

The digital shift has made the app production environment a critical piece of an organization's success. The performance of your application in production needs to be monitored to ensure high availability at all times. Not only that, but organizations also need to monitor any latency issues in serving user's requests. As they say, __"Slow is the new down"__ in today's competitive digital landscape.

This has led to the birth of a number of application performance monitoring tools. Open source APM tools have added benefits over their SaaS counterparts as the source code is available to your org's developers.

__Benefits of Open Source APM tool over SaaS APM tools:__

- Customization - You can customize the tool's source code to suit your needs.
- Self-hosting - You don't need to send your data outside your environment. With privacy laws becoming more stringent, this might be the future of APM tools.
- Developer First - Your org's developers can look under the hood of an open source APM tool. They can decide for themselves whether the tool meets their requirements or not.
- Community support - Open source tools have active communities around them. Communities ensure code accountability and support. You can directly influence a product's roadmap by raising GitHub issues.

But first, let's understand what is application performance monitoring and why is it needed?

## What is application performance monitoring(APM)?
Application performance monitoring is the process of keeping your app's health in check. APM tools enable you to be proactive about meeting the demands of your customers.

## Why is application performance monitoring(APM) needed?
A robust APM tool can provide your engineering teams the much-needed visibility and context into the inner workings of your application. Modern distributed systems have enabled scale at a global scale but at the same time have increased the complexity of an application.

A few essential APM benefits in solving performance issues are as follows:

- Gives a __centralized context and visibility__ into the app's inner workings across a distributed system
- Allows you to __proactively identify issues__ that can cause breakdown and solves latency issues
- Helps you to __meet end-user expectations__ and demands
- __Increase revenue__ by protecting against downtime and user churn
- __Saves engineering bandwidth__ in debugging and troubleshooting

__List of top 13 open source APM tools in 2021__

- [SigNoz](#signoz)
- [Graphite](#graphite)
- [Pinpoint](#pinpoint)
- [Prometheus](#prometheus)
- [Javamelody](#javamelody)
- [Stagemonitor](#stagemonitor)
- [Scouter](#scouter)
- [Zipkin](#zipkin)
- [Jaeger](#jaeger)
- [Apache Skywalking](#apache-skywalking)
- [Elastic APM](#elastic-apm)
- [App Metrics](#app-metrics)
- [Glowroot](#glowroot)

## Top Open Source APM Tools
Now let's explore the top 13 open source APM tools in 2021.

### SigNoz
<p align="left">
 🌐 <a href = "https://signoz.io/" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/SigNoz/signoz" target="_blank" >GitHub</a>
</p>

SigNoz is a full-stack open source APM and observability tool. It captures both metrics and traces with log management currently in the product roadmap. Logs, metrics, and traces are considered to be the three pillars of observability in modern-day distributed systems. Using SigNoz, you can track things like:

- User requests per second
- 50th, 90th, and 99th percentile latencies of microservices in your application
- Error rate of requests to your services
- Slow endpoints in your application
- User requests across different microservices using distributed tracing

Without distributed tracing, you can not monitor and troubleshoot user requests across multiple services. As SigNoz supports distributed tracing, you can have code-level visibility of where your user requests are failing. That's why SigNoz is most suited as an open source APM tool for microservices-based application architectures.

![SigNoz Architecture Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x84vkyvstdl2xy3q6l3m.png)<figcaption>SigNoz Architecture with ClickHouse as storage backend</figcaption>

Monitoring starts with instrumenting your code. SigNoz supports OpenTelemetry for instrumentation which is a vendor-agnostic instrumentation library. That means you are never locked on the SigNoz platform.It also comes with out of the box charts and visualization so that you can get started right away.

![SigNoz Dashboard showing RED metrics](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5eox8ty13ji0ucefc7b.png)<figcaption>Capture RED metrics (Rate of requests, Error rate and Duration) and visualize it with SigNoz</figcaption>

You can choose between industry-standard Kafka+Druid or fast OLAP database ClickHouse as the storage backend. The query service is written in GO, and the frontend is built with Typescript.

### Graphite
<p align="left">
 🌐 <a href = "https://graphiteapp.org/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/graphite-project/graphite-web" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Graphite is a time-series monitoring tool that was released in 2008. Graphite consists of three software components:

- __Carbon__ - a service that listens for time-series data
- __Whisper__ - a database library for storing time-series data
- __Graphite-web__ - Graphite's user interface & API for rendering graphs and dashboards

The primary purpose of Graphite is to store numeric time-series data and render graphs of this data. Time-series data is a sequence of data points for a particular metric indexed over time. It can give you insights into the performance of any application, process, or service.

Graphite does not do data collection. Instead, your app needs to be configured to send data to Graphite which passively listens for data using Carbon - a Twisted daemon. Carbon then sends the data to Whisper to store the time-series data to a filesystem.

![Graphite architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q4ecocxdvydo4eqj5y4v.png)<figcaption>Graphite Architecture (Source: Graphite documentation)</figcaption>

Graphite comes with an in-built UI, but that is fairly basic. Usually, for visualizations, Graphite is clubbed together with Grafana, which is an open source visualization tool.

![Graphite APM tool dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyxe9i88ede8mn8zltk1.png)<figcaption>Graphite's UI (Source: Nuxeo)</figcaption>

### Pinpoint
<p align="left">
 🌐 <a href = "https://pinpoint-apm.github.io/pinpoint/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/pinpoint-apm/pinpoint" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Pinpoint is an open source APM tool meant for large-scale distributed systems written in Java, Python, or PHP. This project is inspired and modeled after Google's Dapper. It traces transactions across different components of an application and provides insights to identify potential issues. Some of the key features of the Pinpoint APM tool includes:

- Application topology at a glance
- Real-time application monitoring
- Code-level visibility to every transaction
- APM agents which require minimal changes to code
- Minimal impact on performance

![Pinpoint APM tool architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k8pcu2b8xwj0vckvsxad.png)<figcaption>Architecture of Pinpoint (Source: Pinpoint Documentation)</figcaption>

The main purpose of the Pinpoint APM tool is to identify and track how transactions flow between different components of a system. It does not track logs and metrics.

![Pinpoint dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3ww0d5ktlc26kuap4ot.png)<figcaption>Pinpoint Dashboard (Source: Pinpoint documentation)</figcaption>

### Prometheus
<p align="left">
 🌐 <a href = "https://prometheus.io/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/prometheus/prometheus" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Prometheus enables you to capture time-series data as metrics. These metrics can be aggregated to give insights into the behavior of our systems.

It was initially developed at SoundCloud in 2012 before being released as an open-source project. It was the second project to graduate from CNCF after Kubernetes.

Prometheus monitoring stack includes the following components:
- Prometheus server
- Client Libraries & Exporters
- Push Gateway
- Alertmanager
- Visualization Layer

![Prometheus APM tool architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cbhff7ldiccyc7jmiugw.png)<figcaption>Prometheus Architecture (Source: Prometheus Documentation)</figcaption>

Prometheus does not do distributed tracing but can be used effectively to monitor time-series data as metrics. It also has some limitations at scale as it is designed for a single machine.
The visualization layer of Prometheus is basic, but it is generally used with Grafana, a visualization tool to create charts and graphs.

![Prometheus Expression Browser](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c8ofnm1fzgozao7b9ho5.png)<figcaption>Prometheus Expression Browser</figcaption>

![Grafana dashboard visualizing Prometheus metrics](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4iq11r88lu2td351opdu.png)<figcaption>Grafana used for visualization with Prometheus</figcaption>

### Javamelody
<p align="left">
 💻 <a href = "https://github.com/javamelody/javamelody" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Javamelody is an open source APM tool that aims to monitor Java or Java EE applications in QA and production environments. It is mainly used to track and measure the statistics of requests on an application based on its usage.

Some of the key metrics captured by the Javamelody APM tool are as follows:

- Number of executions, mean execution time
percentage of errors of HTTP requests, SQL requests, JSF actions, struts actions
- Java memory usage and CPU usage
- Number of user sessions
- Number of JDBC connections

![Charts shown on JavaMelody dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ccerfdjgyfpz878x8bpb.png)<figcaption>Charts provided by Javamelody APM tool (Source: Javamelody GitHub repo)</figcaption>

### Stagemonitor

<p align="left">
 🌐 <a href = "https://www.stagemonitor.org/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/stagemonitor/stagemonitor" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Stagemonitor is an open source APM tool for Java server applications. It enables you to monitor the performance of your Java web app throughout its lifecycle in development, QA, and production. It monitors applications with the help of servlet filters and bytecode manipulation.

Stagemonitor integrates well with time-series databases like ElasticSearch, Graphite, and InfluxDB to analyze graphed metrics and Kibana to analyze requests and call stacks.

Some of the key features of Stagemonitor APM tool includes:

- Development-time Monitoring
- Production Monitoring
- Preconfigured Dashboards

![Architecture diagram of Stagemonitor APM tool](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y3ba0o0yw655j8878s8m.png)<figcaption>Stagemonitor architecture (Source: Stagemonitor GitHub repo)</figcaption>

### Scouter
<p align="left">
 💻 <a href = "https://github.com/scouter-project/scouter" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Scouter is an open source APM tool written in Java, Javascript, and Scala. It captures and shows metrics about users, services, and resources. Some of the key metrics that Scouter captures:
- Users - active users and recent users
- Services - Active service, TPS, Response time, Application profiles
- Resources - Cpu, Memory, Network and Heap usage, Connection pools, etc.

![Architecture diagram of Scouter APM tool](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vxoninqaow47y5xcnhz1.png)<figcaption>Scouter Architecture (Source: Scouter GitHub repo)</figcaption>

Scouter's architecture consists of the following components:

- Server also called Collector to process data transferred by the host
- Host Agent to capture metrics for CPU, Memory, Disk performance
- Java Agent to capture performance data of the Java program such as heap memory, thread, profiles
- Client(Viewer) to visualize collected data

![Charts visualized with Scouter APM](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xth2co9hlyzjuuoj34jc.png)<figcaption>Scouter UI (Source: Scouter GitHub repo)</figcaption>

### Zipkin
<p align="left">
 🌐 <a href = "https://zipkin.io/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/openzipkin/zipkin" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Zipkin is an open source APM tool used for distributed tracing. Zipkin captures timing data need to troubleshoot latency problems in service architectures. In distributed systems, it's a challenge to trace user requests across different services. If a request fails or takes too long, distributed tracing helps to identify the events that caused it.

Zipikin was initially developed at Twitter and drew inspiration from Google's Dapper. Unique identifiers called Trace ID are attached to each request which then identifies that request across services.

Zipkin's architecture includes:

- Reporters to send data to Zipkin
- Collectors which persist trace data to storage
- API to query data
- UI

![Zipkin architecture diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cf1150yo13dvkhl8xtno.png)<figcaption>Zipkin architecture (Source: Zipkin website)</figcaption>

Zipkin's in-built UI is limited, and you can use Grafana or Kibana from the ELK stack for better analytics and visualizations.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/37aj893d3o9pxblafgoz.png)<figcaption>Zipkin dashboard showing traces</figcaption>

It also includes a dependency diagram that shows how many user requests went through each service. It can help you to identify error paths and calls to deprecated services.

![Zipkin dependency diagram to show user requests across services](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ge0a4rssyebrvh86h90.png)<figcaption>Zipkin dependency diagram (Source: GitHub repo)</figcaption>

### Jaeger
<p align="left">
 🌐 <a href = "https://www.jaegertracing.io/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/jaegertracing/jaeger" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Jaeger is an open source APM tool developed at Uber, which was later donated to Cloud Native Computing Foundation(CNCF). Inspired by Google's Dapper, Jaeger is a distributed tracing system.

It is used for monitoring and troubleshooting microservices-based distributed systems. Some of its key features include:

- Distributed context propagation
- Distributed transaction monitoring
- Root cause analysis
- Service dependency analysis
- Performance / latency optimization

![Architecture diagram of Jaeger APM](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hs0o4o99qlp3n508w69t.png)<figcaption>Jaeger Architecture (Source: Uber Engineering)</figcaption>

Jaeger supports two popular open source NoSQL databases as trace storage backends: Cassandra and Elasticsearch. Jaeger's UI can be used to see individual traces. You can also filter the traces based on service, duration, and tags.

![Jaeger UI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p1jsxmzjb2c9ejv1r13d.png)<figcaption>Jaeger UI showing list of filtered traces</figcaption>

### Apache Skywalking
<p align="left">
 🌐 <a href = "https://skywalking.apache.org/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/apache/skywalking" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

This open source APM tool is focused on monitoring distributed systems, including microservices, cloud-native, and container-based architectures. Some of the key features of the APM tool includes:

- Service, service instance, endpoint metrics analysis
- Root cause analysis with code profiling
- Service topology map analysis
- Slow services and endpoint detection
- Distributed tracing and context propagation

Skywalking also supports the collection of telemetry data in multiple formats.

![Skywalking dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrom2teijh8uf7uqd5eh.png)<figcaption>Skywalking dashboard (Source: Skywalking website)</figcaption>

### Elastic APM
<p align="left">
 🌐 <a href = "https://www.elastic.co/apm/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/elastic/apm-server" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

You might already be familiar with Elasticsearch. Elastic APM is an open source application performance monitoring tool built on top of the ELK stack (Elasticsearch, Logstash, Kibana). It consists of 4 main components:

- APM agents - These are open source libraries installed in your services for collecting performance data.
- APM server -It is a separate component that is free and open source. It receives performance data from the APM agents. The APM server validates and processes events from the APM agents.
- Elasticsearch - It is used to store the APM performance metrics.
- Kibana - It is a visualization platform designed to work with Elastsearch.

![Elastic APM architecture diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b4fezegr24238c49k2fa.png)<figcaption>Elastic APM architecture (Source: Elastic APM documentation)</figcaption>

With Kibana, you can have visualize your requests and services.

![Service maps on Elastic APM dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dd29n2shgklr2r492iyb.png)<figcaption>Service Maps in Elastic APM (Source: Elastic APM website)</figcaption>

### App Metrics
<p align="left">
 🌐 <a href = "https://www.app-metrics.io/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/AppMetrics/AppMetrics" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

App Metrics is an open source and cross-platform .NET library that can be used to capture application metrics within any .NET application. App Metrics provides extensions to report to various open source time-series databases. It also provides dashboards to visualize application metrics in real-time. Some of the key features of this open source APM tool includes:

- Track metrics for any type of .NET applications
- Measure the performance and error of each endpoint in an MVC or Web API project
- Freedom to choose where to persist captured metrics and which dashboard tool to use for visualization

App Metrics does not include a visualization tool, but it does provide App Metrics specific Grafana dashboards.

![Grafana charts for visualization of App Metrics](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6cny631lxtj5huytv87v.png)<figcaption>App Metrics dashboard using Grafana (Source: App Metrics website)</figcaption>

### Glowroot
<p align="left">
 🌐 <a href = "https://glowroot.org/" rel="noopener noreferrer nofollow" target="_blank" >Website</a> <br>
 💻 <a href = "https://github.com/glowroot/glowroot" rel="noopener noreferrer nofollow" target="_blank" >GitHub</a>
</p>

Glowroot is an open source Java APM tool. It is used to monitor Java-based applications. Glowroot can be implemented in two ways:
- With embedded collectors that can be used to monitor stand-alone applications
- With central collector that can be used to monitor distributed systems

![Glowroot architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psqde1u1jzdrq3hq0xnv.png)<figcaption>Glowroot architecture diagram</figcaption>

Glowroot agents help to capture metrics like:
- API’s average response time
- The average time taken by DB queries
- Trace capture for slow requests and errors
- Continuous profiling

## How to choose the right open source APM tool for you?
Choosing the right open source APM tool is critical to your team's ability to monitor and troubleshoot issues in your deployed application. If you are going for an open source tool, you must ensure that the tool is being actively developed on GitHub. You can ask yourself the following questions before choosing any open source tool:

- How recent was the last commit made?
- Are the maintainers of the repo responsive?
- How active is the community around the tool?
- Is the tool based on the latest industry-standard components?

But this is just one aspect. Another aspect is whether the tool serves all your needs for application monitoring or not. You don't want your team to manage multiple tools for end-to-end visibility into the performance of your apps.

Logs, metrics, and traces form the three cornerstones of full-stack APM tools. In that scenario, a tool like [SigNoz](https://github.com/SigNoz/signoz) can serve all your needs for application monitoring. As the instrumentation is based on OpenTelemetry, you also have the added advantage of not being locked into any product. You can try out SigNoz by visiting its GitHub repo 👇

{% github signoz/signoz %}

If you want to read more about SigNoz 👇
[Golang Application Performance Monitoring with SigNoz](https://signoz.io/blog/monitoring-your-go-application-with-signoz/)
[Nodejs Application Performance Monitoring with SigNoz](https://signoz.io/blog/nodejs-opensource-application-monitoring/)