全部产品
云市场

DataSource 埋点接入

更新时间:2020-02-18 09:27:16

本文档将介绍如何使用 SOFATracer 对 DataSource 进行埋点。

SOFATracer 2.2.0 基于标准的 JDBC 接口实现,支持对标准的数据库连接池(如 DBCP、Druid、c3p0、tomcat、HikariCP、BoneCP)埋点。下面演示如何接入 SOFATracer 埋点能力。

假设您已经基于 SOFABoot 构建了一个简单的 Spring Web 工程,那么可以通过如下步骤进行操作:

  1. 引入 Maven 依赖
  2. 配置数据源
  3. 本地应用配置
  4. 新建 REST 服务
  5. 运行工程
  6. 查看日志

引入 Maven 依赖

引入 Tracer 依赖

在 SOFABoot 的 Web 项目中引入如下 Tracer 依赖:

  1. <dependency>
  2. <groupId>com.alipay.sofa</groupId>
  3. <artifactId>tracer-enterprise-sofa-boot-starter</artifactId>
  4. </dependency>

添加 Tracer 依赖后,可在 SOFABoot 的全局配置文件中添加配置项目以定制 Tracer 的行为。

引入 H2Database 依赖

为了方便,此处使用 H2Database 内存数据库测试,引入如下依赖:

  1. <dependency>
  2. <groupId>com.h2database</groupId>
  3. <artifactId>h2</artifactId>
  4. <scope>runtime</scope>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. </dependency>

引入连接池依赖

引入所需的连接池依赖包,如 druid, c3p0, tomcat, dbcp, Hikari 等。

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid</artifactId>
  4. <version>1.0.12</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>c3p0</groupId>
  8. <artifactId>c3p0</artifactId>
  9. <version>0.9.1.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.tomcat</groupId>
  13. <artifactId>tomcat-jdbc</artifactId>
  14. <version>8.5.31</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>commons-dbcp</groupId>
  18. <artifactId>commons-dbcp</artifactId>
  19. <version>1.4</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.zaxxer</groupId>
  23. <artifactId>HikariCP-java6</artifactId>
  24. <version>2.3.8</version>
  25. </dependency>

配置数据源

此处以 HikariCP 为例,新建一个名为 datasource.xml 的 Spring 配置文件,并定义如下内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- dataSource pool -->
  6. <bean id="simpleDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" primary="true">
  7. <property name="driverClassName" value="org.h2.Driver"/>
  8. <property name="jdbcUrl" value="jdbc:h2:~/test"/>
  9. <property name="username" value="sofa"/>
  10. <property name="password" value="123456"/>
  11. </bean>
  12. </beans>

本地应用配置

  • 必要配置
    引入 Tracer 需要强制配置应用名,否则应用启动失败。这一属性和 SOFABoot 框架要求一致。配置示例如下:
    1. spring.application.name=SOFATracerDataSource
  • 非必要配置
    为了此示例工程正常运行,需要配置 H2Database 属性;另为了方便查看日志,需要配置日志路径。配置示例如下:

    1. # logging path
    2. logging.path=./logs
    3. # h2 web consloe 路径
    4. spring.h2.console.path=/h2-console
    5. # 开启 h2 web consloe,默认为 false
    6. spring.h2.console.enabled=true
    7. #允许远程访问 h2 web consloe
    8. spring.h2.console.settings.web-allow-others=true
    9. spring.datasource.username=sofa
    10. spring.datasource.password=123456
    11. spring.datasource.url=jdbc:h2:~/test
    12. spring.datasource.driver-class-name=org.h2.Driver

新建 REST 服务

