在信息技术和系统管理领域,使用 Application Performance Management(应用程序性能管理)来监控和管理应用程序的性能和可用性。APM 致力于检测和诊断复杂的应用程序性能问题,以保持预期的服务级别,将 IT 指标转化为业务价值。
Pinpoint 是一个开源的、主流的 APM 实现,灵感来自 Google Dapper,使用 Java、PHP、Python 开发。全球有数百万用户使用它分析架构以及跨分布式应用程序组件之间的互联。
本文将通过以下主题,介绍 Pinpoint 的自动化部署,以及如何配置它监控应用:
- Pinpoint 介绍
- 自动化部署 Pinpoint
- 访问 Pinpoint Web UI
- 配置监控
- 总结
39.1 PinPoint 介绍
本节主要从两方面讨论 Pinpoint。
39.1.1 Pinpoint 架构
Pinpoint 架构如下:
图39.1, PinPoint 架构图,图片来自 PinPoint 官网
从图中可以看到四个主要组件:
- Pinpoint Collector:Web 应用程序,收集应用数据
- HBase Storage:开源的非关系数据库,存储 Pinpoint 数据
- Pinpoint Web UI:Pinpoint 前端
- Pinpoint Agent:将应用程序的数据发送到 Pinpoint Collector
39.1.2 Pinpoint 特性
以下是 Pinpoint 的相关特性,也是它为什么在众多 APM 中脱颖而出的原因:
- 提供云和主机监控;
- 分布式事务跟踪,用于跨分布式应用程序跟踪;
- 应用程序拓扑概览,跟踪所有组件之间的事务,以识别潜在的问题;
- 轻量级,对系统性能影响较小;
- 提供代码级可见性,轻松识别故障点和瓶颈;
- 事务代码级可见性,响应模式和请求计数;
- 提供字节码检测技术,使用中无需修改应用程序代码;
- 自动检测应用程序拓扑,帮助技术人员了解应用程序配置;
- 实时监控,实时观察活动线程;
- 水平可扩展,支持大规模服务器组。
39.2 自动化部署 Pinpoint
本节演示如何使用 Ansible 与 Docker,完成 Pinpoint 的自动化部署。
文中使用的代码已提交至 GitHub,可以在对应目录中查询。
39.2.1 要求
Ansible 主机可通过具有 sudo 权限的用户免密登录 Pinpoint 主机。
有关 sudo 及免密的配置,可以参考之前的文章,或在 GitHub 代码中查看。
39.2.2 克隆代码到 Ansible 节点
在 Ansible 节点上执行以下命令,将自动化代码克隆到本地:
$ git clone https://github.com/weiwendi/automate.git
进入 automate/playbook/
目录,里面包含了很多组件的自动化部署。在本篇文章中,主要用到了 docker
和 pinpoint
两个目录。
39.2.3 安装 Docker
进入 docker/
目录,修改 hosts
文件,指定 Pinpoint 主机名或 IP。例如我的 Pinpoint 主机 IP 为 10.211.55.69、主机名为 common.server.aiops.red,hosts 文件内容如下:
[nodes]
common.server.aiops.red
需要根据实际的 IP 或主机名称替换 'common.server.aiops.red'。
安装 Docker:
ansible-playbook -i hosts playbook.yaml
39.2.4 安装 Pinpoint
切换到 pinpoint
目录:
cd ../pinpoint/
首先修改 hosts
文件,就像安装 Docker 时那样,将 Pinpoint 主机的 IP 或主机名写入该文件。
然后执行 possibleReboot.yaml
文件,它的作用是:
- 关闭 Selinux
- 关闭 Firewalld
- 更新软件包
关闭 Selinux 和更新软件包的过程,都可能会重启服务器,因此把这个文件独立出来,用于初次部署时执行。
执行 possibleReboot.yaml
文件:
ansible-playbook -i hosts possibleReboot.yaml
最后,执行以下命令安装 Pinpoint:
ansible-playbook -i hosts playbook.yaml
该命令执行时间比较长,执行过程中可能会遇到报错。报错很可能是从 GitHub 下载 pinpoint-docker 项目时的网络原因导致。
注意:
要想在自动化过程中避免下载 GitHub 代码的网络超时引发的错误,可以提前手动将 pinpoint-docker 项目的代码克隆到 Pinpoin 主机指定的目录下,然后注释 ../../roles/pinpoint/tasks/main.yml
文件中以下内容:
- name: clone pinpoint-docker project task
ansible.builtin.git:
repo: 'https://github.com/pinpoint-apm/pinpoint-docker.git'
dest: "{{ deployDir }}"
single_branch: true
version: "{{ version }}"
在 ../../roles/pinpoint/defaults/main.yml
文件中定义了两个变量:
---
# defaults file for pinpoint
#
deployDir: /software/repos/pinpoint-docker
version: 2.5.2
- deployDir:存放 pinpoint-docker 项目的目录
- version:Pinpoint 版本
39.3 访问 Pinpoint Web UI
在浏览器中输入 Pinpoint 主机 IP:8080 访问 Pinpoint Web UI。如果能正常打开页面,说明部署顺利完成。如果打不开页面,需要通过 docker ps -a 命令和 docker logs 等命令查看 Pinpoint 容器的运行情况,以及检查网络连通性。
此时 Pinpoint 并没有监控数据,需要通过 Pinpoint Agent,收集监控对象的数据。下一节我会通过三个示例演示如何监控 Java 程序。
39.4 配置监控
本节通过演示配置 Pinpoint APM 监控 Zookeeper、Kafka 和 Tomcat,来介绍 Pinpoin 如何使用、以及它的易用性。
39.4.1 下载 Pinpoint Agent
在 GitHub pinpoint-apm 中下载对应版本的 Agent。
示例中解压到了被监控组件主机的 /opt/pagent252/
。
修改 /opt/pagent252/profiles/release/pinpoint.config
文件,把文件中所有 127.0.0.1 的地址,修改为 Pinpoint 主机的 IP 地址。
39.4.2 监控 Zookeeper
修改 Zookeeper 的启动文件,进入 Zookeeper 主目录,编辑 bin/zkServer.sh
,增加以下内容:
start)
echo -n "Starting zookeeper ... "
if [ -f "$ZOOPIDFILE" ]; then
if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2 >&1; then
echo $command already running as process `cat "$ZOOPIDFILE"`.
exit 1
fi
fi
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}"
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
-javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar # 新增内容
-Dpinpoint.agentId=zk01 # 新增内容
-Dpinpoint.applicationName=zk # 新增内容
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2 >&1 < /dev/null &
...
- -javaagent :指定 Pinpoint Agent 包路径;
- -Dpinpoint.agentId :全局唯一 ID,可以与 applicationName 关联定位应用;
- -Dpinpoint.applicationName :应用名称,对于多副本部署的应用,该名称应设置为相同的值,通过 -Dpinpoint.agentId 的不同进行区分。
重启 Zookeeper 服务,使配置生效。
查看 Pinpoint Web UI,可以看到类似以下界面:
图39.2, 监控 zk
39.4.3 监控 Kafka
在 Kafka 主机上准备好 Pinpoint Agent。修改 Kafka 的启动文件,通常位于 Kafka 目录的 bin/kafka-run-class.sh
。修改以下内容:
if [ "x$DAEMON_MODE" = "xtrue" ]; then
nohup "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpin
point.agentId=kafka2 -Dpinpoint.applicationName=kafka $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2 >&1 < /dev/null &
else
exec "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpinp
oint.agentId=kafka2 -Dpinpoint.applicationName=kafka $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@"
fi
-javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpin point.agentId=kafka2 -Dpinpoint.applicationName=kafka
为新增内容。
重启 Kafka 服务,使配置生效。再次查看 Web UI:
图39.3, 监控 Kafka
39.4.4 监控 Tomcat
在 Tomcat 节点上,准备好 Pinpoint Agent。
修改 Tomcat bin/catalina.sh
文件,在文件开始部分增加以下内容:
#!/bin/sh
# 新增内容
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=tomcat1"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=tomcat"
保存并重启 Tomcat 服务,然后查看 Web UI:
图39.4 监控 Tomcat 内存堆栈等使用
再来看看 Tomcat 调用链路拓扑及接口响应信息:
图39.5, 链路追踪与自动生成拓扑
39.5 总结
Pinpoint APM 是常用的链路跟踪及监控工具,本教程演示了 Pinpoint APM 的自动化部署,以及如何配置 Pinpoint 监控 Java 程序。教程同样适用于其他基于 RPM 的 Linux 发行版。
-
Linux
+关注
关注
87文章
11355浏览量
210686 -
开源
+关注
关注
3文章
3425浏览量
42800 -
应用程序
+关注
关注
38文章
3299浏览量
57994 -
APM
+关注
关注
1文章
72浏览量
13059
发布评论请先 登录
相关推荐
工控仪器自动化
招聘自动化、电气自动化、自动化控制工程师
实现工业自动化的市场阻碍
七个步骤实现自动化测试
基于IAR EW编译工具实现Linux系统上自动化构建
风河Linux平台构建新型家庭自动化网关
云平台的自动化部署设计与实现
![云平台的<b class='flag-5'>自动化</b><b class='flag-5'>部署</b>设计与实现](https://file.elecfans.com/web1/M00/46/0C/pIYBAFqPd-6AIl11AACEScSY6IU006.jpg)
数据中心如何实现自动化部署
5G承载网络建设向自动化部署的方向迈出坚实的步伐
部署Linux的最佳实践探索
Jenkins 与 SonarQube 集成部署,自动化代码质量监控
![Jenkins 与 SonarQube 集成<b class='flag-5'>部署</b>,<b class='flag-5'>自动化</b>代码质量监控](https://file1.elecfans.com//web3/M00/05/21/wKgZPGd88t6AK9YwAAEA4xEY1H4138.png)
基于 Docker 与 Jenkins 实现自动化部署
![基于 Docker 与 Jenkins 实现<b class='flag-5'>自动化</b><b class='flag-5'>部署</b>](https://file1.elecfans.com//web3/M00/05/21/wKgZPGd88vSARHEhAAEA43MSbXE167.png)
评论