rocketmq - プラグインのskywalkingの話

シーケンス

本稿では、rocketmq - プラグインのskywalking見ます

skywalking-plugin.def

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/リソース/ skywalking-plugin.def

rocketMQ-4.x=org.apache.skywalking.apm.plugin.rocketMQ.v4.define.ConsumeMessageConcurrentlyInstrumentation
rocketMQ-4.x=org.apache.skywalking.apm.plugin.rocketMQ.v4.define.ConsumeMessageOrderlyInstrumentation
rocketMQ-4.x=org.apache.skywalking.apm.plugin.rocketMQ.v4.define.MQClientAPIImplInstrumentation
rocketMQ-4.x=org.apache.skywalking.apm.plugin.rocketMQ.v4.define.SendCallbackInstrumentation
  • skywalking rocketmq-プラグイン定義は、4つの拡張機能はConsumeMessageConcurrentlyInstrumentation、ConsumeMessageOrderlyInstrumentation、MQClientAPIImplInstrumentation、SendCallbackInstrumentationあります

ConsumeMessageConcurrentlyInstrumentation

skywalking-6.6.0 / APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 /定義/ ConsumeMessageConcurrentlyInstrumentation.java

public class ConsumeMessageConcurrentlyInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently"; private static final String CONSUMER_MESSAGE_METHOD = "consumeMessage"; private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.rocketMQ.v4.MessageConcurrentlyConsumeInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[0]; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(CONSUMER_MESSAGE_METHOD); } @Override public String getMethodsInterceptor() { return INTERCEPTOR_CLASS; } @Override public boolean isOverrideArgs() { return false; } } }; } @Override protected ClassMatch enhanceClass() { return HierarchyMatch.byHierarchyMatch(new String[] {ENHANCE_CLASS}); } } 
  • ConsumeMessageConcurrentlyInstrumentationは使用していますorg.apache.skywalking.apm.plugin.rocketMQ.v4.MessageConcurrentlyConsumeInterceptor org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrentlyのconsumeMessage方法を強化ClassInstanceMethodsEnhancePluginDefineを、継承されました

AbstractMessageConsumeInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / AbstractMessageConsumeInterceptor.java

public abstract class AbstractMessageConsumeInterceptor implements InstanceMethodsAroundInterceptor { public static final String CONSUMER_OPERATION_NAME_PREFIX = "RocketMQ/"; @Override public final void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { List<MessageExt> msgs = (List<MessageExt>)allArguments[0]; ContextCarrier contextCarrier = getContextCarrierFromMessage(msgs.get(0)); AbstractSpan span = ContextManager.createEntrySpan(CONSUMER_OPERATION_NAME_PREFIX + msgs.get(0).getTopic() + "/Consumer", contextCarrier); span.setComponent(ComponentsDefine.ROCKET_MQ_CONSUMER); SpanLayer.asMQ(span); for (int i = 1; i < msgs.size(); i++) { ContextManager.extract(getContextCarrierFromMessage(msgs.get(i))); } } @Override public final void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } private ContextCarrier getContextCarrierFromMessage(MessageExt message) { ContextCarrier contextCarrier = new ContextCarrier(); CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); next.setHeadValue(message.getUserProperty(next.getHeadKey())); } return contextCarrier; } } 
  • AbstractMessageConsumeInterceptor InstanceMethodsAroundInterceptor実装インタフェースを行う方法beforeMethod ContextManager.extract(getContextCarrierFromMessage(msgs.get(I)))は、handleMethodException ContextManager.activeSpan()errorOccurred()ログ(T)を行う方法..

MessageConcurrentlyConsumeInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / MessageConcurrentlyConsumeInterceptor.java

