使用Pinpoint做分布式跟踪

Pinpoint是一个开源的 APM (Application Performance Management/应用性能管理)工具,用于基于java的大规模分布式系统。仿照Google Dapper,Pinpoint通过跟踪分布式应用之间的调用来提供解决方案,以帮助分析系统的总体结构和内部模块之间如何相互联系。

在使用上力图简单高效:

  • 安装agent,不需要修改哪怕一行代码
  • 最小化性能损失

通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量。

实时活动线程图表(Realtime Active Thread Chart)

实时监控应用内部的活动线程。

请求/应答分布图表(Request/Response Scatter Chart)

长期可视化请求数量和应答模式来定位潜在问题。通过在图表上拉拽可以选择请求查看更多的详细信息。

调用栈(CallStack)

在分布式环境中为每个调用生成代码级别的可视图,在单个视图中定位瓶颈和失败点。

查看应用上的其他详细信息,比如CPU使用率,内存/垃圾回收,TPS,和JVM参数。

支持模块

  • JDK 6+
  • Tomcat 6/7/8, Jetty 8/9, JBoss EAP 6, Resin 4, Websphere 6/7/8, Vertx 3.3/3.4/3.5
  • Spring, Spring Boot (Embedded Tomcat, Jetty)
  • Apache HTTP Client 3.x/4.x, JDK HttpConnector, GoogleHttpClient, OkHttpClient, NingAsyncHttpClient
  • Thrift Client, Thrift Service, DUBBO PROVIDER, DUBBO CONSUMER
  • ActiveMQ, RabbitMQ
  • MySQL, Oracle, MSSQL, CUBRID,POSTGRESQL, MARIA
  • Arcus, Memcached, Redis, CASSANDRA
  • iBATIS, MyBatis
  • DBCP, DBCP2, HIKARICP
  • gson, Jackson, Json Lib
  • log4j, Logback
  • 自定义模块

    Pinpoint与Dubbo的结合

启动Pinpoint

参考Pinpoint的搭建环境(不需要启动TestApp)

准备Dubbo示例程序

创建API包

pom.xml

新建API接口:

  1. public interface HelloService {
  2. String sayHello(String name);
  3. }

实现 Dubbo 服务提供方

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>demo-provider</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>demo-provider</name>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.0.3.RELEASE</version>
  14. <relativePath/> <!-- lookup parent from repository -->
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. </properties>
  20. <repositories>
  21. <repository>
  22. <id>sonatype-nexus-snapshots</id>
  23. <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  24. <releases>
  25. <enabled>false</enabled>
  26. </releases>
  27. <snapshots>
  28. <enabled>true</enabled>
  29. </snapshots>
  30. </repository>
  31. </repositories>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>com.alibaba.boot</groupId>
  39. <artifactId>dubbo-spring-boot-starter</artifactId>
  40. <version>0.2.0</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.example</groupId>
  44. <artifactId>demo-api</artifactId>
  45. <version>0.0.1-SNAPSHOT</version>
  46. </dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. </dependency>
  51. </dependencies>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>
  • 实现 HelloService 接口:
    1. package com.example.demoprovider.provider;

import com.alibaba.dubbo.config.annotation.Service;
import com.example.demoapi.HelloService;

  • 编写 Spring Boot 引导程序:
    1. package com.example.demoprovider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


public class DemoProviderApplication {

}

  • 配置 application.properties:
    1. # Spring boot application
      spring.application.name = dubbo-provider-demo
      server.port = 9090
      management.port = 9091

Service version

demo.service.version = 1.0.0

Base packages to scan Dubbo Components (e.g @Service , )

dubbo.scan.basePackages = com.example.demoprovider

Dubbo Config properties

dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo

ProtocolConfig Bean

dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 12345

dubbo.registry.id = my-registry
dubbo.registry.address = N/A

实现 Dubbo 服务消费方

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.example</groupId>
  6. <artifactId>demo-consumer</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>demo-consumer</name>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.0.3.RELEASE</version>
  14. <relativePath/> <!-- lookup parent from repository -->
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. </properties>
  21. <repositories>
  22. <repository>
  23. <id>sonatype-nexus-snapshots</id>
  24. <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  25. <releases>
  26. <enabled>false</enabled>
  27. </releases>
  28. <snapshots>
  29. </snapshots>
  30. </repository>
  31. </repositories>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-starter-web</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>com.alibaba.boot</groupId>
  39. <artifactId>dubbo-spring-boot-starter</artifactId>
  40. <version>0.2.0</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.example</groupId>
  44. <artifactId>demo-api</artifactId>
  45. <version>0.0.1-SNAPSHOT</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-test</artifactId>
  50. <scope>test</scope>
  51. </dependency>
  52. </dependencies>
  53. <build>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-maven-plugin</artifactId>
  58. <configuration>
  59. <classifier>exec</classifier>
  60. </configuration>
  61. </plugin>
  62. </plugins>
  63. </build>
  64. </project>
  • 通过 注入 HelloService
    1. package com.example.democonsumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.example.demoapi.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoConsumerController {
(version = "${demo.service.version}",
application = "${dubbo.application.id}",
url = "dubbo://<注意,这里填写具体IP>:12345")
private HelloService helloService;

  1. @RequestMapping(&#34;/sayHello&#34;)
  2. <span class="hljs-keyword">public</span> String <span class="hljs-title">sayHello</span><span class="hljs-params">(@RequestParam String name)</span> {
  3. return helloService.sayHello(name);
  4. }

}

  • 编写 Spring Boot 引导程序(Web 应用):

@SpringBootApplication
public class DemoConsumerApplication {

  1. <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> {
  2. SpringApplication.run(DemoConsumerApplication.class, args);
  3. }

}

  • 配置 application.properties:
    1. # Spring boot application
      spring.application.name=dubbo-consumer-demo
      server.port=8080
      management.port=8081

Service Version

demo.service.version=1.0.0

Dubbo Config properties

ApplicationConfig Bean

dubbo.application.id=dubbo-consumer-demo
dubbo.application.name=dubbo-consumer-demo

dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345

启动服务提供方

  • 编译打包

    1. mvn clean package
  • 附加参数启动服务提供方

    1. java -jar -javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar -Dpinpoint.agentId=demo-provider -Dpinpoint.applicationName=DP target/demo-provider-0.0.1-SNAPSHOT.jar
  • 附加参数启动服务消费方

使用Pinpoint快速定位问题

首页

调用树

/admin-guide/images/pinpoint-calltree.png

深入跟踪