[转帖]JAVA⽣态的微服务⽆侵⼊链路追踪

java,服务,链路,追踪 · 浏览次数 : 0

小编点评

**Pinpoint 应用程序性能管理工具简介** Pinpoint 是一款用于监控和优化企业应用程序性能的工具。它适用于用 Java/PHP 编写的大型分布式系统。 **主要功能:** * 分布式事务跟踪:跟踪跨分布式应用的消息。 * 自动检测应用拓扑:帮助你搞清楚应用的架构。 * 水平扩展:以便支持大规模服务器集群。 * 代码级别的可见性:方便定位失败点和瓶颈。 * 使用字节码增强技术:添加新功能而无需修改代码。 **部署步骤:** 1. 快速在 Rainbond 应用市场上部署 pinpoint。 2. 在 UI 中添加被监控的对象。 3. 在启动脚本中添加 pinpoint-agent 资源。 4. 启动脚本启动 pinpoint-agent。 **实践方法:** 1. 通过应用管理界面中的依赖、设置选项卡等方式添加服务依赖和环境变量。 2. 开启 pinpoint-collector对外服务后,平台网关会定义端口映射关系查看todoshow变量值,检查端口号是否正确,激活agent的开关访问 Pinpoint-Web查看。 **结论:** Pinpoint 是一个功能强大的应用程序性能管理工具,可以帮助企业提升应用程序的性能和可靠性。通过简单易用的部署方式和用户友好的 UI,Pinpoint 成为一个易于使用的选择。

正文

https://v5.6-docs.rainbond.com/docs/v5.3/advanced-scenarios/devops/pinpoint/#pinpoint%E7%AE%80%E4%BB%8B

 

一. ⽆侵⼊链路追踪APM⼯具

应⽤性能管理(Application Performance Management,APM) 是指对企业的关键业务应⽤进⾏监测、优化,提⾼企业应⽤的可靠性和质量,保证⽤户得到良好的服务,降低IT总运维成本,为企业带来更多的商业利益。

Pinpoint简介

Pinpoint是一个APM(应用程序性能管理)工具,适用于用Java / PHP编写的大型分布式系统。在使用上力图简单高效,通过在启动时安装agent,不需要修改哪怕一行代码,最小化性能损失(3%)。

  • 优势:

    1)分布式事务跟踪,跟踪跨分布式应用的消息;
    2)自动检测应用拓扑,帮助你搞清楚应用的架构;
    3)水平扩展以便支持大规模服务器集群;
    4)提供代码级别的可见性以便轻松定位失败点和瓶颈;
    5)使用字节码增强技术,添加新功能而无需修改代码。

  • 主要组件
组件组件功能 
Pinpoint-Collector 收集各种性能数据  
Pinpoint-Agent 探针与应用服务器(例如 tomcat) 关联,部署到同一台服务器上  
HBase Storage 收集到数据存到 HBase 中  
Pinpoint-Web 将收集到的数据层现在 web 展示  

二. 快速在Rainbond部署 pinpoint

基于Rainbond应用市场⼀键安装。

这种部署方式对于像pinpoint这种多组件的复杂应用来说,最大程度的降低了部署难度与工作量

  • 通过pinpoint-web应用进入到pinpoint的UI界面
  • 在默认设置中,pinpoint应用 已经监控了它自身的 collector 、web组件。在进入UI界面后,就可以发现二者已经存在于应用列表中了

三. 添加被监控的对象

  • 在war启动过程中插⼊agent

    1)事先将pinpoint-agent资源打进镜像;
    2)插入启动关键代码:

#pinpoint-agent.sh
#指定pinpoint-agent资源
CATALINA_OPTS="$CATALINA_OPTS -javaagent:$PINPOINT_AGENT_PATH/pinpoint-bootstrap-${PINPOINT_AGETN_VERSION}-SNAPSHOT.jar"
#指定pinpoint-agent ID
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=${AGENT_ID}"
#指定应用名字
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=${APP_NAME}"
 
