首页 > 其他分享 >字节码的终极应用-GitHub高星开源APM项目之Pinpoint

字节码的终极应用-GitHub高星开源APM项目之Pinpoint

时间:2023-08-14 22:57:30浏览次数:39  
标签:GitHub java pinpoint 调用 高星 应用 APM demoY Pinpoint

大家好, 我们前面的章节javaagent以及一些字节码修改框架ASM和Javassist, 以及他们的一些简单的应用场景. 今天重点给大家介绍一款github上开源的APM分布式链路监控产品 -- Pinpoint.

Pinpoint是什么?

Pinpoint 是一个开源的APM (Application Performance Management/应用性能管理) 工具,用于基于java的大规模分布式系统。在使用上力图简单高效,通过在启动时安装 agent,不需要修改哪怕一行代码,最小化性能损失 (3%)。

中文参考文档:http://skyao.github.io/leaning-pinpoint/index.html
开源源码地址:https://github.com/naver/pinpoint

Pinpoint的特点

  • 分布式事务跟踪,跟踪跨分布式应用的消息;
  • 自动检测应用拓扑,帮助你搞清楚应用的架构;
  • 水平扩展以便支持大规模服务器集群;
  • 提供代码级别的可见性以便轻松定位失败点和瓶颈;
  • 使用字节码增强技术,添加新功能而无需修改代码。
  • pinpoint有非常直观的UI,符合项目的当前需求
  • pinpoint是基于java开发的,利于项目后期对源代码的修改
  • pinpoint的社区还是挺活跃,一般提问题第二天就有项目的 committer回复。

Pinpoint架构图

架构图对应说明:

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

演示Demo

准备工作

为了模拟分布式架构系统, 我们这里准备了三个springboot构建的项目, demoX, demoY, demoZ. 他们之间不仅会相会调用, 每个项目本身还会调用Kafka, Mysql, Redis等中间件. 我们假设他们之家的调用关系是这样的:

  1. demoX程序通过http协议调用demoY程序, 并访问Redis
private final String URL_Y = "http://localhost:18002/demoY/testY";

public String callY() {
    return restTemplate.getForObject(URL_Y, String.class);
}

public void callRedis() {
    redisTemplate.opsForValue().set("APM", "pinpoint");
}
  1. demoY通过http协议调用demoZ程序
public void callZ() {
    restTemplate.getForObject(URL_Z, String.class);
}

public void sendMessage() {
    kafkaTemplate.send("topic_z", "test message");
}
  1. demoZ程序查询Mysql数据库, 并通过json反序列化结果输出
@GetMapping("testZ")
public String testZ() {
    SysLog sysLog = demoZService.callMysql();
    return JSONObject.toJSONString(sysLog);
}

接入pinpoint

接入pinpoint无需修改任何源码, 只需在demoX, demoY, demoZ三个java进程启动的时候, 配置一个--javaagent的参数即可.

java -javaagent:D:/project/2.3.0-all/Assets/pinpoint-agent-2.3.0/pinpoint-bootstrap.jar -Dpinpoint.agentId=app_x_0810 -Dpinpoint.applicationName=app_x -Dpinpoint.profiler.profiles.active=local  -jar demoX.jar

其中

  • -javaagent用于指定pinpoint启动类包的位置
  • -Dpinpoint.applicationName用户指定接入pinpoint的应用名, 一会儿我们会在pinpoint的页面上看到.
  • -Dpinpoint.agentId 用户指定pinpoint的进程名, 用户区分一个应用下的不同实例

启动成功, 会在日志中输出:

08-11 00:46:43.428 INFO  PinpointStarter                     : pinpoint agent started normally.

监控数据查看

指标类数据

接入pinpoint之后,我们可以在页面上直观的看到jvm的各种指标数据, 比如CPU使用率, 堆内存大小, 堆内存使用量, GC次数, GC后的堆回收率等指标. 通过这些图表可以直观的反应当前应用的健康情况.

  • 堆内存与GC图表
    当前堆最大值125M, 已经使用50.7M, Major GC耗时128ms

  • 非堆区域

  • CPU使用率

宿主机使用率9.8%, java进程使用率2.1%

Trace请求数据

Trace请求数据为当前java应用程序实时收到的外界的访问情况.从Trace数据中我们可以直观的看到当前系统的哪些接口被调用, 调用的次数, 接口的调用耗时, 是否存在异常等关键信息, 可以帮助运维和开发人员快速的定位和分析问题.

  • 调用拓扑

如上面准备工作中的调用逻辑, 在pinpoint中可以直观的反应在调用拓扑中.

  • 方法燃尽图
    方法燃尽图是从方法的维度看某一次请求的耗时情况, 从该图中我们可以清洗的看到调用了哪些方法, 他们的耗时是多少. 对于业务开发人员来说, 通常可以一眼就看出哪些方法的耗时偏高.

  • 堆栈明细

