Talk skywalking of kafka-plugin

sequence

In this paper, we look skywalking of kafka-plugin

skywalking-plugin.def

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/resources/skywalking-plugin.def

kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.CallbackInstrumentation
kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.KafkaConsumerInstrumentation
kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.KafkaProducerInstrumentation
kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.KafkaProducerMapInstrumentation
kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.KafkaTemplateInstrumentation kafka-0.11.x/1.x/2.x=org.apache.skywalking.apm.plugin.kafka.define.KafkaTemplateCallbackInstrumentation 
  • skywalking of kafka-plugin provides CallbackInstrumentation, KafkaConsumerInstrumentation, KafkaProducerInstrumentation, KafkaProducerMapInstrumentation, KafkaTemplateInstrumentation, KafkaTemplateCallbackInstrumentation these enhancements

AbstractKafkaInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/AbstractKafkaInstrumentation.java

public abstract class AbstractKafkaInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @Override protected String[] witnessClasses() { return new String[]{"org.apache.kafka.clients.ApiVersions"}; } } 
  • AbstractKafkaInstrumentation inherited ClassInstanceMethodsEnhancePluginDefine, it is org.apache.kafka.clients.ApiVersions witnessClasses

AbstractKafkaTemplateInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/AbstractKafkaTemplateInstrumentation.java

public abstract class AbstractKafkaTemplateInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @Override protected String[] witnessClasses() { return new String[]{"org.springframework.kafka.core.KafkaTemplate"}; } } 
  • AbstractKafkaTemplateInstrumentation inherited ClassInstanceMethodsEnhancePluginDefine, it is org.springframework.kafka.core.KafkaTemplate witnessClasses

CallbackInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/CallbackInstrumentation.java

public class CallbackInstrumentation extends AbstractKafkaInstrumentation { public static final String ENHANCE_CLASS = "org.apache.kafka.clients.producer.Callback"; public static final String ENHANCE_METHOD = "onCompletion"; public static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.CallbackInterceptor"; @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}); } } 
  • CallbackInstrumentation inherited AbstractKafkaInstrumentation, it enhances the use of org.apache.skywalking.apm.plugin.kafka.CallbackInterceptor realized onCompletion method org.apache.kafka.clients.producer.Callback interface class

CallbackInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/CallbackInterceptor.java

public class CallbackInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { CallbackCache cache = (CallbackCache) objInst.getSkyWalkingDynamicField(); if (null != cache) { ContextSnapshot snapshot = getSnapshot(cache); RecordMetadata metadata = (RecordMetadata) allArguments[0]; AbstractSpan activeSpan = ContextManager.createLocalSpan("Kafka/Producer/Callback"); activeSpan.setComponent(ComponentsDefine.KAFKA_PRODUCER); Tags.MQ_TOPIC.set(activeSpan, metadata.topic()); ContextManager.continued(snapshot); } } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { CallbackCache cache = (CallbackCache) objInst.getSkyWalkingDynamicField(); if (null != cache) { ContextSnapshot snapshot = getSnapshot(cache); if (null != snapshot) { Exception exceptions = (Exception) allArguments[1]; if (exceptions != null) { ContextManager.activeSpan().errorOccurred().log(exceptions); } ContextManager.stopSpan(); } } return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } private ContextSnapshot getSnapshot(CallbackCache cache) { ContextSnapshot snapshot = cache.getSnapshot(); if (snapshot == null) { snapshot = ((CallbackCache) ((EnhancedInstance) cache.getCallback()).getSkyWalkingDynamicField()).getSnapshot(); } return snapshot; } } 
  • CallbackInterceptor InstanceMethodsAroundInterceptor implements an interface, a method is provided which beforeMethod Tags.MQ_TOPIC; afterMethod method performed ContextManager.activeSpan its abnormal () errorOccurred () log (exceptions), and then perform ContextManager.stopSpan ();.. Which handleMethodException method performed ContextManager. activeSpan (). errorOccurred (). log (t)

Kafka Consumer Instrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/KafkaConsumerInstrumentation.java