#docker-entrypoint.sh  
#判断是否开启pinpoint-agent
if [ "$ENABLE_APM" == "true" ];then
#collector地址
COLLECTOR_TCP_HOST=${COLLECTOR_TCP_HOST:-127.0.0.1}
#TCP端口
COLLECTOR_TCP_PORT=${COLLECTOR_TCP_PORT:-9994}
COLLECTOR_UDP_SPAN_LISTEN_HOST=${COLLECTOR_UDP_SPAN_LISTEN_HOST:-127.0.0.1}
COLLECTOR_UDP_SPAN_LISTEN_PORT=$
#UDP端口
{COLLECTOR_UDP_SPAN_LISTEN_PORT:-9996}
COLLECTOR_UDP_STAT_LISTEN_HOST=${COLLECTOR_UDP_STAT_LISTEN_HOST:-127.0.0.1}
COLLECTOR_UDP_STAT_LISTEN_PORT=$
#UDP端口
{COLLECTOR_UDP_STAT_LISTEN_PORT:-9995}
#启动时加载agent
sed -i "2 a. /usr/local/tomcat/bin/pinpoint-agent.sh" /usr/local/tomcat/bin/catalina.sh
#导入到pinpoint-agent配置文件
sed -i -r -e "s/(profiler.collector.ip)=.*/\1=${COLLECTOR_TCP_HOST}/" \
-e "s/(profiler.collector.tcp.port)=.*/\1=${COLLECTOR_TCP_PORT}/" \
-e "s/(profiler.collector.span.port)=.*/\1=${COLLECTOR_UDP_SPAN_LISTEN_PORT}/" \
-e "s/(profiler.collector.stat.port)=.*/\1=${COLLECTOR_UDP_STAT_LISTEN_PORT}/" /usr/local/pinpoint-agent/pinpoint.config
#默认值,在平台的每一个应用都会生成
export APP_NAME=${APP_NAME:-${SERVICE_NAME:-${HOSTNAME}}}
#通过APP_NAME,POD_IP区分一个服务下每一个实例的Agent-ID
export AGENT_ID=${APP_NAME}-${POD_IP}
fi
 
  • 在jar启动过程中插⼊agent

    1)事先将pinpoint-agent资源放进源码仓库;

    2)启动脚本内容:

