1. 概述
在本教程中,我们将探索 Pinpoint,这是一个具有出色功能的开源 APM(应用程序性能管理)软件。
首先,我们将看到其基本架构及其组成部分的基本原理。然后,我们将查看实时性能监控的运行示例。
2. Pinpoint 架构
让我们看看 Pinpoint 的架构:
从这个图中,我们可以识别出四个主要组件:
- Pinpoint 收集器:收集配置应用数据的网络应用
- HBase 存储:存储 Pinpoint 数据的非关系型开源数据库
- Pinpoint Web UI:软件的前端
- Pinpoint 代理:JVM 代理,将应用程序的性能数据发送到 Pinpoint 收集器
Pinpoint 收集器是软件的心脏。它可以以两种不同的方式收集数据。第一种是显式收集数据——应用程序直接调用 Pinpoint API。第二种是自动收集,依赖于字节码增强,这意味着 Pinpoint 在类加载时修改应用代码,向收集器添加 TCP/UDP 网络调用。
3. 运行示例
现在,我们将使用已经组成的 Pinpoint 应用环境运行一个快速启动示例,使用 *[docker-compose]*:
$ git clone https://github.com/pinpoint-apm/pinpoint-docker.git
$ cd pinpoint-docker
$ docker-compose pull && docker-compose up -d
最后一个命令可能需要一些时间执行,因为它下载并启动与 Pinpoint 快速启动展示相关的所有环境。
在运行结束时查看启动的容器,我们可以看到构成基础设施的一些额外组件:
- Pinpoint-QuickStart:我们正在监控的基于 Tomcat 的示例应用程序
- Pinpoint-Flink:使应用检查器启用,用于检查应用程序的资源
- Pinpoint-Zookeeper:使用 Pinpoint 的 [Zookeeper] 图像的一个例子
- Pinpoint-Mysql 和 Pinpoint-Batch:用于设置警报
现在,让我们击打示例应用程序的一些端点,以便 APM 有指标可以跟踪。在地址 http://localhost:8085 我们会被提示一个可以调用的端点列表。对于此演示,让我们通过点击这些相对链接做出三个 HTTP 请求:
- callSelf/getCurrentTimestamp
- callSelf/httpclient4/getGeoCode
- consumeCpu
3.1. Web 客户端
现在,让我们访问 web 客户端,地址 *http://localhost:8080*。在这里,当我们从应用列表中选择“quickapp”应用时,我们会看到这个网页:
我们可以清楚地看到我们做出了三个 web 请求,其中两个由应用本身解决,另一个指向外部服务 maps.googleapis.com.
此外,我们可以从围绕应用的圆圈的颜色看到其中一个请求被认为是“慢”的,因为它花费了超过五秒的时间完成。
如果我们现在点击“检查器”,我们可以看到关于 Java 应用程序状态的详细信息,包括 内存、CPU 和 响应时间:
3.2. Pinpoint JVM 代理
我们可以访问 Pinpoint APM 记录的每个请求的详细信息。通过在主页上的 Apdex 图 上使用鼠标点击并拖动,可以选择已跟踪的部分请求:
然后,在新标签页中可以看到所有注册的调用列表以及详细信息的 调用树:
使用这个图表,我们可以分析每个请求的完整调用堆栈。这对于识别瓶颈或减速非常有用。同时,也可以检查第三方应用的意外行为。
这是 Pinpoint JVM 代理向用户提供的详细堆栈跟踪。让我们看看如何启动受监控的 Java 应用:
pinpoint-quickstart:
//...
environment:
JAVA_OPTS: -javaagent:/pinpoint-agent/pinpoint-bootstrap-${PINPOINT_VERSION}.jar ...
在 docker-compose.yaml 配置中添加的 JAVA_OPS 环境变量配置 JVM 监控应用以启动带有 Pinpoint Java 代理。然后,软件自动且透明地对字节码进行增强,以跟踪每次上下文切换期间的所有调用。
4. 总结
在这篇文章中,我们研究了 Pinpoint APM,这是一个帮助我们一眼了解应用拓扑的开源工具。我们看到了如何以非侵入性的方式实时监控每个事务,通过 JVM 代理和外部收集器。