一、pinpoint 简介
pinpoint 是开源在github上的一款APM监控工具,使用java编写。Pinpoint是一款全链路分析工具,提供基于javaagent无侵入式的调用链监控、方法执行详情查看、应用状态信息监控等功能。对标国内的skywalking,Pinpoint是一款比较轻量级的apm工具。支持以下功能:
服务拓扑图:对整个系统中应用的调用关系进行了可视化的展示,单击某个服务节点,可以显示该节点的详细信息,比如当前节点状态、请求数量等
实时活跃线程图:监控应用内活跃线程的执行情况,对应用的线程执行性能可以有比较直观的了解
请求响应散点图:以时间维度进行请求计数和响应时间的展示,通过拖动图标可以选择对应的请求查看执行的详细情况
请求调用栈查看:对分布式环境中每个请求提供了代码维度的可见性,可以在页面中查看请求针对到代码维度执行详情,帮助查找请求的瓶颈和故障原因
应用状态、机器状态检查:可以查看相关应用程序详细信息比如cpu、内存、gc、tps、jvm等
二、架构组成
Pinpoint 主要涉及四个组件:Hbase用于做数据存储,agent 用于采集被监控的应用数据,基于javaagent,采用字节码方式解析数据,对应用无入侵,只需要在启动命令加入部分参数即可,collector 是对接agent用于接收数据,存储在Hbase,web ui 是提供页面数据展示;
三、安装
由于Hbase的安装需要部署zookeeper集群用于配置Hbase,关于这块我手动部署了下,部署相对过于复杂不适合quickstart 或新手部署,所以建议大家使用docker来部署,本篇文档也是通过docker部署来带大家学习了解。
安装思路主要是安装docker、docker-compose,然后通过dockerfile 编译镜像,通过docker-compose进行编排部署。
3.1 安装docker
# 在线部署
wget https://download.docker.com/linux/static/stable/x86_64/docker-23.0.6.tgz
3.1.1 上传镜像及docker二进制文件
tar zxvf docker-23.0.6.tgz
mv docker/* /usr/bin
3.1.2 添加docker到systemd
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
开机启动
systemctl enable docker
3.1.3 修改data目录
mkdir -p /data/docker
cat >> /etc/docker/daemon.json << EOF
{
"data-root": "/data/docker"
}
EOF
systemctl daemon-reload && systemctl restart docker
3.2 下载pinpoint-docker文件
# 获取pinpoint:https://github.com/pinpoint-apm/pinpoint-docker/releases
wget -P /data1/pinpoint https://github.com/pinpoint-apm/pinpoint-docker/archive/refs/tags/2.5.3.tar.gz
# 解压
tar -zvxf 2.5.3.tar.gz
#pinpoint 目录结构如下:
[root@uat-travelsky-aiops-jms pinpoint]# ll pinpoint-docker-2.5.3/
-rw-rw-r-- 1 root root 8404 10月 11 2023 docker-compose-metric.yml
-rw-rw-r-- 1 root root 10623 10月 11 2023 docker-compose.yml
drwxrwxr-x 2 root root 22 10月 11 2023 docs
-rw-rw-r-- 1 root root 11355 10月 11 2023 License
drwxrwxr-x 3 root root 92 10月 11 2023 pinpoint-agent
drwxrwxr-x 4 root root 32 10月 11 2023 pinpoint-agent-attach-example
drwxrwxr-x 3 root root 92 10月 11 2023 pinpoint-batch
drwxrwxr-x 3 root root 117 10月 11 2023 pinpoint-collector
drwxrwxr-x 4 root root 110 10月 11 2023 pinpoint-flink
drwxrwxr-x 3 root root 134 10月 11 2023 pinpoint-hbase
drwxrwxr-x 2 root root 79 10月 11 2023 pinpoint-mysql
drwxrwxr-x 3 root root 92 10月 11 2023 pinpoint-quickstart
drwxrwxr-x 3 root root 117 10月 11 2023 pinpoint-web
drwxrwxr-x 2 root root 32 10月 11 2023 pinpoint-zookeeper
-rw-rw-r-- 1 root root 10874 10月 11 2023 Readme.md
这里其实不得不说,因为pinpoint也是安装微服务方式去设计的,看pinpoint的dockerfile编写和目录设计,对于我们要如何设计自己的微服务docker部署方式是有一些借鉴意义的。
3.3 docker-compose 启动服务
docker-compose 略
3.3.1 拉取基础镜像
[root@uat-travelsky-aiops-jms pinpoint-docker-2.5.3]# docker-compose pull
[+] Running 85/55
? taskmanager Skipped - Image is already being pulled by jobmanager 0.0s
? zoo1 Skipped - Image is already being pulled by zoo3 0.0s
? zoo2 Skipped - Image is already being pulled by zoo3 0.0s
? pinpoint-mysql 12 layers [????????????] 0B/0B Pulled 536.1s
? jobmanager 13 layers [?????????????] 0B/0B Pulled 230.9s
? pinpoint-batch 4 layers [????] 0B/0B Pulled 432.5s
? pinpoint-hbase 10 layers [??????????] 0B/0B Pulled 463.7s
? zoo3 8 layers [????????] 0B/0B Pulled 377.0s
? pinpoint-quickstart 11 layers [???????????] 0B/0B Pulled 352.1s
? pinpoint-web 4 layers [????] 0B/0B Pulled 451.0s
? pinpoint-collector 8 layers [????????] 0B/0B Pulled 415.9s
? pinpoint-agent 3 layers [???] 0B/0B Pulled
3.3.2 备份镜像
这里主要是为了其他环境离线部署,实际测试部署不需要执行此步骤
docker save \
pinpointdocker/pinpoint-hbase:2.5.3 \
pinpointdocker/pinpoint-flink:2.5.3 \
pinpointdocker/pinpoint-web:2.5.3 \
pinpointdocker/pinpoint-collector:2.5.3 \
pinpointdocker/pinpoint-mysql:2.5.3 \
pinpointdocker/pinpoint-agent:2.5.3 \
pinpointdocker/pinpoint-batch:2.5.3 \
pinpointdocker/pinpoint-quickstart:latest > pinpoint2.5.3.tar.gz
需要注意的是:8000、9997、8080、9994-9996、16010、6123、2181、2888、3888、8081、8079端口不能被占用
pinpoint 需要很多端口,因此建议在独立服务器上部署,避免端口占用服务不可用。
如特殊情况 可考虑通过修改
./pinpoint-docker-2.5.3/.env 文件,该环境变量配置里还有一些关于数据库的密码配置也可修改,修改完成注意需要 docker-compose down,重新up
找到如下配置,默认是9991-9996, 我这里统一加了2.
#grpc
COLLECTOR_RECEIVER_GRPC_AGENT_PORT=29991
COLLECTOR_RECEIVER_GRPC_STAT_PORT=29992
COLLECTOR_RECEIVER_GRPC_SPAN_PORT=29993
#thrift
COLLECTOR_RECEIVER_BASE_PORT=29994
COLLECTOR_RECEIVER_STAT_UDP_PORT=29995
COLLECTOR_RECEIVER_SPAN_UDP_PORT=29996
3.3.3运行 服务
docker-compose up -d
四.访问
4.1 先访问 quickstart 请求创造一些链路数据
http://ip:8085
4.2 pinpoint web访问
http://ip:18080
4.4 Hbase 查看
http://ip:16010
五.将应用接入监控
接入前需要下载pinpoint-agent,修改collector的ip地址和端口,我这里由于端口我在3.3.2 步骤中所有端口都加了个2前缀所以需要修改,如果各位没修改端口,pinpoint-root.config
profiles/release/pinpoint.config 只需要修改ip地址即可。
下载对应版本pinpoint-agent-2.5.3,解压至需要监控接入的主机。 修改
pinpoint-agent-2.5.3/pinpoint-root.config 和
pinpoint-agent-2.5.3/profiles/release/pinpoint.config
profiler.transport.grpc.collector.ip=10.9.0.166
###########################################################
# Thrift Configuration #
###########################################################
profiler.collector.ip=10.9.0.166
# placeHolder support "${key}"
profiler.collector.span.ip=${profiler.collector.ip}
profiler.collector.span.port=29996
# placeHolder support "${key}"
profiler.collector.stat.ip=${profiler.collector.ip}
profiler.collector.stat.port=29995
# placeHolder support "${key}"
profiler.collector.tcp.ip=${profiler.collector.ip}
profiler.collector.tcp.port=29994
5.1 接入tomcat类
编辑 tomcat/bin/catalina.sh
在第二个行加入:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/apps/pinpoint-agent-2.5.3/pinpoint-bootstrap-2.5.3.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=tomcat1"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=tomcat1"
重启tomcat即可。
5.2 接入spring boot类
方法一:启动参数追加如下参数:
-javaagent:/data/apps/pinpoint-agent-2.5.3/pinpoint-bootstrap.jar -Dpinpoint.agentId=10.9.0.162 -Dpinpoint.applicationName=proxydev
- -Dpinpoint.agentId 具有唯一性,每个应用都需要有单独的唯一的名字比如ip,若一个ip多个应用可以用 app-user-1,2...
- -Dpinpoint.applicationName 为服务名,一系列的服务 使用同一个名字 就会出现在同一个servermap中,可以认为这是一个项目名称。
- -javaagent: 写pingpoint jar 包目录,相对、绝对路径均可,如果路径不明白直接写绝对路径。
或者找到启动脚本 增加,或如果脚本已有JAVA_OPTS 直接在前面追加一部分即可,我这里是追加的。注意:如果原来没有JAVA_OPTS建议在启动脚本后面追加,或在后续引用时 加入JAVA_OPTS,从图5-2-1中可以看到我这个脚本最后一行nohup java.... 这一段中我是引用了JAVA_OPTS的,如果你的启动脚本未引用需要主要添加引用
JAVA_OPTS="-javaagent:/data/apps/pinpoint-agent-2.3.3/pinpoint-bootstrap.jar -Dpinpoint.agentId=10.9.0.162 -Dpinpoint.applicationName=proxydev
方法二:
java -jar -javaagent:/data/apps/pinpoint-agent-2.5.3/pinpoint-bootstrap.jar -Dpinpoint.agentId=10.9.0.162 -Dpinpoint.applicationName=proxydev xxxxspring-bootstrap.jar
对于sprintboot 或者springcloud的项目,大部分应用直接通过java -jar 启动,因此可以直接将pinpoint-agent的jar 字符串拼到启动命令即可,最后是自己的应用。