堆栈明细是从代码维度来看一次请求经过的所有应用和方法, 以及他们是如何调用了. 我们以请求经过的第一个应用demoX的堆栈明细为例, 请求首先进入Tocmat容器专门处理http请求的方法StandardHostValve.invoke(), 随后经过spring的框架方法FrameworkServlet.doGet(), 然后接下来是用户的业务Controller方法, Service方法, 在业务方法内部, 分别使用redis的set方法往redis中写入了数据, 随后又通过HTTP_Client_4工具发起了http调用, 请求的目的地是localhost:18002/demoY/testY, 也就是我们的demoY应用.如果你是一个有经验的开发人员, 你会一眼就发现调用redis的set方法居然花费了863ms, 这个显然是不符合预期的.

同理, demnY的堆栈:

demoZ的堆栈:

小结

本文我们介绍了一个开源的APM分布式链路监控工具Pinpoint.主要介绍了Pinpoint的架构和特点, 随后我们使用几个简单的demo模拟分布式调用的场景, 和大家一起分析了java应用采集到的各种监控指标, 主要分为Metric(指标数据)和Trace(请求数据). 希望对大家排查问题有一定的帮助.

本文由mdnice多平台发布

标签:GitHub,java,pinpoint,调用,高星,应用,APM,demoY,Pinpoint
From: https://www.cnblogs.com/sharloon/p/17629992.html

相关文章

  • centos安装arp-scan,使用github上的源码安装
    使用github上的源码安装按照以下步骤使用arp-scan的GitHub源码进行安装:安装编译工具和依赖项:打开终端并以root用户或具有sudo权限的用户身份登录。运行以下命令以安装编译工具和必要的依赖项:sudoyuminstallgccmakelibpcap-devel下载源代码:在终端中,使用以下命令......
  • github显示不正常解决办法
    有的时候github页面打开排版不正常,F12打开开发者模式发现很多资源文件没有加载出来,通过修改hosts文件进行解决首先在网站网址查询上面分别输入以下网址github.comgithub.githubassets.com查询到对应的ip,然后在文件夹C:\Windows\System32\drivers\etc中的hosts文件中添加对应的......
  • 免费拥有自己的 Github 资源加速器
    TurboHub是一个免费的Github资源加速下载站点,可以帮助你快速下载Github上的资源。其核心逻辑是通过AzureStaticWebApps服务和AzureFunctions服务,将Github上的资源通过中间服务器进行转发,从而实现加速下载的目的。由于每个使用Azure的用户都可以免费的额度部署A......
  • 解决Mac 上码云gitee或者github出现The requested URL returned error: 403
    出现场景要把某个项目push到码云上,已经设置了仓库地址,在最后一步直接报错。adodeMacBook-Pro:yimabaoado$gitpush--set-upstreamoriginmasterremote:[session-774b45b9]Accessdeniedfatal:unabletoaccess'https://gitee.com/mzmilk/yimabao.git/':Therequested......
  • 问题记录 <git push 到 github 时遇到 ssh 端口问题>
    问题描述gitpush时遇到如下问题:ssh:connecttohostgithub.comport22:Connectiontimedoutfatal:Couldnotreadfromremoterepository.解决方式通过修改端口得以解决,将22端口改为443,添加~/.ssh/config内容如下:Hostgithub.comHostnamessh.github.com......
  • github 无语的问题,Host does not existfatal: Could not read from remote repository
    Unabletoopenconnection:Hostdoesnotexistfatal:Couldnotreadfromremoterepository.image.pngimage.pngimage.pngPleasemakesureyouhavethecorrectaccessrightsandtherepositoryexists.如果githubdesktop和gitpu......
  • Github编辑TOC目录
    任意1-6个#标注的标题都会被添加上同名的锚点链接 [标题1](#标题1) [标题2](#标题2) [标题3](#标题3) #标题1 ##标题2 ###标题3锚点跳转的标识名称,可使用任意字符,大写字母要转换成小写 [Github标题1](#github标题1) ###Github标题1多单词锚点的空格用-......
  • github
    https://github.com/hckingking/ githubhttps://github.com/godvking 府头邦 Git是由Linux之父LinusTovalds为了更好地管理linux内核开发而创立的分布式版本控制/软件配置管理软件。Git是一个管理你的「代码的历史记录」的工具。 https://hckingking.github.io/ 博客 h......
  • Typora+GitHub+PicGo设置
    Typora+GitHub+PicGo创建GitHub图像存储仓库新建仓库输入仓库名称image-repo选择public公开属性用户设置settings找到developersettings创建token选择classic输入名称,token过期时间,和repo,点击创建token复制保存token,后面要用PicGo设置仓库名......
  • 真·生产力「GitHub 热点速览」
    这些工具真的能极大提高生产力,节约你的时间来自(摸)我(鱼)增(划)值(水)。先别提style2paints,你给它随意画个草图,就能给你一个能交付给甲方爸爸的成品插画。如果提升30%-40%传输速度的kcp不够惊艳,还有想象力匮乏程序员的福音——rerun,直接让你带入计算机视角看待那些图片、视频信息。而......