SOFATracer 基于标准的 JDBC 接口实现,对于 DBCP、Druid、c3p0、Tomcat、HikariCP 五种连接池支持自动埋点。本文档将介绍如何使用 SOFATracer 对 DataSource 进行埋点。
前提条件
已升级 SOFABoot 至 3.4.11 及以上版本。
SOFABoot 3.4.11 之前的版本默认关闭 DataSource 埋点,且不支持通过配置开启,您需要升级您的 SOFABoot 版本。版本介绍请参见 版本说明。
已基于 SOFABoot 构建了一个 Spring Web 工程。
引入 Maven 依赖
引入 Tracer 依赖
在 SOFABoot 的 Web 项目中引入如下 Tracer 依赖:
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>tracer-enterprise-sofa-boot-starter</artifactId>
</dependency>
添加 Tracer 依赖后,可在 SOFABoot 的全局配置文件中添加配置项目以定制 Tracer 的行为。
引入 H2Database 依赖
为了方便,此处使用 H2Database 内存数据库测试,引入如下依赖:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
引入连接池依赖
引入所需的连接池依赖包,如 druid、c3p0、tomcat、dbcp、Hikari 等。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.5.31</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.8</version>
</dependency>
配置数据源
此处以 HikariCP 为例,新建一个名为 datasource.xml
的 Spring 配置文件,并定义如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- dataSource pool -->
<bean id="simpleDataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" primary="true">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="jdbcUrl" value="jdbc:h2:~/test"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</bean>
</beans>
本地应用配置
必要配置:引入 Tracer 需要强制配置应用名,否则应用启动失败。这一属性和 SOFABoot 框架要求一致。配置示例如下:
spring.application.name=SOFATracerDataSource com.alipay.sofa.tracer.datasource.enable=true
说明商业版 SOFABoot 默认不开启 DataSource 埋点,需要通过配置开启。
非必要配置:为了此示例工程正常运行,需要配置 H2Database 属性;另为了方便查看日志,需要配置日志路径。配置示例如下:
# logging path logging.path=./logs # h2 web consloe 路径 spring.h2.console.path=/h2-console # 开启 h2 web consloe,默认为 false spring.h2.console.enabled=true #允许远程访问 h2 web consloe spring.h2.console.settings.web-allow-others=true spring.datasource.username=sofa spring.datasource.password=123456 spring.datasource.url=jdbc:h2:~/test spring.datasource.driver-class-name=org.h2.Driver
新建 REST 服务
新建一个 REST 服务,触发 SQL 语句执行,便于查看 SQL 的 Tracer 记录。在以下 REST 服务创建中,触发了一个建表操作。
@RestController
public class SimpleRestController {
@Autowired
private DataSource simpleDataSource;
@RequestMapping("/create")
public Map<String, Object> create() {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
Connection cn = simpleDataSource.getConnection();
Statement st = cn.createStatement();
st.execute("DROP TABLE IF EXISTS TEST;"
+ "CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255));");
resultMap.put("success", true);
resultMap.put("result", "CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))");
} catch (Throwable throwable) {
resultMap.put("success", false);
resultMap.put("error", throwable.getMessage());
}
return resultMap;
}
}
运行工程
可以将 SOFABoot 工程导入到 IDE 中,工程编译正确后,运行工程里面中的 main 方法启动应用。启动后,通过在浏览器中访问localhost:8080/create
来执行上述 REST 服务。
查看日志
可以在 ./logs/datasource-client-digest.log
和 ./logs/datasource-client-stat.log
看到 SQL 执行的 Tracer 日志。
datasource-client-digest.log 示例:
{"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; 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 示例:
{"time":"2019-09-02 21:31:50.435","stat.key":{"local.app":"SOFATracerDataSource","database.name":"test","sql":"DROP TABLE IF EXISTS TEST; CREATE TABLE TEST(ID INT PRIMARY KEY%2C NAME VARCHAR(255));"},"count":1,"total.cost.milliseconds":15,"success":"true","load.test":"F"}
注意事项
引入 SOFATracer 需要强制配置应用名,否则应用启动失败。属性名称为:
spring.application.name
。SOFATracer 基于标准的 JDBC 接口实现,对于 DBCP、Druid、c3p0、Tomcat、HikariCP 五种连接池支持自动埋点,您只需引入 SOFATracer 依赖即可。在非 Spring Boot 环境还需要增加手动配置,比如:
<bean id="smartDataSource" class="com.alipay.sofa.tracer.plugins.datasource.SmartDataSource"init-method="init"> <property name="delegate" ref="simpleDataSource"/> <!--应用名称 --> <property name="appName" value="yourAppName"/> <!--数据库名称 --> <property name="database" value="yourDatabase"/> <!--数据库类型,支持MYSQL, ORACLE--> <property name="dbType" value="MYSQL"/> </bean> <bean id="simpleDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClass" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> ... </bean>