精华内容
下载资源
问答
  • zipKin和pinPoint比较.docx

    2017-11-14 11:45:08
    zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响最小(只增加约3%...
  • 开源apm zipkin工具简单使用

    千次阅读 2018-06-24 11:59:41
    声明,本编博客,只是为了记录 架构 流程走向 ┌─────────────┐ ┌─────...│ User Code │ │ Trace Instrumentation │ │ Http Client │ │ Zipkin Collector │ └─────────...

    声明,本编博客,只是为了记录
    架构
    zipkip

    流程走向

    ┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
    │ User Code   │ │ Trace Instrumentation │  │ Http Client │  │ Zipkin Collector │
    └─────────────┘ └───────────────────────┘  └─────────────┘  └──────────────────┘
           │                 │                         │                 │
               ┌─────────┐
           │ ──┤GET /foo ├─▶ │ ────┐                   │                 │
               └─────────┘         │ record tags
           │                 │ ◀───┘                   │                 │
                               ────┐
           │                 │     │ add trace headers │                 │
                               ◀───┘
           │                 │ ────┐                   │                 │
                                   │ record timestamp
           │                 │ ◀───┘                   │                 │
                                 ┌─────────────────┐
           │                 │ ──┤GET /foo         ├─▶ │                 │
                                 │X-B3-TraceId: aa │     ────┐
           │                 │   │X-B3-SpanId: 6b  │   │     │           │
                                 └─────────────────┘         │ invoke
           │                 │                         │     │ request   │
                                                             │
           │                 │                         │     │           │
                                     ┌────────┐          ◀───┘
           │                 │ ◀─────┤200 OK  ├─────── │                 │
                               ────┐ └────────┘
           │                 │     │ record duration   │                 │
                ┌────────┐     ◀───┘
           │ ◀──┤200 OK  ├── │                         │                 │
                └────────┘       ┌────────────────────────────────┐
           │                 │ ──┤ asynchronously report span     ├────▶ │
                                 │                                │
                                 │{                               │
                                 │  "traceId": "aa",              │
                                 │  "id": "6b",                   │
                                 │  "name": "get",                │
                                 │  "timestamp": 1483945573944000,│
                                 │  "duration": 386000,           │
                                 │  "annotations": [              │
                                 │--snip--                        │
                                 └────────────────────────────────┘
    

    组件
    collector—从收集数据
    storage–存储
    search–搜索组建
    web UI–UI页面
    Instrumenting–负责收集数据,更多信息请参考existing_instrumentations

    部署
    可以通过docker-compose.yml 部署,这里就简单部署了

    [root@i-vzdytl5t ~]# docker run -d -p 9411:9411 openzipkin/zipkin
    Unable to find image 'openzipkin/zipkin:latest' locally
    Trying to pull repository docker.io/openzipkin/zipkin ... 
    latest: Pulling from docker.io/openzipkin/zipkin
    ff3a5c916c92: Already exists 
    a8906544047d: Already exists 
    590b87a38029: Pull complete 
    5a45314016bd: Pull complete 
    596d597fd76a: Pull complete 
    0ca7f3c515ee: Pull complete 
    Digest: sha256:54d39fa30f23c1f27ccc64e62ad14e73237bdddb215d6935a1b2528e32242260
    Status: Downloaded newer image for docker.io/openzipkin/zipkin:latest
    307bd7e7843fca7410fbd1282f4fad1520284483759b6735dff096b071038c78
    [root@i-vzdytl5t ~]# docker ps 
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
    307bd7e7843f        openzipkin/zipkin   "/bin/bash -c 'tes..."   27 minutes ago      Up 27 minutes       9410/tcp, 0.0.0.0:9411->9411/tcp   festive_chandrasekhar
    

    访问http://your_host:9411
    zip
    安装成功,另外还支持二进制部署以及自己编译
    二进制部署

    curl -sSL https://zipkin.io/quickstart.sh | bash -s
    java -jar zipkin.jar

    自己编译

    # get the latest source
    git clone https://github.com/openzipkin/zipkin
    cd zipkin
    # Build the server and also make its dependencies
    ./mvnw -DskipTests --also-make -pl zipkin-server clean install
    # Run the server
    java -jar ./zipkin-server/target/zipkin-server-*exec.jar

    如果用docker-compose 部署的话,里面也用到了prometheus的服务,内容如下

    version: '2'
    
    services:
      storage:
        image: openzipkin/zipkin-mysql
        container_name: mysql
        # Uncomment to expose the storage port for testing
        # ports:
        #   - 3306:3306
    
      # The zipkin process services the UI, and also exposes a POST endpoint that
      # instrumentation can send trace data to. Scribe is disabled by default.
      zipkin:
        image: openzipkin/zipkin
        container_name: zipkin
        # Environment settings are defined here https://github.com/openzipkin/zipkin/tree/1.19.0/zipkin-server#environment-variables
        environment:
          - STORAGE_TYPE=mysql
          # Point the zipkin at the storage backend
          - MYSQL_HOST=mysql
          # Uncomment to enable scribe
          # - SCRIBE_ENABLED=true
          # Uncomment to enable self-tracing
          # - SELF_TRACING_ENABLED=true
          # Uncomment to enable debug logging
          # - JAVA_OPTS=-Dlogging.level.zipkin=DEBUG -Dlogging.level.zipkin2=DEBUG
        ports:
          # Port used for the Zipkin UI and HTTP Api
          - 9411:9411
          # Uncomment if you set SCRIBE_ENABLED=true
          # - 9410:9410
        depends_on:
          - storage
    
      # Adds a cron to process spans since midnight every hour, and all spans each day
      # This data is served by http://192.168.99.100:8080/dependency
      #
      # For more details, see https://github.com/openzipkin/docker-zipkin-dependencies
      dependencies:
        image: openzipkin/zipkin-dependencies
        container_name: dependencies
        entrypoint: crond -f
        environment:
          - STORAGE_TYPE=mysql
          - MYSQL_HOST=mysql
          # Add the baked-in username and password for the zipkin-mysql image
          - MYSQL_USER=zipkin
          - MYSQL_PASS=zipkin
          # Uncomment to see dependency processing logs
          # - ZIPKIN_LOG_LEVEL=DEBUG
          # Uncomment to adjust memory used by the dependencies job
          # - JAVA_OPTS=-verbose:gc -Xms1G -Xmx1G
        depends_on:
          - storage
    
      prometheus:
        image: prom/prometheus
        container_name: prometheus
        ports:
          - 9090:9090
        depends_on:
          - storage
        volumes:
          - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    
      grafana:
        image: grafana/grafana
        container_name: grafana
        ports:
          - 3000:3000
        depends_on:
          - prometheus
        environment:
          - GF_AUTH_ANONYMOUS_ENABLED=true
          - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
    
      setup_grafana_datasource:
        image: appropriate/curl
        container_name: setup_grafana_datasource
        depends_on:
          - grafana
        volumes:
          - ./prometheus/create-datasource-and-dashboard.sh:/create.sh:ro
        command: /create.sh

    需要在节点上部署对应语言的
    比如golang的,就可以参考example_httpserver_test

    目前zipkin支持一下语言,更多信息请参考existing_instrumentations

    C#  
    Go  
    Java    
    JavaScript  
    Ruby    
    Scala   

    参考:
    existing_instrumentations
    quickstart

    展开全文
  • 1.zipkinserver的搭建 注意:因为关于 Zipkin 的服务端,在Spring Boot 2.x 版本后,官方就不推荐自行定制编译了(自行搭建方式在本文末补充),反而是直接提供了编译好的 jar 包来给我们使用(下载zipkin-server-...

    1.zipkinserver的搭建

    注意:因为关于 Zipkin 的服务端,在Spring Boot 2.x 版本后,官方就不推荐自行定制编译了(自行搭建方式在本文末补充),反而是直接提供了编译好的 jar 包来给我们使用(下载zipkin-server-xxx.jar ,使用JAVA命令启动该JAR,zipkin-server.jar是一个打包好的springBoot应用,springBoot自带tomcat因此只要启动JAR包就可以访问了。 java -jar zipkin-server-xxx.jar 启动完后访问localhost:9411可以查看统计界面)。还有其他两种方式搭建zipkinserver方式,详细情况参看

    2.构件网关工程以及服务提供工程,这两个工程作为Zipkin 客户端, 需要将链路数据上传给Zipkin Server,同时它也作为 EurekaClient。

         a.网关pom如下:

    <dependencies>
    
             <dependency>
    
                  <groupId>org.springframework.cloud</groupId>
    
                  <artifactId>spring-cloud-starter-zipkin</artifactId>
    
                  <version>1.2.1.RELEASE</version>
    
             </dependency>
    
             <dependency>
    
                 <groupId>org.springframework.cloud</groupId>
    
                 <artifactId>spring-cloud-starter-zuul</artifactId>
    
                 <version>1.4.4.RELEASE</version>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.boot</groupId>
    
                  <artifactId>spring-boot-starter-web</artifactId>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.cloud</groupId>
    
                  <artifactId>spring-cloud-starter-eureka</artifactId>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.boot</groupId>
    
                  <artifactId>spring-boot-starter-test</artifactId>
    
                  <scope>test</scope>
    
             </dependency>
    
         </dependencies>

    b.网关的配置文件如下:

    ====================================

    server.port=8768

    spring.application.name=zipkinzuulclient

    #指定 Zipkin Server 地址

    spring.zipkin.base-url=http://localhost:9411

    #通过配置这个参数来决定了日志记录发送给采集器的概率,0-1交给使用者自己配置。开发阶段和运行初期,

    #一般配置成1全量收集日志,在默认情况下,该值为 0.1

    spring.sleuth.sampler.percentage=1.0

    #以下两个配置就可以将以"/sayhi/**"开头的 Url路由指定的url

    zuul.routes.sayhi.path=/sayhi/**

    zuul.routes.sayhi.url=http://localhost:1000

    ===================================

    c.服务提供工程的pom如下:

    <dependencies>
    
             <dependency>
    
                  <groupId>org.springframework.cloud</groupId>
    
                  <artifactId>spring-cloud-starter-zipkin</artifactId>
    
                  <version>1.2.1.RELEASE</version>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.boot</groupId>
    
                  <artifactId>spring-boot-starter-web</artifactId>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.cloud</groupId>
    
                  <artifactId>spring-cloud-starter-eureka</artifactId>
    
             </dependency>
    
             <dependency>
    
                  <groupId>org.springframework.boot</groupId>
    
                  <artifactId>spring-boot-starter-test</artifactId>
    
                  <scope>test</scope>
    
             </dependency>
    
         </dependencies>

    d.服务提供工程的配置

    =====================================

    spring.application.name=zipkinclient

    server.port=1000

    #设置服务注册中心的URL,本服务要向该服务注册中心注册自己

    eureka.client.serviceUrl.defaultZone=http://ipa:8761/eureka

    #指定 Zipkin Server 地址

    spring.zipkin.base-url=http://localhost:9411

    #通过配置这个参数来决定了日志记录发送给采集器的概率,0-1交给使用者自己配置。开发阶段和运行初期,

    #一般配置成1全量收集日志,在默认情况下,该值 为 0.1

    spring.sleuth.sampler.percentage=1.0

    ============================================

    3.完整的项目搭建完毕,依次启动 eurekaserverzipkinserverzipkinzuulclient zipkinclient 在浏览器上访问http://localhost:8768/sayhi/GetTest/getTest 浏览器显示:I  am from :1000    再访问 http://localhost:9411 ,即访问 Zipkin 的展示界面,点击find traces可以看到对应的链路数据,例如请求的调用时间、消耗时间,以及请求调用的链路情况。(注意:需要先访问服务产生链路记录,才能在zipkin界面查到相应的servicenamespanname

     

    4.可以在链路中添加自定义数据,本案例在 zipkinzuulclient服务中新建一个过滤器,它的类型为 post 类型, order0,开启拦截。在过滤器的拦截逻辑方法里, 通过 Tracer addTag 方法在本案例中加上了链路的操作人,过滤器中部分代码如下:

    @Autowired
    
    Tracer tracer;//首先注入Tracer对象
    
        @Override
    
        public Object run() {
    
    //在链路中添加链路操作人员记录
    
           tracer.addTag("user", "lucus");    
    
    return null;
    
        }

     

    补充:在低版本中也可以自行创建zipkinserver工程,搭建zipkinserver服务,但是官方在2017年6月已经停止使用这种方式,并且要求链路追踪案例中所有案例工程(网关工程、服务提供工程)的搭建都是在低版本中进行,不能使用springboot 2.x,如:

    springboot 1.5.9、

    spring-cloud.version Dalston.SR1、

    spring-cloud-starter-zipkin 1.2.1.RELEASE、

    zipkin-server 1.27.0、

    zipkin-autoconfigure-ui 1.27.0 等。

    a.zipkinserver中引入pom依赖如下:

    <dependencies>
            <dependency>
                <groupId>io.zipkin.java</groupId>
                <artifactId>zipkin-server</artifactId>
                <version>1.27.0</version>
            </dependency>
            <dependency>
                <groupId>io.zipkin.java</groupId>
                <artifactId>zipkin-autoconfigure-ui</artifactId>
                <version>1.27.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.4.6.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

    b.低版本中的zipkinserver的配置文件配置内容如下:

    ====================

    #自定义端口号

    server.port=9000

    #设置服务注册中心的URL,本服务要向该服务注册中心注册自己

    eureka.client.serviceUrl.defaultZone=http://ipa:8761/eureka

    spring.application.name=zipkinserver

    ====================

    c.启动类添加注释如下:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    import zipkin.server.EnableZipkinServer;
    @EnableEurekaClient
    @EnableZipkinServer
    @SpringBootApplication
    public class ZipkinServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZipkinServerApplication.class, args);
        }
    }

     

    展开全文
  • 调用链监控Skywalking与Zipkin

    千次阅读 2020-06-16 11:39:23
    代码侵入性:Skywalking无代码侵入,使用字节码增强技术,在启动服务时使用 javaagent 指向skywalking服务即可收集调用链span信息 Zipkin:简单、轻量级 2.安装部署对比 Zipkin安装部署简单,参考:Spr
    1.Skywalking与Zipkin的区别
    • 颗粒度:Skywalking方法级(展示的更详细),方法中所有的调用都展示出来了,如数据库调用、redis调用,第三方网络调用,而Zipkin只能展示接口级
    • UI界面:Skywalking完胜,国产开源,更适合国人眼球
    • 代码侵入性:Skywalking无代码侵入,使用字节码增强技术,在启动服务时使用 javaagent 指向skywalking服务即可收集调用链span信息
    • Zipkin:简单、轻量级
    2.安装部署对比

    Zipkin安装部署简单,参考:Spring Cloud Sleuth + Zipkin 调用链监控
    Skywalking安装部署复杂:http://skywalking.apache.org/github

    # Skywalking安装步骤如下:
    # 1.docker 安装elasticsearch
    docker run -d -it --name=elasticsearch --net=esnetwork \
    --restart=always \
    -p 9200:9200 \
    -p 9300:9300 \
    -e "discovery.type=single-node" \
    -e ES_JAVA_OPTS="-Xms2g -Xmx2g" \
    -e TZ='Asia/Shanghai' \
    -e LANG="en_US.UTF-8" \
    -v /root/elasticsearch/config/:/usr/share/elasticsearch/config/ \
    -v /root/elasticsearch/data/:/usr/share/elasticsearch/data/ \
    -v /root/elasticsearch/logs/:/usr/share/elasticsearch/logs/ \
    -v /root/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/ \
    -v /etc/localtime:/etc/localtime \
    -v /etc/timezone:/etc/timezone \
    elasticsearch:7.4.2
    
    # 2.安装 IK 分词器(进入docker容器安装插件)
    docker exec -it elasticsearch bash
    cd bin/
    elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
    
    # 3.下载skywalking:wget http://mirror.bit.edu.cn/apache/skywalking/7.0.0/apache-skywalking-apm-7.0.0.tar.gz
    
    # 4.解压,进入目录,修改配置 
     vi config/application.yml ,配置storage为elasticsearch7,默认h2
     storage:
       selector: ${SW_STORAGE:elasticsearch7}
    
    # 5.启动 SkyWalking OAP 服务
    sh bin/oapService.sh , 查看启动日志:tail -f logs/skywalking-oap-server.log
    
    # 6.启动 SkyWalking UI 服务
    sh bin/webappService.sh,查看日志:tail -f logs/web.log
    
    # 7.复制 skywalking 软件里面的 agent 目录到 java应用服务器上
    # 8.复制后,修改agent\config\agent.config 里面的collector.backend_service参数,
    值为:skywalking OAP服务的IP地址,端口默认为11800
    collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.10.1:11800}
    
    # 7.启动java服务,指向复制后的agent目录中的skywalking-agent.jar
    nohup java -javaagent:/skywalking/agent/skywalking-agent.jar -jar xxxx-1.0.0.jar &
    
    3.界面对比

    启动zipkin与对应微服务,访问服务,产生数据,查看zipkin ui界面

    • zipkin需要在代码中引入依赖,默认使用http向zipkin server发送数据,当调用量大时可以结合 rabbitmq ,java服务向rabbitmq发送调用链trace,zipkin采集rabbitmq里面的trace信息
    • nohup java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.addresses=localhost --zipkin.collector.rabbitmq.username=admin --zipkin.collector.rabbitmq.password=admin &
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      zipkin 只能看到调用了那些服务,服务耗时多长,没法查看服务中的方法调用了redis、网络接口等

    启动Skywalking与对应微服务,访问服务,产生数据,查看skywalking ui界面

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    方法里面的mysql调用、redis调用,调用了几次,每次的耗时,都展示的很详情,very nice
    在这里插入图片描述

    比如,采集的这个接口,调用了2次mysql查询,每次耗时2670ms,就需要优化sql了在这里插入图片描述

    skywalking之所以能采集到多种中间件(http、redis、mysql、mongodb)等等的信息,是因为它对每个中间件内置了处理程序,当我们启动应用使用skywalking时会自动对应用内的各种中间件添加拦截器
    有http的、jdbc的在这里插入图片描述
    zipkin只能采集到服务层,也就是那个控制器的那个方法,内部调用了什么不能采集,如需要采集需要自定义处理器,相当于给当前 traceId 手动添加 spanId
    例如:SpringBoot应用,使用Zipkin则需要引入 brave 相关的包,然后自动注入http-interceptors拦截器,才能采集应用内对外的http请求
    SpringCloud应用,使用sleuth会自动注入http的拦截器,在http请求头中添加spanId

    展开全文
  • 字节码注入 vs API 调用 Pinpoint 实现了基于字节码注入的 Java Agent 探针,而 Zipkin 的 Brave 框架仅仅提供了应用层面的 API,但是细想问题远不那么简单。字节码注入是一种简单粗暴的解决方案,理论上来说无论...

    随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。

    全链路监控组件就在这样的问题背景下产生了。最出名的是谷歌公开的论文提到的 Google Dapper。想要在这个上下文中理解分布式系统的行为,就需要监控那些横跨了不同的应用、不同的服务器之间的关联动作。

    所以,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。一个请求完整调用链可能如下图所示:

    一个请求完整调用链

    那么在业务规模不断增大、服务不断增多以及频繁变更的情况下,面对复杂的调用链路就带来一系列问题:

    1. 如何快速发现问题?

    2. 如何判断故障影响范围?

    3. 如何梳理服务依赖以及依赖的合理性?

    4. 如何分析链路性能问题以及实时容量规划?

    同时我们会关注在请求处理期间各个调用的各项性能指标,比如:吞吐量(TPS)、响应时间及错误记录等。

    1. 吞吐量,根据拓扑可计算相应组件、平台、物理设备的实时吞吐量。

    2. 响应时间,包括整体调用的响应时间和各个服务的响应时间等。

    3. 错误记录,根据服务返回统计单位时间异常次数。

    全链路性能监控 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。

    有了全链路监控工具,我们能够达到:

    1. 请求链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。

    2. 可视化:各个阶段耗时,进行性能分析。

    3. 依赖优化:各个调用环节的可用性、梳理服务依赖关系以及优化。

    4. 数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。

    1目标要求

    如上所述,那么我们选择全链路监控组件有哪些目标要求呢?Google Dapper 中也提到了,总结如下:

    1. 探针的性能消耗

    2. 代码的侵入性

    3. 可扩展性

    4. 数据的分析

    2功能模块

    一般的全链路监控系统,大致可分为四大功能模块:

    1. 埋点与生成日志

    2. 收集和存储日志

    3. 分析和统计调用链路数据,以及时效性

    4. 展现以及决策支持

    3Google Dapper

    Span

    基本工作单元,一次链路调用(可以是 RPC,DB 等没有特定的限制)创建一个 span,通过一个 64 位 ID 标识它,uuid 较为方便,span 中还有其他的数据,例如描述信息,时间戳,key-value 对的(Annotation)tag 信息,parent_id 等, 其中 parent-id 可以表示 span 调用链路来源。

    上图说明了 span 在一次大的跟踪过程中是什么样的。Dapper 记录了 span 名称,以及每个 span 的 ID 和父 ID,以重建在一次追踪过程中不同 span 之间的关系。如果一个 span 没有父 ID 被称为 root span。所有 span 都挂在一个特定的跟踪上,也共用一个跟踪 id。

    Span 数据结构:

    type Span struct {
        TraceID    int64 // 用于标示一次完整的请求 id
        Name       string
        ID         int64 // 当前这次调用 span_id
        ParentID   int64 // 上层服务的调用 span_id  最上层服务 parent_id 为 null
        Annotation []Annotation // 用于标记的时间戳
        Debug      bool
    }
    

    Trace

    类似于 树结构的 Span 集合,表示一次完整的跟踪,从请求到服务器开始,服务器返回 response 结束,跟踪每次 rpc 调用的耗时,存在唯一标识 trace_id。比如:你运行的分布式大数据存储一次 Trace 就由你的一次请求组成。

    每种颜色的 note 标注了一个 span,一条链路通过 TraceId 唯一标识,Span 标识发起的请求信息。树节点是整个架构的基本单元,而每一个节点又是对 span 的引用。节点之间的连线表示的 span 和它的父 span 直接的关系。虽然 span 在日志文件中只是简单的代表 span 的开始和结束时间,他们在整个树形结构中却是相对独立的。

    Annotation

    注解,用来记录请求特定事件相关信息(例如时间),一个 span 中会有多个 annotation 注解描述。通常包含四个注解信息:

    1. cs:Client Start,表示客户端发起请求

    2. sr:Server Receive,表示服务端收到请求

    3. ss:Server Send,表示服务端完成处理,并将结果发送给客户端

    4. cr:Client Received,表示客户端获取到服务端返回信息

    Annotation 数据结构:

    type Annotation struct {
        Timestamp int64
        Value     string
        Host      Endpoint
        Duration  int32
    }
    
    

    调用示例

     请求调用示例

    当用户发起一个请求时,首先到达前端 A 服务,然后分别对 B 服务和 C 服务进行 RPC 调用;

    B 服务处理完给 A 做出响应,但是 C 服务还需要和后端的 D 服务和 E 服务交互之后再返还给 A 服务,最后由 A 服务来响应用户的请求;

     调用过程追踪

    请求到来生成一个全局 TraceID,通过 TraceID 可以串联起整个调用链,一个 TraceID 代表一次请求。

    除了 TraceID 外,还需要 SpanID 用于记录调用父子关系。每个服务会记录下 parent id 和 span id,通过他们可以组织一次完整调用链的父子关系。

    一个没有 parent id 的 span 成为 root span,可以看成调用链入口。

    所有这些 ID 可用全局唯一的 64 位整数表示;

    整个调用过程中每个请求都要透传 TraceID 和 SpanID。

    每个服务将该次请求附带的 TraceID 和附带的 SpanID 作为 parent id 记录下,并且将自己生成的 SpanID 也记录下。

    要查看某次完整的调用则 只要根据 TraceID 查出所有调用记录,然后通过 parent id 和 span id 组织起整个调用父子关系。

    

     调用链核心工作

    调用链数据生成,对整个调用过程的所有应用进行埋点并输出日志。

    调用链数据采集,对各个应用中的日志数据进行采集。

    调用链数据存储及查询,对采集到的数据进行存储,由于日志数据量一般都很大,不仅要能对其存储,还需要能提供快速查询。

    指标运算、存储及查询,对采集到的日志数据进行各种指标运算,将运算结果保存起来。

    告警功能,提供各种阀值警告功能。

     整体部署架构

    

    通过 AGENT 生成调用链日志。

    通过 logstash 采集日志到 kafka。

    kafka 负责提供数据给下游消费。

    storm 计算汇聚指标结果并落到 es。

    storm 抽取 trace 数据并落到 es,这是为了提供比较复杂的查询。比如通过时间维度查询调用链,可以很快查询出所有符合的 traceID,根据这些 traceID 再去 Hbase 查数据就快了。

    logstash 将 kafka 原始数据拉取到 hbase 中。hbase 的 rowkey 为 traceID,根据 traceID 查询是很快的。

     AGENT 无侵入部署

    通过 AGENT 代理无侵入式部署,将性能测量与业务逻辑完全分离,可以测量任意类的任意方法的执行时间,这种方式大大提高了采集效率,并且减少运维成本。根据服务跨度主要分为两大类 AGENT:

    • 务内 AGENT,这种方式是通过 Java 的 agent 机制,对服务内部的方法调用层次信息进行数据收集,如方法调用耗时、入参、出参等信息。

    • 跨服务 AGENT,这种情况需要对主流 RPC 框架以插件形式提供无缝支持。并通过提供标准数据规范以适应自定义 RPC 框架:

      1. Dubbo 支持;

      2. Rest 支持;

      3. 自定义 RPC 支持;

     调用链监控好处

    准确掌握生产一线应用部署情况;

    从调用链全流程性能角度,识别对关键调用链,并进行优化;

    提供可追溯的性能数据,量化 IT 运维部门业务价值;

    快速定位代码性能问题,协助开发人员持续性的优化代码;

    协助开发人员进行白盒测试,缩短系统上线稳定期;

    4方案比较

    市面上的全链路监控理论模型大多都是借鉴 Google Dapper 论文,本文重点关注以下三种 APM 组件:

    • Zipkin:由 Twitter 公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。

    • Pinpoint:一款对 Java 编写的大规模分布式系统的 APM 工具,由韩国人开源的分布式跟踪组件。

    • Skywalking:国产的优秀 APM 组件,是一个对 JAVA 分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统。

    以上三种全链路监控方案需要对比的项提炼出来:

    1. 探针的性能

    2. collector 的可扩展性

    3. 全面的调用链路数据分析

    4. 对于开发透明,容易开关

    5. 完整的调用链应用拓扑

    探针的性能

    比较关注探针的性能,毕竟 APM 定位还是工具,如果启用了链路监控组建后,直接导致吞吐量降低过半,那也是不能接受的。对 skywalking、zipkin、pinpoint 进行了压测,并与基线(未使用探针)的情况进行了对比。

    选用了一个常见的基于 Spring 的应用程序,他包含 Spring Boot, Spring MVC,redis 客户端,mysql。监控这个应用程序,每个 trace,探针会抓取 5 个 span(1 Tomcat, 1 SpringMVC, 2 Jedis, 1 Mysql)。这边基本和 skywalkingtest 的测试应用差不多。

    模拟了三种并发用户:500,750,1000。使用 jmeter 测试,每个线程发送 30 个请求,设置思考时间为 10ms。使用的采样率为 1,即 100%,这边与生产可能有差别。pinpoint 默认的采样率为 20,即 50%,通过设置 agent 的配置文件改为 100%。zipkin 默认也是 1。组合起来,一共有 12 种。下面看下汇总表:

    探针性能对比
    

    从上表可以看出,在三种链路监控组件中,skywalking 的探针对吞吐量的影响最小,zipkin 的吞吐量居中。pinpoint 的探针对吞吐量的影响较为明显,在 500 并发用户时,测试服务的吞吐量从 1385 降低到 774,影响很大。然后再看下 CPU 和 memory 的影响,在内部服务器进行的压测,对 CPU 和 memory 的影响都差不多在 10% 之内。

    collector 的可扩展性

    collector 的可扩展性,使得能够水平扩展以便支持大规模服务器集群。

     zipkin

     skywalking

    skywalking 的 collector 支持两种部署方式:单机和集群模式。collector 与 agent 之间的通信使用了 gRPC。

     pinpoint

    同样,pinpoint 也是支持集群和单机部署的。pinpoint agent 通过 thrift 通信框架,发送链路信息到 collector。

    全面的调用链路数据分析

    全面的调用链路数据分析,提供代码级别的可见性以便轻松定位失败点和瓶颈。

     zipkin

    zipkin 的链路监控粒度相对没有那么细,从上图可以看到调用链中具体到接口级别,再进一步的调用信息并未涉及。

     skywalking

    

    skywalking 还支持 20+ 的中间件、框架、类库,比如:主流的 dubbo、Okhttp,还有 DB 和消息中间件。上图 skywalking 链路调用分析截取的比较简单,网关调用 user 服务,由于支持众多的中间件,所以 skywalking 链路调用分析比 zipkin 完备些。

     pinpoint

    pinpoint 应该是这三种 APM 组件中,数据分析最为完备的组件。提供代码级别的可见性以便轻松定位失败点和瓶颈,上图可以看到对于执行的 sql 语句,都进行了记录。还可以配置报警规则等,设置每个应用对应的负责人,根据配置的规则报警,支持的中间件和框架也比较完备。

    对于开发透明,容易开关

    对于开发透明,容易开关,添加新功能而无需修改代码,容易启用或者禁用。我们期望功能可以不修改代码就工作并希望得到代码级别的可见性。

    对于这一点,Zipkin 使用修改过的类库和它自己的容器 (Finagle) 来提供分布式事务跟踪的功能。但是,它要求在需要时修改代码。skywalking 和 pinpoint 都是基于字节码增强的方式,开发人员不需要修改代码,并且可以收集到更多精确的数据因为有字节码中的更多信息。

    完整的调用链应用拓扑

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

    pinpoint 链路拓扑

    skywalking 链路拓扑

    

    zipkin 链路拓扑

    上面三幅图,分别展示了 APM 组件各自的调用拓扑,都能实现完整的调用链应用拓扑。相对来说,pinpoint 界面显示的更加丰富,具体到调用的 DB 名,zipkin 的拓扑局限于服务于服务之间。

    Pinpoint 与 Zipkin 细化比较

     Pinpoint 与 Zipkin 差异性

    Pinpoint 是一个完整的性能监控解决方案:有从探针、收集器、存储到 Web 界面等全套体系;而 Zipkin 只侧重收集器和存储服务,虽然也有用户界面,但其功能与 Pinpoint 不可同日而语。反而 Zipkin 提供有 Query 接口,更强大的用户界面和系统集成能力,可以基于该接口二次开发实现。

    Zipkin 官方提供有基于 Finagle 框架(Scala 语言)的接口,而其他框架的接口由社区贡献,目前可以支持 Java、Scala、Node、Go、Python、Ruby 和 C# 等主流开发语言和框架;但是 Pinpoint 目前只有官方提供的 Java Agent 探针,其他的都在请求社区支援中(请参见 #1759 和 #1760)。

    Pinpoint 提供有 Java Agent 探针,通过字节码注入的方式实现调用拦截和数据收集,可以做到真正的代码无侵入,只需要在启动服务器的时候添加一些参数,就可以完成探针的部署;而 Zipkin 的 Java 接口实现 Brave,只提供了基本的操作 API,如果需要与框架或者项目集成的话,就需要手动添加配置文件或增加代码。

    Pinpoint 的后端存储基于 HBase,而 Zipkin 基于 Cassandra。

     Pinpoint 与 Zipkin 相似性

    Pinpoint 与 Zipkin 都是基于 Google Dapper 的那篇论文,因此理论基础大致相同。两者都是将服务调用拆分成若干有级联关系的 Span,通过 SpanId 和 ParentSpanId 来进行调用关系的级联;最后再将整个调用链流经的所有的 Span 汇聚成一个 Trace,报告给服务端的 collector 进行收集和存储。

    即便在这一点上,Pinpoint 所采用的概念也不完全与那篇论文一致。比如他采用 TransactionId 来取代 TraceId,而真正的 TraceId 是一个结构,里面包含了 TransactionId, SpanId 和 ParentSpanId。而且 Pinpoint 在 Span 下面又增加了一个 SpanEvent 结构,用来记录一个 Span 内部的调用细节(比如具体的方法调用等等),因此 Pinpoint 默认会比 Zipkin 记录更多的跟踪数据。但是理论上并没有限定 Span 的粒度大小,所以一个服务调用可以是一个 Span,那么每个服务中的方法调用也可以是个 Span,这样的话,其实 Brave 也可以跟踪到方法调用级别,只是具体实现并没有这样做而已。

     字节码注入 vs API 调用

    Pinpoint 实现了基于字节码注入的 Java Agent 探针,而 Zipkin 的 Brave 框架仅仅提供了应用层面的 API,但是细想问题远不那么简单。字节码注入是一种简单粗暴的解决方案,理论上来说无论任何方法调用,都可以通过注入代码的方式实现拦截,也就是说没有实现不了的,只有不会实现的。但 Brave 则不同,其提供的应用层面的 API 还需要框架底层驱动的支持,才能实现拦截。比如,MySQL 的 JDBC 驱动,就提供有注入 interceptor 的方法,因此只需要实现 StatementInterceptor 接口,并在 Connection String 中进行配置,就可以很简单的实现相关拦截;而与此相对的,低版本的 MongoDB 的驱动或者是 Spring Data MongoDB 的实现就没有如此接口,想要实现拦截查询语句的功能,就比较困难。

    因此在这一点上,Brave 是硬伤,无论使用字节码注入多么困难,但至少也是可以实现的,但是 Brave 却有无从下手的可能,而且是否可以注入,能够多大程度上注入,更多的取决于框架的 API 而不是自身的能力。

     难度及成本

    经过简单阅读 Pinpoint 和 Brave 插件的代码,可以发现两者的实现难度有天壤之别。在都没有任何开发文档支撑的前提下,Brave 比 Pinpoint 更容易上手。Brave 的代码量很少,核心功能都集中在 brave-core 这个模块下,一个中等水平的开发人员,可以在一天之内读懂其内容,并且能对 API 的结构有非常清晰的认识。

    Pinpoint 的代码封装也是非常好的,尤其是针对字节码注入的上层 API 的封装非常出色,但是这依然要求阅读人员对字节码注入多少有一些了解,虽然其用于注入代码的核心 API 并不多,但要想了解透彻,恐怕还得深入 Agent 的相关代码,比如很难一目了然的理解 addInterceptor 和 addScopedInterceptor 的区别,而这两个方法就是位于 Agent 的有关类型中。

    因为 Brave 的注入需要依赖底层框架提供相关接口,因此并不需要对框架有一个全面的了解,只需要知道能在什么地方注入,能够在注入的时候取得什么数据就可以了。就像上面的例子,我们根本不需要知道 MySQL 的 JDBC Driver 是如何实现的也可以做到拦截 SQL 的能力。但是 Pinpoint 就不然,因为 Pinpoint 几乎可以在任何地方注入任何代码,这需要开发人员对所需注入的库的代码实现有非常深入的了解,通过查看其 MySQL 和 Http Client 插件的实现就可以洞察这一点,当然这也从另外一个层面说明 Pinpoint 的能力确实可以非常强大,而且其默认实现的很多插件已经做到了非常细粒度的拦截。

    针对底层框架没有公开 API 的时候,其实 Brave 也并不完全无计可施,我们可以采取 AOP 的方式,一样能够将相关拦截注入到指定的代码中,而且显然 AOP 的应用要比字节码注入简单很多。

    以上这些直接关系到实现一个监控的成本,在 Pinpoint 的官方技术文档中,给出了一个参考数据。如果对一个系统集成的话,那么用于开发 Pinpoint 插件的成本是 100,将此插件集成入系统的成本是 0;但对于 Brave,插件开发的成本只有 20,而集成成本是 10。从这一点上可以看出官方给出的成本参考数据是 5:1。但是官方又强调了,如果有 10 个系统需要集成的话,那么总成本就是 10 * 10 + 20 = 120,就超出了 Pinpoint 的开发成本 100,而且需要集成的服务越多,这个差距就越大。

     通用性和扩展性

    很显然,这一点上 Pinpoint 完全处于劣势,从社区所开发出来的集成接口就可见一斑。

    Pinpoint 的数据接口缺乏文档,而且也不太标准(参考论坛讨论帖),需要阅读很多代码才可能实现一个自己的探针(比如 Node 的或者 PHP 的)。而且团队为了性能考虑使用了 Thrift 作为数据传输协议标准,比起 HTTP 和 JSON 而言难度增加了不少。

     社区支持

    这一点也不必多说,Zipkin 由 Twitter 开发,可以算得上是明星团队,而 Naver 的团队只是一个默默无闻的小团队(从 #1759 的讨论中可以看出)。虽然说这个项目在短期内不太可能消失或停止更新,但毕竟不如前者用起来更加放心。而且没有更多社区开发出来的插件,让 Pinpoint 只依靠团队自身的力量完成诸多框架的集成实属困难,而且他们目前的工作重点依然是在提升性能和稳定性上。

     其他

    Pinpoint 在实现之初就考虑到了性能问题,www.naver.com 网站的后端某些服务每天要处理超过 200 亿次的请求,因此他们会选择 Thrift 的二进制变长编码格式、而且使用 UDP 作为传输链路,同时在传递常量的时候也尽量使用数据参考字典,传递一个数字而不是直接传递字符串等等。这些优化也增加了系统的复杂度:包括使用 Thrift 接口的难度、UDP 数据传输的问题、以及数据常量字典的注册问题等等。

    相比之下,Zipkin 使用熟悉的 Restful 接口加 JSON,几乎没有任何学习成本和集成难度,只要知道数据传输结构,就可以轻易的为一个新的框架开发出相应的接口。

    另外 Pinpoint 缺乏针对请求的采样能力,显然在大流量的生产环境下,不太可能将所有的请求全部记录,这就要求对请求进行采样,以决定什么样的请求是我需要记录的。Pinpoint 和 Brave 都支持采样百分比,也就是百分之多少的请求会被记录下来。但是,除此之外 Brave 还提供了 Sampler 接口,可以自定义采样策略,尤其是当进行 A/B 测试的时候,这样的功能就非常有意义了。

     总结

    从短期目标来看,Pinpoint 确实具有压倒性的优势:无需对项目代码进行任何改动就可以部署探针、追踪数据细粒化到方法调用级别、功能强大的用户界面以及几乎比较全面的 Java 框架支持。但是长远来看,学习 Pinpoint 的开发接口,以及未来为不同的框架实现接口的成本都还是个未知数。相反,掌握 Brave 就相对容易,而且 Zipkin 的社区更加强大,更有可能在未来开发出更多的接口。在最坏的情况下,我们也可以自己通过 AOP 的方式添加适合于我们自己的监控代码,而并不需要引入太多的新技术和新概念。而且在未来业务发生变化的时候,Pinpoint 官方提供的报表是否能满足要求也不好说,增加新的报表也会带来不可以预测的工作难度和工作量。

    5Tracing 和 Monitor 区别

    Monitor 可分为系统监控和应用监控。系统监控比如 CPU,内存,网络,磁盘等等整体的系统负载的数据,细化可具体到各进程的相关数据。这一类信息是直接可以从系统中得到的。应用监控需要应用提供支持,暴露了相应的数据。比如应用内部请求的 QPS,请求处理的延时,请求处理的 error 数,消息队列的队列长度,崩溃情况,进程垃圾回收信息等等。Monitor 主要目标是发现异常,及时报警。

    Tracing 的基础和核心都是调用链。相关的 metric 大多都是围绕调用链分析得到的。Tracing 主要目标是系统分析。提前找到问题比出现问题后再去解决更好。

    Tracing 和应用级的 Monitor 技术栈上有很多共同点。都有数据的采集,分析,存储和展式。只是具体收集的数据维度不同,分析过程不一样。

    展开全文
  • Spring Cloud Sleuth + Zipkin

    2021-05-21 21:04:00
    zipkin.jar同级目录创建zipkin-server.properties文件: zipkin.storage.type=mysql zipkin.storage.mysql.host=localhost zipkin.storage.mysql.port=3306 zipkin.storage.mysql.username=root zipkin.storage....
  • 在微服务盛行的时代,一个公司的应用数量动辄成百上千个...Twitter基于该论文打造了自己的链路跟踪系统(也就是本文章的主角):zipkin并将其开源 简介 Zipkin is a distributed tracing system. It helps gather...
  • 是 颗粒度 接口级(类级别) 方法级 存储 ES,mysql,Cassandra,内存 ES,H2,TIDB agent到collector的协议 http,MQ http,gRPC Zipkin实践 Zipkin 分为两端,Zipkin 服务端和Zipkin 客户端,客户端也就是微服务的应用...
  • Add Zipkin API V2 Reporter

    2020-12-26 07:29:03
    <div><p>Expands span reporter selection by ...jaeger-agent but with the option of reporting to Zipkin backend. <p>In the spirit of https://github.com/jaegertracing/jaeger-client-java/pull/399 and ...
  • zipkin 开发zipkin-Server(其实就是提供的开箱即用包),zipkin-agentzipkin-Server通过http或者mq进行通信,http通信会对正常的访问造成影响,所以还是推荐基于mq异步方式通信 ,zipkin-Server通过订阅具体的...
  • Zipkin之外的选择:Skywalking vs Pinpoint

    千次阅读 2019-03-19 08:35:00
    另外,我们这次技术选型直接否定了Zipkin,其最大原因是它对代码有侵入性,CAT也是一样。这是我们所完全无法接受的。 这应该是目前最优秀的两款开源APM产品了,而且两款产品都通过字节码注入的方式,实现了对代码 ...
  • Nacos、ZipKin、Prometheus

    2021-05-27 10:52:17
    Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据。 什么是 Nacos 概览 ...
  • openzipkin / zipkin

    2020-09-16 15:21:23
    Application’s need to be “instrumented” to report trace data to Zipkin. This usually means configuration of a tracer or instrumentation library. The most popular ways to report data to Zipkin are ...
  • local_agent' => [ 'reporting_host' => env('JAEGER_REPORTING_HOST', 'localhost'), 'reporting_port' => env('JAEGER_REPORTING_PORT', ...
  • 基于JavaAgent的全链路监控>获取源码 基于JavaAgent的全链路监控一《嗨!JavaAgent》 基于JavaAgent的全链路监控二《通过字节码增加监控执行耗时》 基于JavaAgent的全链路监控三《ByteBuddy操作监控方法字节码》...
  • Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。 Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种...
  • zipkin 开发zipkin-Server(其实就是提供的开箱即用包),zipkin-agentzipkin-Server通过http或者mq进行通信,http通信会对正常的访问造成影响,所以还是推荐基于mq异步方式通信,zipkin-Server通过订阅具体的...
  • Zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。 pinpoint pinpoint是韩国人开源的 APM ...
  • agent实现apm上报

    2021-10-17 20:16:44
    文章目录前言动手实现apm上报...对于springcloud,有一套sleuth(主要是traceId+spanId生成)+zipkin(数据统计功能) skywalking,淘宝的鹰眼,蚂蚁金服sofatrace等等 动手实现apm上报功能 首先agent用的是byte-budd
  • - 什么是Zipkin介绍和部署 - 什么是zipkin - 官网: https://zipkin.io/ - 大规模分布式系统的Apm工具(Application Performance Management), 基于Google Dapper 的基础实现, 和sleuth结合可以提供可视化web界面...
  • zipkin系列:调用原理

    2020-01-12 13:12:58
    完成链路调用的记录后,如何来计算调用的延迟呢,这就需要利用Annotation信息: 总结两点: 1)使用zipkin,必须使用java8 2)在生产环境,不会对每个请求都进行采样追踪(降低trace对整个服务的性能损耗) AGENT无...
  • 失败调用还有错误日志: 4、告警提示: 5、指标数据对比 Zipkin原理 Zipkin 分为两端,Zipkin 服务端和Zipkin 客户端,客户端也就是微服务的应用。客户端配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被...
  • 由于要在zipkin的界面基础上进行修改,所以需要单独打包zipkin-ui并以docker形式跑起来(zipkin后台一直运行着)。一个学长曾经做过,记录如下,亲测可用: Maven打包zipkin:parent(root) -&gt; package 把...
  • 基于 Elasticsearch 的 Zipkin 统计

    千次阅读 2019-05-08 18:42:00
    "value": "[user-agent=okhttp/3.2.0]", "key": "Headers" }, { "endpoint": { "ipv4": "10.xxx.xxx.xxx", "port": 8088, "serviceName": "user-service" }, "value": "[id=100001]", "key": "Params" }...
  • zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。 Pinpoint:一款对Java编写的大规模分布式系统的APM工具,...
  • Spring Boot 链路追踪 Zipkin 入门

    千次阅读 2020-06-16 22:35:10
    如果胖友还没了解过分布式链路追踪Zipkin,建议先阅读下艿艿写的《Zipkin 极简入门》文章。虽然这篇文章标题是安装部署,实际可以理解成《一文带你快速入门 Zipkin》,哈哈哈。 可能会有胖友会有疑惑,Spring Boot ...
  • SkyWalking 本土开源的基于字节码注入...Zipkin twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。可进行多种存储方式进行支持,并且可进行扩展开发,制定对应...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,042
精华内容 816
关键字:

agentzipkin