Spring auto trace - acupple/dashcam GitHub Wiki

为了简化Dashcam Trace的接入方式,我们准对Spring和mybatis用户提供了一套根据Trace和Span注解自动追踪日志的Agent。 说的比较复杂,其实就是添加好依赖,然加几个Annotaion就可以自动完成Trace功能。 它可以:

  1. 自动生成调用链
  2. 记录调用方法的参数、返回值
  3. 记录执行的Sql
  4. 自动捕捉未try catch的报错并记录日志

使用方法如下

添加Maven依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mokey.acupple</groupId>
    <artifactId>acupple-dashcam-agent-spring</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>YOUR VERSION HERE</version>
</dependency>

配置EnableTrace, 在Spring的Configuration类上添加EnableTrace注解,并指明需要自动追踪的包名,例如:

@Configuration
@EnableTrace(basePackages = "org.mokey.acupple.demo")
public class RootConfig { }

配置Mybatis拦截器(可以选择不用,不用则不会trace SQL的日志)

  1. 注解方式
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource)
        throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setPlugins(new Interceptor[]{new MybatisInterceptor()});
    return  sessionFactory.getObject();
}
  1. xml方式
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource" />
   <property name="mapperLocations" value="classpath:sqlmap/**/*.xml"></property>
   <property name="plugins">
      <list>
         <bean id="mybatisInterceptor" class="org.mokey.acuuple.dashcam.agent.spring.MybatisInterceptor" />
      </list>
   </property>
</bean>

使用方式,例如我们有如下场景,Controller->WebService->EtcdService,则可以添加注解:

//Controller.listConfProperties是一个Trace的起点
@RequestMapping(value = "lsp", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
@Trace
public AjaxResult listConfProperties(Integer appId){
    AjaxResult result = new AjaxResult();
    try {
        List<TplProperty> properties =  webService.queryProperties(appId);
        result.setRet(true);
        result.setData(properties);
    }catch (Throwable e){
        result.setMsg(e.getMessage());
    }
 
    return result;
}
...................
//webService实现业务逻辑
@Trace
public List<TplProperty> queryProperties(Integer appId) {
    List<ConfigInfo> configInfos = configInfoDao.search(appId);
    if(configInfos == null){
        return null;
    }
    List<TplProperty> properties = new ArrayList<>();
    for (ConfigInfo info: configInfos){
        TplProperty property = new TplProperty();
        property.setName(info.getName());
        property.setValue(info.getDefaultValue());
        property.setDescription(info.getDescription());
 
        properties.add(property);
    }
    return properties;
}
....................
//configInfoDao从数据库中读取数据
@Select("SELECT * FROM `configinfo` WHERE `appId` = #{appId}")
List<ConfigInfo> search(@Param("appId")Integer appId)

如果想自动记录每一个Http请求的Request和Response以及异常信息, 添加如下依赖:

<dependency>
    <groupId>org.mokey.acupple</groupId>
    <artifactId>acupple-dashcam-agent-spring-web</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>

然后可以添加com.dcf.iqunxing.fx.dashcam.agent.spring.web.TraceLogFilter即可。

⚠️ **GitHub.com Fallback** ⚠️