如何追踪注册在Spring中类实例的方法调用?

1.在需要追踪的方法上,加上@Tracing标识。

public class TracingAspectBean {

    @Tracing
    public String doBusiness() {
        System.out.println("do business");
        return "Hello World";
    }
}

注意:对于方法的追踪,仅限于实例级的public方法。其他方法由于Java运行时原因,无法追踪。

2.Spring配置文件中,配置所需如下信息。

<bean id="tracingEnhance" class="com.ai.cloud.skywalking.plugin.spring.TracingEnhanceProcessor">

3.通过Spring标注,或配置文件将TracingAspectBean注册到Spring Context上下文中

如何追踪dubbo调用?

这里的dubbo,专指阿里发布的,已停止维护的标准dubbo版本(dubbo.io)。扩展版本dubbox请参考相关章节。

在客户端和服务端配置全局filter:swEnhanceFilter。

//客户端Spring配置文件
<dubbo:consumer filter="swEnhanceFilter"/>

//服务端Spring配置文件
<dubbo:provider filter="swEnhanceFilter"/>

如何追踪dubbox 2.8.4 调用?

dubbox 2.8.4 较为符合dubbo的服务规范,这里指dubbox支持RpcContext中的attachment。追踪方式和dubbo相同。

在客户端和服务端配置全局filter:swEnhanceFilter。

//客户端Spring配置文件
<dubbo:consumer filter="swEnhanceFilter"/>

//服务端Spring配置文件
<dubbo:provider filter="swEnhanceFilter"/>

如何追踪dubbox 2.8.3 以及之前的调用?

由于引入dubbox,主要目的是使用rest+json协议,所以以下方案都是在此种调用模式下的解决方案。其他协议未测试,请谅解,望大家提供测试结果与反馈。

dubbox 2.8.3 以及之前版本不能正确的支持RpcContext中的attachment,存在BUG(2.8.4已修复)。采用扩展参数对象的方法支持追踪的传递性。

注意:依然推荐升级到dubbox 2.8.4,此时能更好的进行追踪,并对程序侵入性更小。

1.在客户端和服务端配置全局filter:swEnhanceFilter。

//客户端Spring配置文件
<dubbo:consumer filter="swEnhanceFilter"/>

//服务端Spring配置文件
<dubbo:provider filter="swEnhanceFilter"/>

2.在客户端和服务端启动时,开启dubbox 2.8.3之前版本的修复功能。在服务启动前调用如下代码,或将com.ai.cloud.skywalking.plugin.dubbox.bugfix.below283.BugFixAcitve注册到Spring中。

new com.ai.cloud.skywalking.plugin.dubbox.bugfix.below283.BugFixAcitve();

3.dubbox调用参数包含javabean参数,并继承com.ai.cloud.skywalking.plugin.dubbox.bugfix.below283.SWBaseBean。只包含java基础类型(如:String、Integer等)的调用,无法支持追踪传递

4.客户端如果直接使用非dubbox客户端发起调用,需要在发送的参数中设置contextData。

如何追踪MySQL访问?

1.设置特定的JDBC Driver

Driver="com.ai.cloud.skywalking.plugin.jdbc.mysql.MySQLTracingDriver"

2.设置特定的JDBC URL

jdbc.url=tracing:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8

如何追踪MySQL之外的其他JDBC?

1.轻松实现自定义的JDBC Driver扩展

import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

import com.ai.cloud.skywalking.plugin.jdbc.TracingDriver;

public class XXXDBTracingDriver extends TracingDriver {
	static {
		try {
			DriverManager.registerDriver(new MySQLTracingDriver());
		} catch (SQLException e) {
			throw new RuntimeException("register "
					+ MySQLTracingDriver.class.getName() + " driver failure.");
		}
	}

	/**
	 * 继承自TracingDriver,返回真实的Driver
	 */
	@Override
	protected Driver registerTracingDriver() {
		try {
			//示例:return new com.mysql.jdbc.Driver();
			return new Driver();
		} catch (SQLException e) {
			throw new RuntimeException("create Driver failure.");
		}
	}

}

2.设置新实现的JDBC Driver

Driver="XXXDBTracingDriver"

3.设置特定的JDBC URL

jdbc.url=tracing:jdbc:xxxdb://localhost:3306/test

如何追踪web服务端访问?

服务端使用Filter追踪web请求

    <filter>
        <filter-namer>tracingFilter</filter-namer>
        <filter-classr>com.ai.cloud.skywalking.plugin.web.SkyWalkingFilter</filter-class>
        <init-param>
            <param-name>tracing-name</param-name>
            <!--分布式埋点信息,默认放在request的header中,key=SkyWalking-TRACING-NAME,可根据需要修改-->
            <param-value>SkyWalking-TRACING-NAME</param-value>
        </init-param>
    </filterr>
    <filter-mappingr>
        <filter-name>tracingFilter</filter-namer>
        <!--追踪路径应为MVC的请求路径,不建议包括js/css/图片等资源路径-->
        <url-patternr>/request-uri</url-patternr>
    </filter-mappingr>

如何通过HttpClient追踪HTTP调用?

使用SWTracingHttpClient封装所需的httpClient,此httpClient所有调用都会被监控

HttpClient httpclient = new SWTracingHttpClient(new DefaultHttpClient());

上下文将被存储在http request head,中,默认名称和SkyWalkingFilter保持一致。
如果服务端使用dubbox 2.4.3 的提供的http-rest,请使用方法重载

HttpClient httpclient = new SWTracingHttpClient(new DefaultHttpClient(), "Dubbo-Attachments");