public class MessageConcurrentlyConsumeInterceptor extends AbstractMessageConsumeInterceptor { @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { ConsumeConcurrentlyStatus status = (ConsumeConcurrentlyStatus)ret; if (status == ConsumeConcurrentlyStatus.RECONSUME_LATER) { AbstractSpan activeSpan = ContextManager.activeSpan(); activeSpan.errorOccurred(); Tags.STATUS_CODE.set(activeSpan, status.name()); } ContextManager.stopSpan(); return ret; } } 
  • MessageConcurrentlyConsumeInterceptor値ConsumeConcurrentlyStatus.RECONSUME_LATER activeSpan.errorOccurred(実行AbstractMessageConsumeInterceptor、afterMethod ConsumeConcurrentlyStatusを得るその方法)とセットSTATUS_CODEを継承し、最後ContextManager.stopSpan()が実行しました

ConsumeMessageOrderlyInstrumentation

skywalking-6.6.0 / APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 /定義/ ConsumeMessageOrderlyInstrumentation.java

public class ConsumeMessageOrderlyInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly"; private static final String ENHANCE_METHOD = "consumeMessage"; private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.rocketMQ.v4.MessageOrderlyConsumeInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[0]; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(ENHANCE_METHOD); } @Override public String getMethodsInterceptor() { return INTERCEPTOR_CLASS; } @Override public boolean isOverrideArgs() { return false; } } }; } @Override protected ClassMatch enhanceClass() { return byHierarchyMatch(new String[] {ENHANCE_CLASS}); } } 
  • ConsumeMessageOrderlyInstrumentationは使用していますorg.apache.skywalking.apm.plugin.rocketMQ.v4.MessageOrderlyConsumeInterceptor org.apache.rocketmq.client.consumer.listener.MessageListenerOrderlyのconsumeMessage方法を強化ClassInstanceMethodsEnhancePluginDefineを、継承されました

MessageOrderlyConsumeInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / MessageOrderlyConsumeInterceptor.java

public class MessageOrderlyConsumeInterceptor extends AbstractMessageConsumeInterceptor { @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { ConsumeOrderlyStatus status = (ConsumeOrderlyStatus)ret; if (status == ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT) { AbstractSpan activeSpan = ContextManager.activeSpan(); activeSpan.errorOccurred(); Tags.STATUS_CODE.set(activeSpan, status.name()); } ContextManager.stopSpan(); return ret; } } 
  • MessageOrderlyConsumeInterceptor値ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT activeSpan.errorOccurred(実行AbstractMessageConsumeInterceptor、afterMethod ConsumeOrderlyStatusを得るその方法)とセットSTATUS_CODEを継承し、最後ContextManager.stopSpan()が実行しました

MQClientAPIImplInstrumentation

skywalking-6.6.0 / APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 /定義/ MQClientAPIImplInstrumentation.java

public class MQClientAPIImplInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.apache.rocketmq.client.impl.MQClientAPIImpl"; private static final String SEND_MESSAGE_METHOD_NAME = "sendMessage"; private static final String ASYNC_METHOD_INTERCEPTOR = "org.apache.skywalking.apm.plugin.rocketMQ.v4.MessageSendInterceptor"; public static final String UPDATE_NAME_SERVER_INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.rocketMQ.v4.UpdateNameServerInterceptor"; public static final String UPDATE_NAME_SERVER_METHOD_NAME = "updateNameServerAddressList"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[0]; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(SEND_MESSAGE_METHOD_NAME).and(takesArguments(12)); } @Override public String getMethodsInterceptor() { return ASYNC_METHOD_INTERCEPTOR; } @Override public boolean isOverrideArgs() { return false; } }, new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(UPDATE_NAME_SERVER_METHOD_NAME); } @Override public String getMethodsInterceptor() { return UPDATE_NAME_SERVER_INTERCEPT_CLASS; } @Override public boolean isOverrideArgs() { return false; } } }; } @Override protected ClassMatch enhanceClass() { return byName(ENHANCE_CLASS); } } 
  • MQClientAPIImplInstrumentationはClassInstanceMethodsEnhancePluginDefineを継承し、それはorg.apache.rocketmq.client.impl.MQClientAPIImplクラスを強化し、その使用org.apache.skywalking.apm.plugin.rocketMQ.v4.MessageSendInterceptor sendMessageメソッドを増強する;それはorg.apacheを使用しています。 skywalking.apm.plugin.rocketMQ.v4.UpdateNameServerInterceptorそのupdateNameServerAddressList方法を強化

MessageSendInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / MessageSendInterceptor.java

public class MessageSendInterceptor implements InstanceMethodsAroundInterceptor {

    public static final String ASYNC_SEND_OPERATION_NAME_PREFIX = "RocketMQ/"; @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { Message message = (Message)allArguments[2]; ContextCarrier contextCarrier = new ContextCarrier(); String namingServiceAddress = String.valueOf(objInst.getSkyWalkingDynamicField()); AbstractSpan span = ContextManager.createExitSpan(buildOperationName(message.getTopic()), contextCarrier, namingServiceAddress); span.setComponent(ComponentsDefine.ROCKET_MQ_PRODUCER); Tags.MQ_BROKER.set(span, (String)allArguments[0]); Tags.MQ_TOPIC.set(span, message.getTopic()); SpanLayer.asMQ(span); SendMessageRequestHeader requestHeader = (SendMessageRequestHeader)allArguments[3]; StringBuilder properties = new StringBuilder(requestHeader.getProperties()); CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); if (!StringUtil.isEmpty(next.getHeadValue())) { properties.append(next.getHeadKey()); properties.append(NAME_VALUE_SEPARATOR); properties.append(next.getHeadValue()); properties.append(PROPERTY_SEPARATOR); } } requestHeader.setProperties(properties.toString()); if (allArguments[6] != null) { ((EnhancedInstance)allArguments[6]).setSkyWalkingDynamicField(new SendCallBackEnhanceInfo(message.getTopic(), ContextManager.capture())); } } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } private String buildOperationName(String topicName) { return ASYNC_SEND_OPERATION_NAME_PREFIX + topicName + "/Producer"; } } 
  • ContextManager.stopSpan()を実行afterMethod法; handleMethodException ContextManager.activeSpanを行う方法()MessageSendInterceptor InstanceMethodsAroundInterceptor器具インタフェースは、方法はbeforeMethod MQ_BROKER、SendMessageRequestHeaderが透過伝送特性にMQ_TOPIC、及びcontextCarrier.items()が設けられています。 errorOccurred()。ログ(T)

UpdateNameServerInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / UpdateNameServerInterceptor.java

public class UpdateNameServerInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { objInst.setSkyWalkingDynamicField(allArguments[0]); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { } } 
  • UpdateNameServerInterceptor InstanceMethodsAroundInterceptorインターフェイスを実装する実行方法beforeMethod objInst.setSkyWalkingDynamicField(allArguments [0])

SendCallbackInstrumentation

skywalking-6.6.0 / APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 /定義/ SendCallbackInstrumentation.java

public class SendCallbackInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.apache.rocketmq.client.producer.SendCallback"; private static final String ON_SUCCESS_ENHANCE_METHOD = "onSuccess"; private static final String ON_SUCCESS_INTERCEPTOR = "org.apache.skywalking.apm.plugin.rocketMQ.v4.OnSuccessInterceptor"; private static final String ON_EXCEPTION_METHOD = "onException"; private static final String ON_EXCEPTION_INTERCEPTOR = "org.apache.skywalking.apm.plugin.rocketMQ.v4.OnExceptionInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[0]; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(ON_SUCCESS_ENHANCE_METHOD).and(takesArgumentWithType(0, "org.apache.rocketmq.client.producer.SendResult")); } @Override public String getMethodsInterceptor() { return ON_SUCCESS_INTERCEPTOR; } @Override public boolean isOverrideArgs() { return false; } }, new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(ON_EXCEPTION_METHOD).and(takesArgumentWithType(0, "java.lang.Throwable")); } @Override public String getMethodsInterceptor() { return ON_EXCEPTION_INTERCEPTOR; } @Override public boolean isOverrideArgs() { return false; } } }; } @Override protected ClassMatch enhanceClass() { return byHierarchyMatch(new String[] {ENHANCE_CLASS}); } } 
  • SendCallbackInstrumentationはClassInstanceMethodsEnhancePluginDefineを継承し、それはクラスorg.apache.rocketmq.client.producer.SendCallbackを高め、org.apache.skywalking.apm.plugin.rocketMQ.v4.OnSuccessInterceptorそれは、その強化され、最初のパラメータの型org.apacheを使用していますするonSuccess .rocketmq.client.producer.SendResult方法; org.apache.skywalking.apm.plugin.rocketMQ.v4.OnExceptionInterceptorがonExceptionをその拡張第1パラメータタイプjava.lang.Throwableのメソッドを使用し

OnSuccessInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / OnSuccessInterceptor.java

public class OnSuccessInterceptor implements InstanceMethodsAroundInterceptor { public static final String CALLBACK_OPERATION_NAME_PREFIX = "RocketMQ/"; @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { SendCallBackEnhanceInfo enhanceInfo = (SendCallBackEnhanceInfo)objInst.getSkyWalkingDynamicField(); AbstractSpan activeSpan = ContextManager.createLocalSpan(CALLBACK_OPERATION_NAME_PREFIX + enhanceInfo.getTopicId() + "/Producer/Callback"); activeSpan.setComponent(ComponentsDefine.ROCKET_MQ_PRODUCER); SendStatus sendStatus = ((SendResult)allArguments[0]).getSendStatus(); if (sendStatus != SendStatus.SEND_OK) { activeSpan.errorOccurred(); Tags.STATUS_CODE.set(activeSpan, sendStatus.name()); } ContextManager.continued(enhanceInfo.getContextSnapshot()); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } } 
  • afterMethod ContextManager.stopSpan()を実行する方法; OnSuccessInterceptor InstanceMethodsAroundInterceptor実装インタフェースを行う方法beforeMethod ContextManager.continued(enhanceInfo.getContextSnapshot())この方法はhandleMethodException ContextManager.activeSpan()errorOccurred()ログ(t)を行います..

OnExceptionInterceptor

skywalking-6.6.0を/ APM-スニファ/ APM-SDK-プラグイン/ rocketMQ-4.xでは、プラグイン/ srcに/メイン/ javaの/組織/ apacheの/ skywalking / APM /プラグイン/ rocketMQ / V4 / OnExceptionInterceptor.java

public class OnExceptionInterceptor implements InstanceMethodsAroundInterceptor { public static final String CALLBACK_OPERATION_NAME_PREFIX = "RocketMQ/"; @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { SendCallBackEnhanceInfo enhanceInfo = (SendCallBackEnhanceInfo)objInst.getSkyWalkingDynamicField(); AbstractSpan activeSpan = ContextManager.createLocalSpan(CALLBACK_OPERATION_NAME_PREFIX + enhanceInfo.getTopicId() + "/Producer/Callback"); activeSpan.setComponent(ComponentsDefine.ROCKET_MQ_PRODUCER); activeSpan.errorOccurred().log((Throwable)allArguments[0]); ContextManager.continued(enhanceInfo.getContextSnapshot()); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().log(t); } } 
  • OnExceptionInterceptor InstanceMethodsAroundInterceptor実装インタフェースを行う方法beforeMethod activeSpan.errorOccurred()ログ((のThrowable)allArguments [0])とContextManager.continued(enhanceInfo.getContextSnapshot());. afterMethod方法はContextManager.stopSpanを(実行)は、そのhandleMethodException ContextManager.activeSpanを行う方法()。ログ(T)メソッド

概要

skywalking rocketmq-プラグイン定義は、4つの拡張機能はConsumeMessageConcurrentlyInstrumentation、ConsumeMessageOrderlyInstrumentation、MQClientAPIImplInstrumentation、SendCallbackInstrumentationあります

出典:http://www.1994july.club/

おすすめ

転載: www.cnblogs.com/1994july/p/12483421.html