Skywalking快速入门
深入理解 Skywalking Agent
Skywalking+Elasticsearch安装及应用(邮箱告警)
官方向导方案:incubator-skywalking/blob/5.x/docs/README.md
中文文档在这里:incubator-skywalking/blob/5.x/docs/README_ZH.md
Centos安装skywalking 8.9.1
Skywalking集群搭建
Skywalking集群部署
SkyWalking的官方下载地址地址
Skywalking的UI端日志监控如何做、性能剖析如何做、监控告警如何做
基于 SkyWalking 实现服务链路追踪
分布式链路追踪系统_SkyWalking 搭建使用
skywalking后端-官网文档
芋道 Spring Boot 链路追踪 SkyWalking 入门
芋道 Spring Cloud 链路追踪 SkyWalking
skywalking09 - 异步线程链路续接(下)
swUI使用全攻略
SkyWalking8.7源码解析(六):ExitSpan和LocalSpan、链路追踪上下文、上下文适配器ContextManager、DataCarrier、链路数据发送到OAP
skywalking插件开发指南-Skywalking 6.2.0中文文档
skywalking插件开发指南-Skywalking 6.2.0中文文档
skywalking插件开发指南-Skywalking 8.0.0中文文档
Spring Cloud Sleuth + Zipkin 实现服务追踪
1)源码分析[一定要看]:https://skywalking.apache.org/zh/2022-03-25-skywalking-source-code-analyzation/
2)源码解析的文章:
https://blog.csdn.net/qq_40378034/article/details/121882943
https://blog.csdn.net/qq_40378034/article/details/122145509
https://blog.csdn.net/qq_40378034/article/details/122278500
其实Skywalking的核心就是插桩(插件)的实现,其他部分都是为采集出来的数据做服务。
为更好的了解插件体系,强烈建议读一下官方Java-Plugin-Development-Guide.md文档:/apache-skywalking-java-agent-8.9.0/docs/en/setup/service-agent/java-agent/Java-Plugin-Development-Guide.md
插件分为两类:Tracing plugin、Meter Plugin
1)自定义链路收集插件之Tracing plugin的开发
追踪插件的基本方法是通过使用字节码操作技术和 AOP 概念来拦截 Java 方法,SkyWalking 封装了字节码操作技术和追踪上下文传播, 所以你只需要定义拦截点(也就是 Spring 中的切入点)。
SkyWalking 提供了两种API来拦截构造函数、实例方法和类方法:
介绍下第一种:
继承ClassInstanceMethodsEnhancePluginDefine类,定义构造方法拦截点和实例方法拦截点。 继承ClassStaticMethodsEnhancePluginDefine类来定义 class method 的截点。
- 1
- 2
通过继承ClassInstanceMethodsEnhancePluginDefine类来实现插件的步骤。
step1、定义一个需要增强的目标类
@Override
protected ClassMatch enhanceClass() {
// 需要增强的类的全限定名
return NameMatch.byName("com.dhgate.apsaras.access.filter.ApsarasProxyFileter");
}
ClassMatch 表示如何匹配目标类。有4种方式:
byName:基于完整的类名(包名.类名)。
byClassAnnotationMatch:取决于目标类中是否存在某些注解(注意:不支持继承而来的注解)。
byMethodAnnotationMatch:取决于目标类的方法中是否有某些注解(注意:不支持继承而来的注解)。
byHierarchyMatch:基于目标类的父类或接口(官方不建议用这个,有很大的性能问题)。
step2、定义一个实例方法拦截点
@Override
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[] {
new InstanceMethodsInterceptPoint() {
/**
* @return 类某个具体的实例方法的匹配器
*/
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named("invoke");
}
/**
* @return 表示一个类名,类实例必须是instanceof InstanceMethodsAroundInterceptor。
*/
@Override
public String getMethodsInterceptor() {
return "org.apache.skywalking.apm.plugin.asf.dubbo.DubboInterceptor";
}
@Override
public boolean isOverrideArgs() {
return false;
}
}
};
}
step3、将自定义的插件类添加到skywalking-plugin.def配置文件中
比如:
dubbo-2.7.x=org.apache.skywalking.apm.plugin.asf.dubbo.DubboInstrumentation
why?
SkyWalkingAgent加载插件包--->new PluginBootstrap().loadPlugins()--->PluginResourcesResolver.getResources
step4、实现一个拦截器
自定义一个实例方法拦截器,并实现org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor,该接口声明了在调用方法之前和之后以及在异常处理期间使用核心 API。
/**
* A interceptor, which intercept method's invocation. The target methods will be defined in {@link
* ClassEnhancePluginDefine}'s subclass, most likely in {@link ClassInstanceMethodsEnhancePluginDefine}
*/
public interface InstanceMethodsAroundInterceptor {
/**
* 在目标方法调用之前调用
*
* @param result 拦截这个方法改变之后的结果
* @throws Throwable
*/
void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable;
/**
* 在目标方法调用之后调用。注意该方法会抛出异常。
*
* @param ret 方法的原返回值
* @return 该方法的实际返回值
* @throws Throwable
*/
Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable;
/**
* 发生异常时调用该方法。
*
* @param t the exception occur.
*/
void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t);
}
比如 DubboInterceptor。
2)自定义计量 API 各项指标插件之Meter Plugin开发
Meter Plugin代理插件可以使用计量 API 来收集用于后端分析的各项指标。
核心API:
Counter API 代表一个单调递增的计数器,它自动收集数据并报告给后端。
像UI界面展示的jvm图标信息等一系列的图标信息,都是通过此类插件收集上报到backend server端实现的:
1)链路数据发送到OAP Server
链路数据是agent探针里面定义的插件拦截功能收集到数据之后,通过grpc发送到OAP服务,OAP服务异步分析处理上报的数据,把数据解析为各个指标模块然后落库。
2)OAP Server将链路数据存储到ES中
8.1 本地编译打包APM
mvn clean package -Dmaven.test.skip=true
8.2 jenkins构建agent
jenkins构建地址:dhgate-skywalking-agent [Jenkins]
本地测试
step1、启动oap server和UI,有两种方式
1)第一种:直接IDEA中启动:
OAP Server启动入口:apache-skywalking-apm-8.9.1/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/OAPServerStartUp.java
skywalking UI启动入口:apache-skywalking-apm-8.9.1/apm-webapp/src/main/java/org/apache/skywalking/oap/server/webapp/ApplicationStartUp.java
2)第二种:解压编译打包出的,进入到bin目录,一键启动oap和web:
tar -xzvf apache-skywalking-apm-bin.tar.gz
cd /apache-skywalking-apm-bin/bin
./startup.sh
step2、编译apache-skywalking-java-agent-8.9.0
复制skywalking-agent.jar全路径,准备jvm参数:
-javaagent:/Users/yuanjiabo/Downloads/skywalkingdeploy/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.sample_n_per_3_secs=1000
-Dskywalking.agent.service_name=dhgate-xxx-xxx
-Dskywalking.agent.env_sign=G3 (or G4)
-Dskywalking.collector.backend_service=127.0.0.1:11800
step3、修改idea启动类运行配置,添加VM options参数:
step4、启动工程,访问工程里面的接口
step5、打开本地skywalking UI界面:http://localhost:8688/,即可查看链路追踪信息。