public class KafkaConsumerInstrumentation extends AbstractKafkaInstrumentation { public static final String CONSTRUCTOR_INTERCEPT_TYPE = "org.apache.kafka.clients.consumer.ConsumerConfig"; public static final String CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.ConsumerConstructorInterceptor"; public static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.KafkaConsumerInterceptor"; public static final String ENHANCE_METHOD = "pollOnce"; public static final String ENHANCE_COMPATIBLE_METHOD = "pollForFetches"; public static final String ENHANCE_CLASS = "org.apache.kafka.clients.consumer.KafkaConsumer"; public static final String SUBSCRIBE_METHOD = "subscribe"; public static final String SUBSCRIBE_INTERCEPT_TYPE = "org.apache.kafka.clients.consumer.ConsumerRebalanceListener"; public static final String SUBSCRIBE_INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.kafka.SubscribeMethodInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[] { new ConstructorInterceptPoint() { @Override public ElementMatcher<MethodDescription> getConstructorMatcher() { return takesArgumentWithType(0, CONSTRUCTOR_INTERCEPT_TYPE); } @Override public String getConstructorInterceptor() { return CONSTRUCTOR_INTERCEPTOR_CLASS; } } }; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[] { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(ENHANCE_METHOD).or(named(ENHANCE_COMPATIBLE_METHOD)); } @Override public String getMethodsInterceptor() { return INTERCEPTOR_CLASS; } @Override public boolean isOverrideArgs() { return false; } }, new InstanceMethodsInterceptPoint() { @Override public ElementMatcher<MethodDescription> getMethodsMatcher() { return named(SUBSCRIBE_METHOD).and(takesArgumentWithType(1, SUBSCRIBE_INTERCEPT_TYPE)); } @Override public String getMethodsInterceptor() { return SUBSCRIBE_INTERCEPT_CLASS; } @Override public boolean isOverrideArgs() { return false; } } }; } @Override protected ClassMatch enhanceClass() { return byName(ENHANCE_CLASS); } } 
  • KafkaConsumerInstrumentation inherited AbstractKafkaInstrumentation, it enhances the org.apache.kafka.clients.consumer.KafkaConsumer class; it uses its arguments to enhance org.apache.skywalking.apm.plugin.kafka.ConsumerConstructorInterceptor org.apache.kafka.clients.consumer .ConsumerConfig constructor; it uses org.apache.skywalking.apm.plugin.kafka.KafkaConsumerInterceptor enhanced pollOnce, pollForFetches method; it uses a second parameter to enhance org.apache.skywalking.apm.plugin.kafka.SubscribeMethodInterceptor org. apache.kafka.clients.consumer.ConsumerRebalanceListener the subscribe method

ConsumerConstructorInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/ConsumerConstructorInterceptor.java

