日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SkyWalking之高级玩法

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SkyWalking之高级玩法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導讀

  • SkyWalking是基于javaagent的兩大字節碼操作工具之一的Byte Buddy實現的無侵入APM(application performance monitor) 系統,目前項目在Apache孵化器中,想了解SkyWalking和Byte Buddy源碼的同學可在文章底部參考鏈接中,跳轉至對應的官方資源。
  • 本文會已通過Byte Buddy實現應用組件SpringMVC記錄請求路徑、入參、執行時間的javagent項目、持續迭代javaagent項目的方法論、SkyWalking agent在項目如何持續debug插件代碼、以及SkyWalking插件開發實踐的四個章節,讓大家掌握SkyWalking的玩法,進而讓SkyWalking在自己公司中的二次開發變得觸手可及。

Byte Buddy實現

  • 首先如果你對javaagent還不是很了解可以先百度一下,或在公眾號內看下《JavaAgent原理與實踐》簡單入門下。SpringMVC分發請求的關鍵方法相信已經不用我在贅述了,讓我們代碼代碼一把唆吧。
  • 編寫Byte Buddy javaagent代碼
public class AgentMain {public static void premain(String agentOps, Instrumentation instrumentation) {new AgentBuilder.Default().type(ElementMatchers.named("org.springframework.web.servlet.DispatcherServlet")).transform((builder, type, classLoader, module) ->builder.method(ElementMatchers.named("doDispatch")).intercept(MethodDelegation.to(DoDispatchInterceptor.class))).installOn(instrumentation);} } 復制代碼
  • 編寫DispatcherServlet doDispatch攔截器代碼(是不是跟AOP如出一轍)
public class DoDispatchInterceptor {@RuntimeTypepublic static Object intercept(@Argument(0) HttpServletRequest request, @SuperCall Callable<?> callable) {final StringBuilder in = new StringBuilder();if (request.getParameterMap() != null && request.getParameterMap().size() > 0) {request.getParameterMap().keySet().forEach(key -> in.append("key=" + key + "_value=" + request.getParameter(key) + ","));}long agentStart = System.currentTimeMillis();try {return callable.call();} catch (Exception e) {System.out.println("Exception :" + e.getMessage());return null;} finally {System.out.println("path:" + request.getRequestURI() + " 入參:" + in + " 耗時:" + (System.currentTimeMillis() - agentStart));}} } 復制代碼
  • 增加agent描述文件resources.META-INF.MANIFEST.MF
Manifest-Version: 1.0 Premain-Class: com.z.test.agent.AgentMain Can-Redefine-Classes: true 復制代碼
  • pom.xml文件
dependencies+net.bytebuddy.byte-buddy +javax.servlet.javax.servlet-api *scope=provided plugins+maven-jar-plugin *manifestFile=src/main/resources/META-INF/MANIFEST.MF+maven-shade-plugin *include:net.bytebuddy:byte-buddy:jar:+maven-compiler-plugin 復制代碼
  • 小結:沒幾十行代碼就完成了通過Byte Buddy實現應用組件SpringMVC記錄請求路徑、入參、執行時間javagent項目,是不是覺得自己很優秀。

持續迭代javaagent

  • 本小結主要介紹javaagen如何debug,以及持續集成。
  • 首先我的javajagent項目目錄結構如圖所示:
  • 應用項目是用幾行代碼實現的SpringBootWeb項目:
@SpringBootApplication(scanBasePackages = {"com"}) public class TestBootWeb {public static void main(String[] args) {SpringApplication.run(TestBootWeb.class, args);}@RestControllerpublic class ApiController {@PostMapping("/ping")public String ping(HttpServletRequest request) {return "pong";}} }復制代碼
  • 下面是關鍵javaagent項目如何持續迭代與集成:
VM options增加:-javaagent:/Users/zhao/Code/github/z_my_test/test-agent/target/test-agent-1.0-SNAPSHOT.jar=aaaaa Before launch 在Build之前增加:Working directory:/Users/zhao/Code/github/incubator-skywalkingCommand line:-T 1C -pl test-agent -am clean package -Denforcer.skip=true -Dmaven.test.skip=true -Dmaven.compile.fork=true 復制代碼
  • 詳細配置見圖片:
  • 小結:看到這里的將javaagent持續迭代集成,是不是瞬間覺得自己手心已經發癢起來,很想唆一個自己的agent代碼了呢,等等還有一個好消息:test-demo這10幾行的代碼實現的Web服務居然有5k左右的類可以使用agent增強,根據二八原則,一般的程序員至少熟悉1k左右的類,還不挑一個自己熟悉的類去挑戰下?
  • 注意mvn編譯加速的命令是maven3+版本以上才支持的哈。