#!/bin/bash
#通过特定环境变量判断是否启动 pinpoint agent
if [[ $ENABLE_APM == "true" ]];then
AGENT_ID=${SERVICE_ID:0:10}
PINPOINT_AGETN_VERSION=1.7.2
PINPOINT_AGENT_PATH=/app/pinpoint
#将 pinpoint agent 启动参数加⼊到 $JAVA_OPTS 中
export JAVA_OPTS="$JAVA_OPTS -javaagent:$
{PINPOINT_AGENT_PATH}/pinpoint-bootstrap-${PINPOINT_AGETN_VERSION}-
SNAPSHOT.jar -Dpinpoint.agentId=${AGENT_ID:-${SERVICE_ID:0:10}} -Dpinpoint.applicationName=${APP_NAME:-${SERVICE_NAME:-
$HOSTNAME}}"
fi
PORT=${PORT:-5000}
sleep ${PAUSE:-0}
#最终启动命令
exec java -Dserver.port=$PORT $JAVA_OPTS -jar target/*.jar
 

传统架构下的pinpoint,需要在被监控的对象里附加Agent,并通过修改配置文件使之生效。在云帮平台上,我们将这两个步骤也做了相应的简化。

云帮平台利用设置 环境变量 的方式,代替了配置文件,键值对形式的环境变量非常简单易用。

添加Pinpoint监控对象实践

方法一

下面以todoapi为例,介绍添加被监控对象的方法

    1. 关联Pinpoint-Collector
    1. 查看 连接信息
    1. 访问 Pinpoint-Web查看:
  • 对于已部署的应用,也可以通过 应用管理界面 中的 依赖 、设置 选项卡,来配置相应的服务依赖和环境变量。

方法二

    1. 开启Pinpoint-Collector对外服务后,平台网关会定义一层端口映射关系
    1. 查看todoshow变量值,检查端口号是否正确,激活agent的开关
    1. 访问 Pinpoint-Web查看,todoshow已经出现在界面上
  • 在Pinpoint-Web中实时推送使用的是Websocket协议,但我们在访问Pinpoint-Web应用时使用的是http协议;所以不能实时接收推送,需在平台中 应用网关-->访问控制中找到Pinpoint-Web应用,点击参数配置 打开Websocket协议支持。

与[转帖]JAVA⽣态的微服务⽆侵⼊链路追踪相似的内容:

[转帖]JAVA⽣态的微服务⽆侵⼊链路追踪

https://v5.6-docs.rainbond.com/docs/v5.3/advanced-scenarios/devops/pinpoint/#pinpoint%E7%AE%80%E4%BB%8B 一. ⽆侵⼊链路追踪APM⼯具​ 应⽤性能管理(Application Performanc

[转帖]【JVM系列JKD8】参数参考表

JVM是Java底层核心要素,可以说Java生态的东西都是运行在JVM里面的。From:https://docs.oracle.com/javase/8/docs/ JVM参数的含义 JVM参数说明 参数名称含义默认值-Xms初始堆大小物理内存的1/64(<1GB)默认(MinHeapFreeRat

[转帖]Java 近期新闻:JEP 更新,GraalVM 贡献给 OpenJDK,JavaOne 重启

https://www.infoq.cn/article/kzzbQg5zgissaCcJlfey JEP 432记录模式(第二预览版)在上周从其 8294078 草案晋升为候选状态。相比 JEP 405 记录模式(预览版),该 JEP 更新了:对通用记录模式类型参数推断的支持、新增对记录模式出现在

[转帖]Java中线程的生命周期

https://blog.51cto.com/u_15773567/5832430 1 介绍 本篇文章我们讨论下Java中的一个非常核心的概念:线程的生命周期。在Java编程语言中,多线程编程非常重要。线程从创建到销毁是有生命周期的,在线程的生命周期中,线程会经历多种状态(state)。 2 线程状

[转帖]Java调优系列之工具篇之btrace、gperftools

https://github.com/landon30/Bulls/wiki/java-profiling-tools landon 网络游戏资深服务器架构师 2018-06-14 线上遇到了问题? 服务上线出问题,想增加打印日志怎么办? 线上怀疑某个接口慢,想打印接口耗时怎么办? 线上某个接口报错

[转帖]Java游戏服务器调优实践

https://www.jianshu.com/p/344f8141b63e Java Profiling Practice landon资深网络游戏服务器架构师 系统性能定义 Throughput 吞吐量,也就是每秒钟可以处理的请求数,任务数 Latency 系统延迟,也就是系统在处理一个请求或一

[转帖]java中方法不要写太长的真正原因

https://www.iteye.com/blog/enetor-976070 java中一般建议一个方法不要写的过长,不方便维护和阅读是其中的一个原因,但是其真正性能的原因大家知道吗? 我们知道,JVM一开始是以解释方式执行字节码的。当这段代码被执行的次数足够多以后,它会被动态优化并编译成机器码

[转帖]Java方法的JIT编译

https://www.jianshu.com/p/a6275e239eac Java方法执行一般会利用分层编译,先通过c1解释执行。方法执行编译等级逐渐提升,有机会通过JIT编译为特定平台汇编执行,以此获得最好的性能。 方法执行除了达到一定热度外,是否JIT编译也受到以下两个参数影响: -XX:+

[转帖]java profile配置

[转帖]JAVA 编程规范之建表规约

1、【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否)。 2、【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名