1. 概述

在本教程中,我们将探索 Pinpoint,这是一个具有出色功能的开源 APM(应用程序性能管理)软件。

首先,我们将看到其基本架构及其组成部分的基本原理。然后,我们将查看实时性能监控的运行示例。

2. Pinpoint 架构

让我们看看 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”应用时,我们会看到这个网页:

pinpoint 欢迎

我们可以清楚地看到我们做出了三个 web 请求,其中两个由应用本身解决,另一个指向外部服务 maps.googleapis.com.

此外,我们可以从围绕应用的圆圈的颜色看到其中一个请求被认为是“慢”的,因为它花费了超过五秒的时间完成。

如果我们现在点击“检查器”,我们可以看到关于 Java 应用程序状态的详细信息,包括 内存CPU响应时间:

pinpoint 检查器

3.2. Pinpoint JVM 代理

我们可以访问 Pinpoint APM 记录的每个请求的详细信息。通过在主页上的 Apdex 图 上使用鼠标点击并拖动,可以选择已跟踪的部分请求:

Pinpoint JVM 代理

然后,在新标签页中可以看到所有注册的调用列表以及详细信息的 调用树

pinpoint 跟踪

使用这个图表,我们可以分析每个请求的完整调用堆栈。这对于识别瓶颈或减速非常有用。同时,也可以检查第三方应用的意外行为。

这是 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 代理和外部收集器。


» 下一篇: DevOps 概述