新建一个 REST 服务,触发 SQL 语句执行,便于查看 SQL 的 Tracer 记录。在以下 REST 服务创建中,触发了一个建表操作。

  1. @RestController
  2. public class SimpleRestController {
  3. @Autowired
  4. private DataSource simpleDataSource;
  5. @RequestMapping("/create")
  6. public Map<String, Object> create() {
  7. Map<String, Object> resultMap = new HashMap<String, Object>();
  8. try {
  9. Connection cn = simpleDataSource.getConnection();
  10. Statement st = cn.createStatement();
  11. st.execute("DROP TABLE IF EXISTS TEST;"
  12. + "CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));");
  13. resultMap.put("success", true);
  14. resultMap.put("result", "CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
  15. } catch (Throwable throwable) {
  16. resultMap.put("success", false);
  17. resultMap.put("error", throwable.getMessage());
  18. }
  19. return resultMap;
  20. }
  21. }

运行工程

可以将 SOFABoot 工程导入到 IDE 中,工程编译正确后,运行工程里面中的 main 方法启动应用。启动后,通过在浏览器中访问 localhost:8080/create 来执行上述 REST 服务。

查看日志

可以在 ./logs/datasource-client-digest.log./logs/datasource-client-stat.log 看到 SQL 执行的 Tracer 日志.

  • datasource-client-digest.log 示例:
    1. {"time":"2019-09-02 21:31:31.566","local.app":"SOFATracerDataSource","traceId":"0a0fe91d156743109138810017302","spanId":"0.1","span.kind":"client","result.code":"00","current.thread.name":"http-nio-8080-exec-1","time.cost.milliseconds":"15ms","database.name":"test","sql":"DROP TABLE IF EXISTS TEST;
    2. CREATE TABLE TEST(ID INT PRIMARY KEY%2C NAME VARCHAR(255));","connection.establish.span":"128ms","db.execute.cost":"15ms","database.type":"h2","database.endpoint":"jdbc:h2:~/test:-1","sys.baggage":"","biz.baggage":""}
  • datasource-client-stat.log 示例:
    1. {"time":"2019-09-02 21:31:50.435","stat.key":{"local.app":"SOFATracerDataSource","database.name":"test","sql":"DROP TABLE IF EXISTS TEST;
    2. CREATE TABLE TEST(ID INT PRIMARY KEY%2C NAME VARCHAR(255));"},"count":1,"total.cost.milliseconds":15,"success":"true","load.test":"F"}

其他

在 SOFABoot 工程引入 Tracer 依赖后,会自动默认开启 DataSource 的埋点。如需禁止启动 DataSource 埋点,可以通过如下开关配置。

  1. com.alipay.sofa.tracer.datasource.enable=false

注意事项

  • 引入 SOFATracer 需要强制配置应用名,否则应用启动失败。属性名称为:spring.application.name
  • SOFATracer 2.2.0 基于标准的 JDBC 接口实现,理论上支持对所有标准的数据库连接池(如 DBCP,BoneCP 等)埋点。在 Spring Boot 环境,对于 DBCP、Druid、c3p0、tomcat、HikariCP 五种连接池支持自动埋点,即用户只需要引入 SOFATracer 依赖即可。在非 Spring Boot 环境或者对其他连接池(如 BoneCP)还需要增加手动配置,比如:

    1. <bean id="smartDataSource" class="com.alipay.sofa.tracer.plugins.datasource.SmartDataSource" init-method="init">
    2. <property name="delegate" ref="simpleDataSource"/>
    3. <!--应用名称 -->
    4. <property name="appName" value="yourAppName"/>
    5. <!--数据库名称 -->
    6. <property name="database" value="yourDatabase"/>
    7. <!--数据库类型,支持MYSQL, ORACLE-->
    8. <property name="dbType" value="MYSQL"/>
    9. </bean>
    10. <bean id="simpleDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    11. <property name="driverClass" value="com.mysql.jdbc.Driver" />
    12. <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" />
    13. <property name="username" value="root"/>
    14. <property name="password" value="abcdefgh"/>
    15. ...
    16. </bean>

    如上所示,您需要额外配置 SOFATracer 提供的 com.alipay.sofa.tracer.plugins.datasource.SmartDataSource