如何追踪注册在Spring中类实例的方法调用?
1.Spring配置文件头部,配置所需的命名空间
xmlns:skywalking="http://cloud.asiainfo.com/schema/skywalking" xsi:schemaLocation="http://cloud.asiainfo.com/schema/skywalking http://cloud.asiainfo.com/schema/skywalking/skywalking.xsd"
典型Spring配置文件如下
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:skywalking="http://cloud.asiainfo.com/schema/skywalking" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://cloud.asiainfo.com/schema/skywalking http://cloud.asiainfo.com/schema/skywalking/skywalking.xsd">
2.Spring配置文件中,设置需要追踪包名、类名或方法名。可配置多个。
<skywalking:trace packageExpression="com.ai.app.domain.test.*" classExpression="*"/> <skywalking:trace packageExpression="com.ai.app.domain.test..*" classExpression="className*"/>
注意:对于方法的追踪,仅限于实例级的public方法。其他方法由于Java运行时原因,无法追踪。
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 XXXDBTracingDriver());
} 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.8.4 的提供的http-rest,请使用方法重载
HttpClient httpclient = new SWTracingHttpClient(new DefaultHttpClient(), "Dubbo-Attachments");
能通过哪些渠道在应用中发现traceid?
1.通过向全链路监控绑定业务字段。建立traceid和业务字段的对应关系,在调用链路中,可以直接展现业务字段信息。
String businessKey = "phoneNumber:" + phoneNumber + ",resourceId:" + resourceId + ",mail:" + mail; BusinessKeyAppender.setBusinessKey2Trace(businessKey);
2.主动获取traceid,保存到应用程序数据库或其他存储中。
Tracing.getTraceId();
3.通过web应用的http调用入口,通过返回的header信息,找到此次调用的traceid。
4.通过log4j或log4j2的扩展,在每行本地日志中,输出traceid。
log4j1.x配置
log4j.appender.A1.layout=com.ai.cloud.skywalking.plugin.log.log4j.v1.x.TraceIdPatternLayout
#%x为traceid的转义符
log4j.appender.A1.layout.ConversionPattern=[%x] %-d{yyyy-MM-dd HH:mm:ss.SSS} %c %n[%p] %n%m%n
log4j2.x配置
<!--%tid为traceid的转义符-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%tid] [%t] %-5level %logger{36} - %msg%n"/>