当前位置: 首页 > 后端技术 > Java

Skywalking-02:如何编写Skywalking追踪插件

时间:2023-04-01 15:16:02 Java

如何写一个Skywalkingtrace插件javaagent原理美团技术团队-Java动态调试技术原理与实践com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently";//需要增强的方法privatestaticfinalStringCONSUMER_MESSAGE_METHOD="consumeMessage";//添加方法对应的拦截器privatestaticfinalStringINTERCEPTOR_CLASS="org.apache.skywalking.apm.plugin.ons.v1.MessageConcurrentlyConsumeInterceptor";//构造函数不需要拦截@OverridepublicConstructorInterceptPoint[]getConstructorsInterceptPoints(){returnnewConstructorInterceptPoint[0];}@OverridepublicInstanceMethodsInterceptPoint[]getInstanceMethods(InterceptMethods)newInstanceMethodsInterceptPoint[]{//添加一个新的拦截器newInstanceMethodsInterceptPoint(){@OverridepublicElementMatchergetMethodsMatcher(){//方法匹配returnnamed(CONSUMER_MESSAGE_METHOD);}@OverridepublicStringgetMethodsInterceptor(){returnINTERCEPTOR_CLASS;}@OverridepublicbooleanisOverrideArgs(){返回false;}}};}@OverrideprotectedClassMatchenhanceClass(){//需要增强的类returnHierarchyMatch.byHierarchyMatch(newString[]{ENHANCE_CLASS});}}AbstractMessageConsumeInterceptorpublicabstractclassAbstractMessageConsumeInterceptorimplementsInstanceMethodsAroundInterceptor{publicstaticfinalStringCONSUMER_OPERATION_NAME_PREFIX="OnsRocketMQ/";//在方法前增强@OverridepublicfinalvoidbeforeMethod(EnhancedInstanceobjInst,Methodmethod,Object[]allArguments,Class[]argumentsTypes,MethodInterceptResultresult)throwsThrowable{//获取方法参数并将其转化为消息列表Listmsgs=(List)所有参数[0];//从消息ContextCarrier中获取TraceId等Context信息contextCarrier=getContextCarrierFromMessage(msgs.get(0));//创建一个条目spanAbstractSpanspan=ContextManager.createEntrySpan(CONSUMER_OPERATION_NAME_PREFIX+msgs.get(0).getTopic()+"/Consumer",contextCarrier);span.setComponent(ComponentsDefine.ROCKET_MQ_CONSUMER);SpanLayer.asMQ(span);对于(inti=1;i[]argumentsTypes,Throwablet){ContextManager.activeSpan().log(t);}}privateContextCarriergetContextCarrierFromMessage(MessageExtmessage){ContextCarriercontextCarrier=newContextCarrier();CarrierItemnext=contextCarrier.items();while(next.hasNext()){next=next.next();next.setHeadValue(message.getUserProperty(next.getHeadKey()));}返回上下文载体;}}MessageConcurrentlyConsumeInterceptorpublicclassMessageConcurrentlyConsumeInterceptorextendsAbstractMessageConsumeInterceptor{//在方法后期处理@OverridepublicObjectafterMethod(EnhancedInstanceobjInst,Methodmethod,Object[]allArguments,Class[]argumentsTypes,Objectret)throwsThrowable{//获取消费状态ConsumeConcurrentlyStatusstatus=(ConsumeConcurrentlyStatus)ret;如果(状态==条件sumeConcurrentlyStatus.RECONSUME_LATER){//如果消费状态为retry,设置span时会报错AbstractSpanactiveSpan=ContextManager.activeSpan();activeSpan.errorOccurred();Tags.MQ_STATUS.set(activeSpan,status.name());}//停止spanContextManager.stopSpan();返还;}}项目:apm-ons-1.x-plugin参考文档apm-ons-1.x-plugin美团技术团队-Java动态调试技术原理与实践分享记录所见所闻

最新推荐
猜你喜欢