• 利用Pinpoint搭建全链路监控系统


    随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越来越复杂,我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪,而通过调研多个开源APM工具后,最终我们选择了Pinpoint。

    简介

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

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

    Pinpoint 的特点

    1.分布式事务跟踪,跟踪跨分布式应用的消息;

    2.自动检测应用拓扑,帮助你搞清楚应用的架构;

    3.水平扩展以便支持大规模服务器集群;

    4.提供代码级别的可见性以便轻松定位失败点和瓶颈;

    5.使用字节码增强技术,添加新功能而无需修改代码。

    6.pinpoint有非常直观的UI,符合项目的当前需求

    7.pinpoint是基于java开发的,利于项目后期对源代码的修改

    8.pinpoint的社区还是挺活跃,一般提问题第二天就有项目的 committer回复。

    Pinpoint架构图

    图片

    架构图对应说明:

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

    Pinpoint的数据结构

    Pinpoint 消息的数据结构主要包含三种类型Span,Trace 和TraceId。

    1.Span是最基本的调用追踪单元

    当远程调用到达的时候,Span指代处理该调用的作业,并且携带追踪数据。为了实现代码级别的可见性,Span下面还包含一层SpanEvent的数据结构。每个Span都包含一个SpanId。

    2.Trace 是一组相互关联的 Span 集合

    同一个Trace下的Span共享一个TransactionId,而且会按照SpanId和 ParentSpanId排列成一棵有层级关系的树形结构。

    3.TraceId是TransactionId、SpanId和ParentSpanId的组合

    TransactionId(TxId)是一个交易下的横跨整个分布式系统收发消息的 ID,其必须在整个服务器组中是全局唯一的。也就是说TransactionId识别了整个调用链;SpanId(SpanId)是处理远程调用作业的ID,当一个调用到达一个节点的时候随即产生;ParentSpanId(pSpanId)顾名思义,就是产生当前Span的调用方Span的ID。如果一个节点是交易的最初发起方,其 ParentSpanId是-1,以标志其是整个交易的根Span。下图能够比较直观的说明这些ID结构之间的关系。

    Pinpoint的代码注入

    Pinpoint对代码注入的封装非常类似AOP,当一个类被加载的时候会通过 Interceptor向指定的方法前后注入before 和 after逻辑,在这些逻辑中可以获取系统运行的状态,并通过TraceContext创建Trace消息,并发送给 Pinpoint 服务器。但与AOP不同的是,Pinpoint在封装的时候考虑到了更多与目标代码的交互能力,因此用Pinpoint 提供的API来编写代码会比AOP 更加容易和专业。

    Pinpoint的运行方式

    方式一:配置文件启动

    #1.修改tomat目录下bin/catalina.sh,在Control Script for the CATALINA Server加入以下三行代码:# pinpoint-bootstrap-1.6.2.jar的位置
    
    CATALINA_OPTS="$CATALINA_OPTS -javaagent:/home/webapps/service/pp-agent/pinpoint-bootstrap-1.6.2.jar"
    # agentId必须唯一,标志一个jvm
    CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=pp32tomcattest"
    # applicationName表示同一种应用:同一个应用的不同实例应该使用不同的agentId,相同的applicationName
    CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=32tomcat"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方式二:SpringBoot 启动

    java  -javaagent:/home/webapps/pp-agent/pinpoint-bootstrap-1.6.2.jar  -Dpinpoint.agentId=pp32tomcattest -Dpinpoint.applicationName=32tomcat -jar 32tomcat-0.0.1-SNAPSHOT.jar
    
    • 1

    PHP搭建全链路监控系统

    一、准备工作:

    环境需要满足一下条件

    图片

    二、搭建步骤:

    1.在服务器相应位置拉去 pinpoint 的安装包,一般位置安装在/usr/local/src目录下,执行命令git clone https://github.com/pinpoint-apm/pinpoint-c-agent.git

    Pinpoint官网:https://github.com/pinpoint-apm/pinpoint-c-agent/blob/master/DOC/PHP/Readme.md
    
    • 1

    2.安装 pinpoint-php 扩展

    cd  /usr/local/src/pinpoint-c-agent
    phpize
    ./configure
    make
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在php.ini文件里配置如下代码并重启php服务即可

    extension=pinpoint_php.so
    Collector-agent's TCP address, ip,port:Collector-Agent's ip,port, please ensure it consistent with the `PP_ADDRESS` of `Collector-Agent` in step2(Build Collector-Agent).pinpoint_php.CollectorHost=Tcp:ip:port
    pinpoint_php.SendSpanTimeOutMs=0 
    # 0 is recommanded
    request should be captured duing 1 second. < 0 means no limited
    pinpoint_php.TraceLimit=-1 DEBUG the agent, PHP's log_error should turn on too.
    pinpoint_php.DebugReport=true
    error_reporting = E_ALL
    log_errors = On
    error_log = /tmp/php_fpm_error.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.在项目中使用Pinpoint PHP-Agent,并按照以下步骤操作

    ①. 添加pinpoint-apm/pinpoint-php-aop到 composer.json并更新

    ②. 在项目的入口文件添加一下代码配置

    #################################################
    define('APPLICATION_NAME','APP-2');define('APPLICATION_ID','app-2');define('AOP_CACHE_DIR',__DIR__.'./Cache/');define('PLUGINS_DIR',__DIR__.'./Plugins/');define('PINPOINT_USE_CACHE','YES');require_once __DIR__. path to 'vendor/pinpoint-apm/pinpoint-php-aop/auto_pinpointed.php';
    #################################################
    
    • 1
    • 2
    • 3

    a.APPLICATION_NAME:应用名称。
    b.APPLICATION_ID: 代理 ID。
    c.AOP_CACHE_DIR: 在哪里生成 Cache。
    d.PLUGINS_DIR: 路径 Plugins。
    e.PINPOINT_USE_CACHECache: 'YES’在请求到来时不会更新;‘No’ 将 Cache 在每个请求到来时更新。(您也可以 Cache 通过删除它来更新。)考虑到性能,我们建议 ‘YES’。此外,如果您修改了插件,您应该更新以 Cache 使其生效。

    f.require_once DIR. path to ‘vendor/pinpoint-apm/pinpoint-php-aop/auto_pinpointed.php’;:需要 pinpoint 的 auto_pinpointed.php。请在后面加上 require_once DIR.“/…/vendor/autoload.php”;,这很重要!

    4.选择您的框架并将目录复制Plugins到应用程序的根目录,自动加载 Plugins到composer.json. 框架的详细信息:
    ThinkPHP5
    Yii2

    效果展示

    图片

    图片

    总结

    目前有很多监控系统,PinPoint 从宏观上看,总体链路、服务总体状态(cpu、内存等等信息)都符合业务需要,业务通过接入 Pinpoint 后很容易的就能定位到问题,提高了解决问题的效率。


    资源分享

    下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    每天一道leetcode:14.最长公共前缀(简单)
    【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段
    安装node.js指定任意版本详解
    【USRP】通信之射频与微波通信
    【JavaSE】继承与多态(上篇)
    2022深圳xxx校招Java笔试题目(选择题+简答题)
    Python基于Flask的高校舆情分析,舆情监控可视化系统
    [附源码]Python计算机毕业设计Django少儿节目智能推荐系统
    五运放蔡氏电路具体求告知
    深度学习_VGG_3
  • 原文地址:https://blog.csdn.net/m0_67695717/article/details/127988050