1 基本用法
Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。
现在我们的框架还没有与dubbo、mybatis做集成,所以我们通过手动编写一个本地方法,来测试Transaction的用法,创建TransactionController用于测试。
package com.example.demo.controller;
import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/transaction")
public class TransactionController {
@RequestMapping("/test")
public String test(){
//开启第一个Transaction,类别为URL,名称为test
Transaction t = Cat.newTransaction("URL", "test");
try {
dubbo();
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
t.setStatus(e);
Cat.logError(e);
} finally {
t.complete();
}
return "test";
}
private String dubbo(){
//开启第二个Transaction,类别为DUBBO,名称为dubbo
Transaction t = Cat.newTransaction("DUBBO", "dubbo");
try {
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
t.setStatus(e);
Cat.logError(e);
} finally {
t.complete();
}
return "test";
}
}
上面的代码中,开启了两个Transaction,其中第一个Transaction为Controller接收到的接口调用,第二个位我们编写的本地方法dubbo用来模拟远程调用。在方法内部,开启第二个Transaction。
启动项目,访问接口http://localhost:8085/transaction/test。
点击左侧菜单Transaction报表,选中URL类型对应的Log View查看调用链关系。
如图所示调用链已经形成,可以看到类型为URL的test调用了类型为DUBBO的dubbo方法,分别耗时0.02ms和0.01ms。
2 扩展API
CAT提供了一系列 API 来对 Transaction 进行修改。
- addData 添加额外的数据显示
- setStatus 设置状态,成功可以设置SUCCESS,失败可以设置异常
- setDurationInMillis 设置执行耗时(毫秒)
- setTimestamp 设置执行时间
- complete 结束Transaction
@RequestMapping("/api")
public String api(){
Transaction t = Cat.newTransaction("URL", "pageName");
try {
//设置执行时间1秒
t.setDurationInMillis(1000);
t.setTimestamp(System.currentTimeMillis());
//添加额外数据
t.addData("content");
t.setStatus(Transaction.SUCCESS);
} catch (Exception e) {
t.setStatus(e);
Cat.logError(e);
} finally {
t.complete();
}
return "api";
}
启动项目,访问接口http://localhost:8085/transaction/api。
点击左侧菜单Transaction报表,选中URL类型对应的Log View查看调用链关系。
如图所示,调用耗时已经被手动修改成了1000ms,并且添加了额外的信息content。
在使用 Transaction API 时,你可能需要注意以下几点:
- 你可以调用 addData 多次,添加的数据会被 & 连接起来。
- 不要忘记完成 transaction!否则你会得到一个毁坏的消息树以及内存泄漏!