SkyWalking Debug

  • 峰回路轉,到了文章的主題SkyWalking之高級玩法的正文啦,其實通過了上面的鋪墊,我想大家也或多或少已經知道我要說怎么SkyWalking怎么Debug了。所以我這里主要講幾個可以優化點,避免大家覺得沒有新意,提前賣個關子,我的集成時間優化到30秒左右哈:
VM options增加:-javaagent:-javaagent:/Users/zhao/Code/github/incubator-skywalking/skywalking-agent/skywalking-agent.jar:不要用dist里面的skywalking-agent.jar,具體原因大家可以看看源碼^_^ Before launch 在Build之前增加:Working directory:/Users/zhao/Code/github/incubator-skywalkingCommand line:-T 1C -pl apm-sniffer/apm-sdk-plugin -amd clean package -Denforcer.skip=true -Dmaven.test.skip=true -Dmaven.compile.fork=true: 這里我針對插件包,因為緊接著下文要開發插件 另外根pom注釋maven-checkstyle-plugin也可加速編譯 復制代碼
  • javaagent項目想debug,還需要將agent代碼與接入agent項目至少在同一個工作空間內,網上方法有很多,這里我推薦大家一個最簡單的方法。File->New->Module from Exisiting Sources...引入skywalking-agent源碼即可

kob之SkyWalking插件編寫

  • kob(貝殼分布式作業調度框架)是貝殼找房項目微服務集群中的基礎組件,通過編寫貝殼分布式作業調度框架的SkyWalking插件,可以實時收集作業調度任務的執行鏈路信息,從而及時得到基礎組件的穩定性,了解細節可點擊閱讀《貝殼分布式調度框架簡介》。想詳細了解SkyWalking插件編寫可在文章底部參考鏈接中,跳轉至對應的官方資源,好話不多說,代碼一把唆起來。
  • apm-sdk-plugin pom.xml增加自己的插件model
<artifactId>apm-sdk-plugin</artifactId><modules><module>kob-plugin</module>...<modules> 復制代碼
  • resources.skywalking-plugin.def增加自己的描述
kob=org.apache.skywalking.apm.plugin.kob.KobInstrumentation 復制代碼
  • 編寫方法instrumentation
public class KobInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {private static final String ENHANCE_CLASS = "com.ke.kob.client.spring.core.TaskDispatcher";private static final String INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.kob.KobInterceptor";@Overrideprotected ClassMatch enhanceClass() {return NameMatch.byName(ENHANCE_CLASS);}@Overrideprotected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {return null;}@Overrideprotected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {return new InstanceMethodsInterceptPoint[] {new InstanceMethodsInterceptPoint() {@Overridepublic ElementMatcher<MethodDescription> getMethodsMatcher() {return named("dispatcher1");}@Overridepublic String getMethodsInterceptor() {return INTERCEPT_CLASS;}@Overridepublic boolean isOverrideArgs() {return false;}}};} } 復制代碼
  • 自定義interceptor實現span的創建
public class KobInterceptor implements InstanceMethodsAroundInterceptor {@Overridepublic void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable {final ContextCarrier contextCarrier = new ContextCarrier();com.ke.kob.client.spring.model.TaskContext context = (TaskContext) allArguments[0];CarrierItem next = contextCarrier.items();while (next.hasNext()) {next = next.next();next.setHeadValue(JSON.toJSONString(context.getUserParam()));}AbstractSpan span = ContextManager.createEntrySpan("client:"+allArguments[1]+",task:"+context.getTaskKey(), contextCarrier);span.setComponent(ComponentsDefine.TRANSPORT_CLIENT);SpanLayer.asRPCFramework(span);}@Overridepublic Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable {ContextManager.stopSpan();return ret;}@Overridepublic void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) {} } 復制代碼
  • 實現效果,將操作名改成任務執行節點+任務執行方法,實現kob的SkyWalking的插件編寫,加上報警體系,可以進一步增加公司基礎組件的穩定性。

參考鏈接

  • Apache SkyWalking(an APM system) github.com/apache/incu…
  • Byte Buddy(runtime code generation for the Java virtual machine) github.com/raphw/byte-…

總結

以上是生活随笔為你收集整理的SkyWalking之高级玩法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。