public class ConsumerConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { ConsumerConfig config = (ConsumerConfig)allArguments[0]; // set the bootstrap server address ConsumerEnhanceRequiredInfo requiredInfo = new ConsumerEnhanceRequiredInfo(); requiredInfo.setBrokerServers(config.getList("bootstrap.servers")); requiredInfo.setGroupId(config.getString("group.id")); objInst.setSkyWalkingDynamicField(requiredInfo); } } 
  • ConsumerConstructorInterceptor realized InstanceConstructorInterceptor interface that onConstruct method creates ConsumerEnhanceRequiredInfo and set to objInst of skyWalkingDynamicField

KafkaConsumerInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/KafkaConsumerInterceptor.java

public class KafkaConsumerInterceptor implements InstanceMethodsAroundInterceptor { public static final String OPERATE_NAME_PREFIX = "Kafka/"; public static final String CONSUMER_OPERATE_NAME = "/Consumer/"; @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { ConsumerEnhanceRequiredInfo requiredInfo = (ConsumerEnhanceRequiredInfo)objInst.getSkyWalkingDynamicField(); requiredInfo.setStartTime(System.currentTimeMillis()); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { Map<TopicPartition, List<ConsumerRecord<?, ?>>> records = (Map<TopicPartition, List<ConsumerRecord<?, ?>>>)ret; // // The entry span will only be created when the consumer received at least one message. // if (records.size() > 0) { ConsumerEnhanceRequiredInfo requiredInfo = (ConsumerEnhanceRequiredInfo)objInst.getSkyWalkingDynamicField(); AbstractSpan activeSpan = ContextManager.createEntrySpan(OPERATE_NAME_PREFIX + requiredInfo.getTopics() + CONSUMER_OPERATE_NAME + requiredInfo.getGroupId(), null).start(requiredInfo.getStartTime()); activeSpan.setComponent(ComponentsDefine.KAFKA_CONSUMER); SpanLayer.asMQ(activeSpan); Tags.MQ_BROKER.set(activeSpan, requiredInfo.getBrokerServers()); Tags.MQ_TOPIC.set(activeSpan, requiredInfo.getTopics()); for (List<ConsumerRecord<?, ?>> consumerRecords : records.values()) { for (ConsumerRecord<?, ?> record : consumerRecords) { ContextCarrier contextCarrier = new ContextCarrier(); CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); Iterator<Header> iterator = record.headers().headers(next.getHeadKey()).iterator(); if (iterator.hasNext()) { next.setHeadValue(new String(iterator.next().value())); } } ContextManager.extract(contextCarrier); } } ContextManager.stopSpan(); } return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { ContextManager.activeSpan().errorOccurred().log(t); } } 
  • KafkaConsumerInterceptor InstanceMethodsAroundInterceptor implements an interface which beforeMethod and set its method of acquiring the startTime ConsumerEnhanceRequiredInfo; when it afterMethod method records.size () is greater than 0 is provided Tags.MQ_BROKER, Tags.MQ_TOPIC, and then extracted from the designated ConsumerRecord contextCarrier.items () of the header , then perform ContextManager.extract (contextCarrier), and finally performs ContextManager.stopSpan ();.. which handleMethodException method performed ContextManager.activeSpan () errorOccurred () log (t)

SubscribeMethodInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/SubscribeMethodInterceptor.java

public class SubscribeMethodInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { ConsumerEnhanceRequiredInfo requiredInfo = (ConsumerEnhanceRequiredInfo)objInst.getSkyWalkingDynamicField(); requiredInfo.setTopics((Collection<String>)allArguments[0]); objInst.setSkyWalkingDynamicField(requiredInfo); } @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) { ContextManager.activeSpan().errorOccurred().log(t); } } 
  • SubscribeMethodInterceptor InstanceMethodsAroundInterceptor implements an interface, which method creates ConsumerEnhanceRequiredInfo beforeMethod and disposed to skyWalkingDynamicField objInst; it handleMethodException execution ContextManager.activeSpan () errorOccurred () log (t)..

KafkaProducerInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/KafkaProducerInstrumentation.java

public class KafkaProducerInstrumentation extends AbstractKafkaInstrumentation { public static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.KafkaProducerInterceptor"; public static final String ENHANCE_CLASS = "org.apache.kafka.clients.producer.KafkaProducer"; public static final String ENHANCE_METHOD = "doSend"; public static final String CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.ProducerConstructorInterceptor"; public static final String CONSTRUCTOR_INTERCEPTOR_FLAG = "org.apache.kafka.clients.producer.ProducerConfig"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[]{ new ConstructorInterceptPoint() { @Override public ElementMatcher<MethodDescription> getConstructorMatcher() { return takesArgumentWithType(0, CONSTRUCTOR_INTERCEPTOR_FLAG); } @Override public String getConstructorInterceptor() { return CONSTRUCTOR_INTERCEPTOR_CLASS; } } }; } @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 byName(ENHANCE_CLASS); } } 
  • KafkaProducerInstrumentation inherited AbstractKafkaInstrumentation, it is enhanced org.apache.kafka.clients.producer.KafkaProducer class; it uses org.apache.skywalking.apm.plugin.kafka.ProducerConstructorInterceptor enhanced its parameters org.apache.kafka.clients. producer.ProducerConfig constructor; org.apache.skywalking.apm.plugin.kafka.KafkaProducerInterceptor it uses a method to enhance its doSend

ProducerConstructorInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/ProducerConstructorInterceptor.java

public class ProducerConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { ProducerConfig config = (ProducerConfig) allArguments[0]; objInst.setSkyWalkingDynamicField(StringUtil.join(';', config.getList("bootstrap.servers").toArray(new String[0]))); } } 
  • ProducerConstructorInterceptor InstanceConstructorInterceptor implements the interface, which will be provided bootstrap.servers onConstruct objInst information to the skyWalkingDynamicField

KafkaProducerInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/KafkaProducerInterceptor.java

public class KafkaProducerInterceptor implements InstanceMethodsAroundInterceptor {

    public static final String OPERATE_NAME_PREFIX = "Kafka/"; public static final String PRODUCER_OPERATE_NAME_SUFFIX = "/Producer"; @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { ContextCarrier contextCarrier = new ContextCarrier(); ProducerRecord record = (ProducerRecord) allArguments[0]; String topicName = record.topic(); AbstractSpan activeSpan = ContextManager.createExitSpan(OPERATE_NAME_PREFIX + topicName + PRODUCER_OPERATE_NAME_SUFFIX, contextCarrier, (String) objInst.getSkyWalkingDynamicField()); Tags.MQ_BROKER.set(activeSpan, (String) objInst.getSkyWalkingDynamicField()); Tags.MQ_TOPIC.set(activeSpan, topicName); SpanLayer.asMQ(activeSpan); activeSpan.setComponent(ComponentsDefine.KAFKA_PRODUCER); CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); record.headers().add(next.getHeadKey(), next.getHeadValue().getBytes()); } EnhancedInstance callbackInstance = (EnhancedInstance) allArguments[1]; if (null != callbackInstance) { ContextSnapshot snapshot = ContextManager.capture(); if (null != snapshot) { CallbackCache cache = new CallbackCache(); cache.setSnapshot(snapshot); callbackInstance.setSkyWalkingDynamicField(cache); } } } @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) { } } 
  • KafkaProducerInterceptor InstanceMethodsAroundInterceptor implements an interface, a method is provided which beforeMethod Tags.MQ_BROKER, Tags.MQ_TOPIC, then contextCarrier.items () information is provided to the header ProducerRecord addition is performed if not ContextSnapshot callbackInstance.setSkyWalkingDynamicField (cache) is null; which afterMethod method performed ContextManager.stopSpan ()

KafkaProducerMapInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/KafkaProducerMapInstrumentation.java

public class KafkaProducerMapInstrumentation extends AbstractKafkaInstrumentation { public static final String ENHANCE_CLASS = "org.apache.kafka.clients.producer.KafkaProducer"; public static final String CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.ProducerConstructorMapInterceptor"; public static final String CONSTRUCTOR_INTERCEPTOR_FLAG = "java.util.Map"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[]{ new ConstructorInterceptPoint() { @Override public ElementMatcher<MethodDescription> getConstructorMatcher() { return takesArgumentWithType(0, CONSTRUCTOR_INTERCEPTOR_FLAG); } @Override public String getConstructorInterceptor() { return CONSTRUCTOR_INTERCEPTOR_CLASS; } } }; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[0]; } @Override protected ClassMatch enhanceClass() { return byName(ENHANCE_CLASS); } } 
  • KafkaProducerMapInstrumentation inherited AbstractKafkaInstrumentation, it uses org.apache.skywalking.apm.plugin.kafka.ProducerConstructorMapInterceptor enhanced org.apache.kafka.clients.producer.KafkaProducer parameters for the constructor java.util.Map

ProducerConstructorMapInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/ProducerConstructorMapInterceptor.java

public class ProducerConstructorMapInterceptor implements InstanceConstructorInterceptor {

