Skip to content
blueszhangsh edited this page Mar 25, 2016 · 1 revision

概述

Kepler-Trace是基于Kepler框架之上的扩展,提供按条件打印RPC调用的入参、出参、耗时日志的功能。除了基本的调用信息外,还会输出trace id,用于将一次rpc请求中的上下游串联起来。下面举几个场景阐述该模块的实际应用:

  • 比如某个用户的行为比较可疑,想知道这个调用具体传了哪些参数,可以通过指定uid==XXX的条件打印相关的调用,分析调用的行为;
  • 再比如线上的服务监控发现某个服务的响应时间忽快忽慢,则可以指定响应时间大于某个阀值的条件打印相关的调用,分析这些调用的模式,找到服务的瓶颈。

配置

  1. 在service端的pom.xml文件里添加响应的jar包

    jackson包用来打印输入输出。

    <dependency>
    	<groupId>com.kepler</groupId>
    	<artifactId>kepler-all</artifactId>
    	<version>${maven.project.kepler.version}</version>
    </dependency>
    <dependency>
    	<groupId>com.kepler</groupId>
    	<artifactId>kepler-trace</artifactId>
    	<version>${maven.project.kepler.version}</version>
    </dependency>
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-databind</artifactId>
    	<version>${maven.project.jackson.version}</version>
    </dependency>
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-core</artifactId>
    	<version>${maven.project.jackson.version}</version>
    </dependency>
    <dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-annotations</artifactId>
    	<version>${maven.project.jackson.version}</version>
    </dependency>
    
  2. 在客户端开启Tracer,以产生Trace ID

    com.kepler.trace.trace.enabled=true
    com.kepler.header.headers.enabled=true
    
  3. 在服务端开启 Tracer

    com.kepler.config.profile.enabled=true
    com.kepler.trace.trace.enabled=true
    com.kepler.header.headers.enabled=true
    
  4. 服务端spring配置

    <import resource="classpath:kepler-trace-extension.xml" />
    
  5. 在服务实现类中,配置跟踪条件

    • 例子:
    @Autowired
    @TraceLogger(logger = "com.kepler.impl.PrinterImpl")
    public class PrinterImpl implements Printer {
    
    	public String print(String kepler) throws Exception {
    		return "Hello " + kepler;
    	}
    
    	@TraceEnabled(when="args[1] == 0")
    	@Override
    	public String print(String word, int printerType) throws Exception {
    		return "[PrinterType: " + printerType + "] Hello " + word;
    	}
    	
    	@TraceEnabled
    	@TraceLogger(logger = "com.kepler.impl.PrinterImpl.getType")
    	@Override
    	public String getType() throws Exception {
    		return "WOODEN";
    	}
    
    }
    
    • 说明:
      • 在服务的实现类上打上TraceLogger标签,logger参数指定需要打印的Logger;
      • 在需要开启Trace的方法上打上TraceEnabled标签。when参数用于指定跟踪条件,如果不填,默认为true,即所有的请求都会打出;
      • 如果某个方法需要使用别的Logger打印,同样可以用TraceLogger标签进行配置。
  6. 跟踪条件指南

    可以根据args、response、waiting和elapse设置跟踪条件;条件须是合法的SpEL表达式[@See SpEL表达式]

    • args是服务定义的方法的参数数组,类型为Object[];
    • response是服务定义的方法的返回值,类型为Object;
    • waiting是RPC请求进入线程池后直到被调度执行的等待时间,类型为long;
    • elapse是服务真正执行花费的时间,类型为long;
  7. 关于优化 Kepler-Trace在上传Trace的时候走的是RPC的方式。为了防止大量Trace造成的请求过大问题,Kepler-Trace提供了另一种序列化方式:Jackson + Snappy。该序列化方式会对请求和响应的报文进行压缩。

    开启方式:在配置文件里加上com.kepler.serial.serialid.dynamic=true

    开启后该序列化方式不会影响到别的服务。

Clone this wiki locally