    @Override
    public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { Map<String, Object> config = (Map<String, Object>) allArguments[0]; // prevent errors caused by secondary interception in kafkaTemplate if (objInst.getSkyWalkingDynamicField() == null) { objInst.setSkyWalkingDynamicField(StringUtil.join(';', ((String) config.get("bootstrap.servers")).split(","))); } } } 
  • ProducerConstructorMapInterceptor InstanceConstructorInterceptor implements an interface, which method onConstruct bootstrap.servers information provided to the skyWalkingDynamicField objInst

KafkaTemplateInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/KafkaTemplateInstrumentation.java

public class KafkaTemplateInstrumentation extends AbstractKafkaTemplateInstrumentation { private static final String ENHANCE_CLASS = "org.springframework.kafka.core.KafkaTemplate"; private static final String ENHANCE_METHOD = "buildCallback"; private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.KafkaTemplateCallbackInterceptor"; @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 byName(ENHANCE_CLASS); } } 
  • KafkaTemplateInstrumentation inherited AbstractKafkaTemplateInstrumentation; it uses org.apache.skywalking.apm.plugin.kafka.KafkaTemplateCallbackInterceptor enhanced org.springframework.kafka.core.KafkaTemplate method of buildCallback

KafkaTemplateCallbackInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/KafkaTemplateCallbackInterceptor.java

public class KafkaTemplateCallbackInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, MethodInterceptResult result) throws Throwable { } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Object ret) throws Throwable { return new CallbackAdapter((org.apache.kafka.clients.producer.Callback) ret, objInst); } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) { } } 
  • KafkaTemplateCallbackInterceptor realized InstanceMethodsAroundInterceptor interface that afterMethod method org.apache.kafka.clients.producer.Callback packaging CallbackAdapter return

KafkaTemplateCallbackInstrumentation

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/define/KafkaTemplateCallbackInstrumentation.java

public class KafkaTemplateCallbackInstrumentation extends AbstractKafkaTemplateInstrumentation { private static final String ENHANCE_CLASS = "org.apache.kafka.clients.producer.KafkaProducer$InterceptorCallback"; private static final String CONSTRUCTOR_INTERCEPT_TYPE = "org.apache.kafka.clients.producer.Callback"; private static final String CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.kafka.CallbackConstructorInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { return new ConstructorInterceptPoint[]{ new ConstructorInterceptPoint() { @Override public ElementMatcher<MethodDescription> getConstructorMatcher() { return takesArgumentWithType(0, CONSTRUCTOR_INTERCEPT_TYPE); } @Override public String getConstructorInterceptor() { return CONSTRUCTOR_INTERCEPTOR_CLASS; } } }; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { return new InstanceMethodsInterceptPoint[0]; } @Override protected ClassMatch enhanceClass() { return byName(ENHANCE_CLASS); } } 
  • KafkaTemplateCallbackInstrumentation inherited AbstractKafkaTemplateInstrumentation; it enhances the use org.apache.skywalking.apm.plugin.kafka.CallbackConstructorInterceptor parameters org.apache.kafka.clients.producer.KafkaProducer $ InterceptorCallback for the org.apache.kafka.clients.producer.Callback constructor

CallbackConstructorInterceptor

skywalking-6.6.0/apm-sniffer/apm-sdk-plugin/kafka-plugin/src/main/java/org/apache/skywalking/apm/plugin/kafka/CallbackConstructorInterceptor.java

public class CallbackConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { Callback callback = (Callback) allArguments[0]; CallbackCache cache; if (null != objInst.getSkyWalkingDynamicField()) { cache = (CallbackCache) objInst.getSkyWalkingDynamicField(); } else { cache = new CallbackCache(); } cache.setCallback(callback); objInst.setSkyWalkingDynamicField(cache); } } 
  • CallbackConstructorInterceptor InstanceConstructorInterceptor implements an interface which is provided to CallbackCache onConstruct method of skyWalkingDynamicField objInst

summary

skywalking of kafka-plugin provides CallbackInstrumentation, KafkaConsumerInstrumentation, KafkaProducerInstrumentation, KafkaProducerMapInstrumentation, KafkaTemplateInstrumentation, KafkaTemplateCallbackInstrumentation these enhancements

Source: http://www.1994july.club/

Guess you like

Origin www.cnblogs.com/vwvwvwgwg/p/12514644.html