diff --git a/CHANGES.md b/CHANGES.md index f97699ef3..5e07b6183 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,7 +14,8 @@ Release Notes. * Fix kafka-reporter-plugin shade package conflict * Add all config items to `agent.conf` file for convenient containerization use cases. * Advanced Kafka Producer configuration enhancement. -* Suport mTLS for gRPC channel. +* Support mTLS for gRPC channel. +* fix the bug that plugin record wrong time elapse for lettuce plugin #### Documentation diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AsyncCommandMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AsyncCommandMethodInterceptor.java deleted file mode 100644 index 8bae48ad2..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AsyncCommandMethodInterceptor.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import io.lettuce.core.protocol.AsyncCommand; -import org.apache.skywalking.apm.agent.core.context.ContextManager; -import org.apache.skywalking.apm.agent.core.context.tag.Tags; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; - -import java.lang.reflect.Method; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -public class AsyncCommandMethodInterceptor implements InstanceMethodsAroundInterceptor { - - @Override - @SuppressWarnings("unchecked") - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - AsyncCommand asyncCommand = (AsyncCommand) objInst; - String operationName = "Lettuce/" + asyncCommand.getType().name(); - AbstractSpan span = ContextManager.createLocalSpan(operationName + "/onComplete"); - span.setComponent(ComponentsDefine.LETTUCE); - Tags.DB_TYPE.set(span, "Redis"); - SpanLayer.asCache(span); - if (allArguments[0] instanceof Consumer) { - allArguments[0] = new SWConsumer((Consumer) allArguments[0], ContextManager.capture(), operationName); - } else { - allArguments[0] = new SWBiConsumer((BiConsumer) allArguments[0], ContextManager.capture(), operationName); - } - } - - @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); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/ClientOptionsConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/ClientOptionsConstructorInterceptor.java deleted file mode 100644 index 198054c15..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/ClientOptionsConstructorInterceptor.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; - -/** - * ClientOptions is the link between RedisChannelWriter and AbstractRedisClient. to enhance ClientOptions for bring - * peer(the cluster configuration information) in AbstractRedisClient to RedisChannelWriter. - */ -public class ClientOptionsConstructorInterceptor implements InstanceConstructorInterceptor { - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/DefaultEndpointChannelActiveInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/DefaultEndpointChannelActiveInterceptor.java new file mode 100644 index 000000000..f536d1770 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/DefaultEndpointChannelActiveInterceptor.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.lettuce.v5; + +import io.netty.channel.Channel; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; + +import java.lang.reflect.Method; +import java.net.InetSocketAddress; +import java.net.SocketAddress; + +public class DefaultEndpointChannelActiveInterceptor implements InstanceMethodsAroundInterceptor { + public static final String IP_AND_PORT_DELIMITER = ":"; + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + Channel channel = (Channel) allArguments[0]; + if (channel == null) { + return; + } + SocketAddress socketAddress = channel.remoteAddress(); + if (socketAddress instanceof InetSocketAddress) { + InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress; + String peer = inetSocketAddress.getHostString() + IP_AND_PORT_DELIMITER + inetSocketAddress.getPort(); + objInst.setSkyWalkingDynamicField(peer); + } + } + + @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) { + + } +} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptor.java index bb2ef1291..8d780d2bc 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptor.java @@ -18,25 +18,26 @@ package org.apache.skywalking.apm.plugin.lettuce.v5; -import java.lang.reflect.Method; -import java.util.Collection; - +import io.lettuce.core.protocol.CommandArgs; +import io.lettuce.core.protocol.DecoratedCommand; +import io.lettuce.core.protocol.RedisCommand; import org.apache.skywalking.apm.agent.core.conf.Constants; import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.skywalking.apm.util.StringUtil; -import io.lettuce.core.protocol.CommandArgs; -import io.lettuce.core.protocol.RedisCommand; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.List; -public class RedisChannelWriterInterceptor implements InstanceMethodsAroundInterceptor, InstanceConstructorInterceptor { +@SuppressWarnings("unchecked") +public class RedisChannelWriterInterceptor implements InstanceMethodsAroundInterceptor { private static final String PASSWORD_MASK = "******"; private static final String ABBR = "..."; @@ -44,15 +45,28 @@ public class RedisChannelWriterInterceptor implements InstanceMethodsAroundInter private static final String AUTH = "AUTH"; @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) { String peer = (String) objInst.getSkyWalkingDynamicField(); + RedisCommand spanCarrierCommand = getSpanCarrierCommand(allArguments[0]); + if (spanCarrierCommand == null) { + return; + } + EnhancedInstance enhancedCommand = (EnhancedInstance) spanCarrierCommand; + + // command has been handle by another channel writer (cluster or sentinel case) + if (enhancedCommand.getSkyWalkingDynamicField() != null) { + //set peer in last channel writer (delegate) + if (peer != null) { + AbstractSpan span = (AbstractSpan) enhancedCommand.getSkyWalkingDynamicField(); + span.setPeer(peer); + } + return; + } StringBuilder dbStatement = new StringBuilder(); String operationName = "Lettuce/"; - if (allArguments[0] instanceof RedisCommand) { - RedisCommand redisCommand = (RedisCommand) allArguments[0]; + RedisCommand redisCommand = (RedisCommand) allArguments[0]; String command = redisCommand.getType().name(); operationName = operationName + command; dbStatement.append(command); @@ -60,26 +74,28 @@ public class RedisChannelWriterInterceptor implements InstanceMethodsAroundInter dbStatement.append(DELIMITER_SPACE).append(getArgsStatement(redisCommand)); } } else if (allArguments[0] instanceof Collection) { - @SuppressWarnings("unchecked") Collection redisCommands = (Collection) allArguments[0]; + Collection> redisCommands = (Collection>) allArguments[0]; operationName = operationName + "BATCH_WRITE"; - for (RedisCommand redisCommand : redisCommands) { + for (RedisCommand redisCommand : redisCommands) { dbStatement.append(redisCommand.getType().name()).append(";"); } } - AbstractSpan span = ContextManager.createExitSpan(operationName, peer); span.setComponent(ComponentsDefine.LETTUCE); Tags.DB_TYPE.set(span, "Redis"); Tags.DB_STATEMENT.set(span, dbStatement.toString()); SpanLayer.asCache(span); + span.prepareForAsync(); + ContextManager.stopSpan(); + enhancedCommand.setSkyWalkingDynamicField(span); } - - private String getArgsStatement(RedisCommand redisCommand) { + + private String getArgsStatement(RedisCommand redisCommand) { String statement; if (AUTH.equalsIgnoreCase(redisCommand.getType().name())) { statement = PASSWORD_MASK; } else { - CommandArgs args = redisCommand.getArgs(); + CommandArgs args = redisCommand.getArgs(); statement = (args != null) ? args.toCommandString() : Constants.EMPTY_STRING; } if (StringUtil.isNotEmpty(statement) && statement.length() > LettucePluginConfig.Plugin.Lettuce.REDIS_PARAMETER_MAX_LENGTH) { @@ -89,22 +105,43 @@ public class RedisChannelWriterInterceptor implements InstanceMethodsAroundInter } @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { - ContextManager.stopSpan(); + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) { return ret; } @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { - AbstractSpan span = ContextManager.activeSpan(); - span.log(t); + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + RedisCommand redisCommand = getSpanCarrierCommand(allArguments[0]); + if (redisCommand instanceof EnhancedInstance && ((EnhancedInstance) redisCommand).getSkyWalkingDynamicField() != null) { + EnhancedInstance enhancedRedisCommand = (EnhancedInstance) redisCommand; + AbstractSpan abstractSpan = (AbstractSpan) enhancedRedisCommand.getSkyWalkingDynamicField(); + enhancedRedisCommand.setSkyWalkingDynamicField(null); + abstractSpan.log(t); + abstractSpan.asyncFinish(); + } } - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { - EnhancedInstance optionsInst = (EnhancedInstance) allArguments[0]; - objInst.setSkyWalkingDynamicField(optionsInst.getSkyWalkingDynamicField()); + private static RedisCommand getSpanCarrierCommand(Object o) { + RedisCommand command = null; + if (o instanceof RedisCommand) { + command = (RedisCommand) o; + } else if (o instanceof List) { + List list = (List) o; + command = list.isEmpty() ? null : (RedisCommand) list.get(list.size() - 1); + } else if (o instanceof Collection) { + Collection> redisCommands = (Collection>) o; + RedisCommand last = null; + for (RedisCommand redisCommand : redisCommands) { + last = redisCommand; + } + command = last; + } + if (command instanceof DecoratedCommand) { + while (command instanceof DecoratedCommand) { + DecoratedCommand wrapper = (DecoratedCommand) command; + command = wrapper.getDelegate(); + } + } + return command; } } diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClientConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClientConstructorInterceptor.java deleted file mode 100644 index 55bae1057..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClientConstructorInterceptor.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import io.lettuce.core.RedisClient; -import io.lettuce.core.RedisURI; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import org.apache.skywalking.apm.util.StringUtil; - -import java.util.stream.Collectors; - -public class RedisClientConstructorInterceptor implements InstanceConstructorInterceptor { - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { - RedisURI redisURI = (RedisURI) allArguments[1]; - RedisClient redisClient = (RedisClient) objInst; - EnhancedInstance optionsInst = (EnhancedInstance) redisClient.getOptions(); - StringBuilder redisPeer = new StringBuilder(); - if (StringUtil.isNotBlank(redisURI.getSentinelMasterId())) { - redisPeer.append(redisURI.getSentinelMasterId()).append("[").append( - redisURI.getSentinels().stream().map(r -> r.getHost() + ":" + r.getPort()) - .collect(Collectors.joining(","))).append("]"); - } else { - redisPeer.append(redisURI.getHost()).append(":").append(redisURI.getPort()); - } - optionsInst.setSkyWalkingDynamicField(redisPeer.toString()); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClusterClientConstructorInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClusterClientConstructorInterceptor.java deleted file mode 100644 index 1185c12e1..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisClusterClientConstructorInterceptor.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import io.lettuce.core.RedisURI; -import io.lettuce.core.cluster.RedisClusterClient; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; -import org.apache.skywalking.apm.agent.core.context.util.PeerFormat; - -public class RedisClusterClientConstructorInterceptor implements InstanceConstructorInterceptor { - - @Override - public void onConstruct(EnhancedInstance objInst, Object[] allArguments) { - @SuppressWarnings("unchecked") Iterable redisURIs = (Iterable) allArguments[1]; - RedisClusterClient redisClusterClient = (RedisClusterClient) objInst; - StringBuilder peer = new StringBuilder(); - for (RedisURI redisURI : redisURIs) { - peer.append(redisURI.getHost()).append(":").append(redisURI.getPort()).append(";"); - } - EnhancedInstance optionsInst = (EnhancedInstance) redisClusterClient.getOptions(); - optionsInst.setSkyWalkingDynamicField(PeerFormat.shorten(peer.toString())); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCancelMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCancelMethodInterceptor.java new file mode 100644 index 000000000..c6d496956 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCancelMethodInterceptor.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.lettuce.v5; + +import org.apache.skywalking.apm.agent.core.context.tag.StringTag; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; + +import java.lang.reflect.Method; + +public class RedisCommandCancelMethodInterceptor implements InstanceMethodsAroundInterceptor { + private static final String CANCEL_SIGNAL_TAG = "signalType"; + private static final String COMMAND_CANCEL_VALUE = "cancel"; + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) { + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) { + if (objInst.getSkyWalkingDynamicField() != null) { + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.errorOccurred(); + span.tag(new StringTag(CANCEL_SIGNAL_TAG), COMMAND_CANCEL_VALUE); + span.asyncFinish(); + objInst.setSkyWalkingDynamicField(null); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (objInst.getSkyWalkingDynamicField() != null) { + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.log(t); + } + } +} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteExceptionallyMethodInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteExceptionallyMethodInterceptor.java new file mode 100644 index 000000000..46c032399 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteExceptionallyMethodInterceptor.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.lettuce.v5; + +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; + +import java.lang.reflect.Method; + +public class RedisCommandCompleteExceptionallyMethodInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) { + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) { + if (objInst.getSkyWalkingDynamicField() != null) { + Throwable t = (Throwable) allArguments[0]; + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.log(t); + span.asyncFinish(); + objInst.setSkyWalkingDynamicField(null); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (objInst.getSkyWalkingDynamicField() != null) { + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.log(t); + } + } +} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AbstractRedisClientInterceptor.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteMethodInterceptor.java similarity index 63% rename from apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AbstractRedisClientInterceptor.java rename to apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteMethodInterceptor.java index 1eee93121..f59c3074b 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/AbstractRedisClientInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisCommandCompleteMethodInterceptor.java @@ -18,37 +18,35 @@ package org.apache.skywalking.apm.plugin.lettuce.v5; -import io.lettuce.core.AbstractRedisClient; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import java.lang.reflect.Method; -public class AbstractRedisClientInterceptor implements InstanceMethodsAroundInterceptor { +public class RedisCommandCompleteMethodInterceptor implements InstanceMethodsAroundInterceptor { @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - EnhancedInstance clientOptions = (EnhancedInstance) allArguments[0]; - if (clientOptions == null) { - return; - } - AbstractRedisClient client = (AbstractRedisClient) objInst; - if (client.getOptions() == null || ((EnhancedInstance) client.getOptions()).getSkyWalkingDynamicField() == null) { - return; - } - clientOptions.setSkyWalkingDynamicField(((EnhancedInstance) client.getOptions()).getSkyWalkingDynamicField()); + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) { } @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) { + if (objInst.getSkyWalkingDynamicField() != null) { + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.asyncFinish(); + objInst.setSkyWalkingDynamicField(null); + } return ret; } @Override public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { + Class[] argumentsTypes, Throwable t) { + if (objInst.getSkyWalkingDynamicField() != null) { + AbstractSpan span = (AbstractSpan) objInst.getSkyWalkingDynamicField(); + span.log(t); + } } } diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWBiConsumer.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWBiConsumer.java deleted file mode 100644 index 26aacbd94..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWBiConsumer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import org.apache.skywalking.apm.agent.core.context.ContextManager; -import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; -import org.apache.skywalking.apm.agent.core.context.tag.Tags; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; - -import java.util.function.BiConsumer; - -public class SWBiConsumer implements BiConsumer { - - private BiConsumer biConsumer; - private ContextSnapshot snapshot; - private String operationName; - - SWBiConsumer(BiConsumer biConsumer, ContextSnapshot snapshot, String operationName) { - this.biConsumer = biConsumer; - this.snapshot = snapshot; - this.operationName = operationName; - } - - @Override - public void accept(T t, U u) { - AbstractSpan span = ContextManager.createLocalSpan(operationName + "/accept"); - span.setComponent(ComponentsDefine.LETTUCE); - Tags.DB_TYPE.set(span, "Redis"); - SpanLayer.asCache(span); - try { - ContextManager.continued(snapshot); - biConsumer.accept(t, u); - } catch (Throwable th) { - ContextManager.activeSpan().log(th); - } finally { - ContextManager.stopSpan(); - } - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWConsumer.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWConsumer.java deleted file mode 100644 index 4454f1dab..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/SWConsumer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5; - -import org.apache.skywalking.apm.agent.core.context.ContextManager; -import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; -import org.apache.skywalking.apm.agent.core.context.tag.Tags; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; - -import java.util.function.Consumer; - -public class SWConsumer implements Consumer { - - private Consumer consumer; - private ContextSnapshot snapshot; - private String operationName; - - SWConsumer(Consumer consumer, ContextSnapshot snapshot, String operationName) { - this.consumer = consumer; - this.snapshot = snapshot; - this.operationName = operationName; - } - - @Override - public void accept(T t) { - AbstractSpan span = ContextManager.createLocalSpan(operationName + "/accept"); - span.setComponent(ComponentsDefine.LETTUCE); - Tags.DB_TYPE.set(span, "Redis"); - SpanLayer.asCache(span); - try { - ContextManager.continued(snapshot); - consumer.accept(t); - } catch (Throwable th) { - ContextManager.activeSpan().log(th); - } finally { - ContextManager.stopSpan(); - } - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/ClientOptionsInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/ClientOptionsInstrumentation.java deleted file mode 100644 index 968c113e6..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/ClientOptionsInstrumentation.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5.define; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; - -import static net.bytebuddy.matcher.ElementMatchers.any; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; - -public class ClientOptionsInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "io.lettuce.core.ClientOptions"; - - private static final String CLIENT_OPTIONS_CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.lettuce.v5.ClientOptionsConstructorInterceptor"; - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[] { - new ConstructorInterceptPoint() { - @Override - public ElementMatcher getConstructorMatcher() { - return any(); - } - - @Override - public String getConstructorInterceptor() { - return CLIENT_OPTIONS_CONSTRUCTOR_INTERCEPTOR_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } - - @Override - public ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AbstractRedisClientInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/DefaultEndpointInstrumentation.java similarity index 80% rename from apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AbstractRedisClientInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/DefaultEndpointInstrumentation.java index 2c96bcb22..9ec114fdf 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AbstractRedisClientInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/DefaultEndpointInstrumentation.java @@ -26,14 +26,14 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInst import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.named; -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; -public class AbstractRedisClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class DefaultEndpointInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "io.lettuce.core.AbstractRedisClient"; + private static final String ENHANCE_CLASS = "io.lettuce.core.protocol.DefaultEndpoint"; - private static final String ABSTRACT_REDIS_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.lettuce.v5.AbstractRedisClientInterceptor"; + private static final String DEFAULT_ENDPOINT_CHANNEL_ACTIVE_INTERCEPTOR = "org.apache.skywalking.apm.plugin.lettuce.v5.DefaultEndpointChannelActiveInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { @@ -46,12 +46,12 @@ public class AbstractRedisClientInstrumentation extends ClassInstanceMethodsEnha new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named("setOptions").and(takesArgumentWithType(0, "io.lettuce.core.ClientOptions")); + return named("notifyChannelActive").and(takesArgument(0, named("io.netty.channel.Channel"))); } @Override public String getMethodsInterceptor() { - return ABSTRACT_REDIS_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS; + return DEFAULT_ENDPOINT_CHANNEL_ACTIVE_INTERCEPTOR; } @Override diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisChannelWriterInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisChannelWriterInstrumentation.java index 7828d2c6b..e0a4d8c81 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisChannelWriterInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisChannelWriterInstrumentation.java @@ -25,43 +25,34 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsIn import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import java.util.List; + import static net.bytebuddy.matcher.ElementMatchers.named; -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch.byHierarchyMatch; /** * The writeAndFlush method is used in versions lower than 5.0.2.RELEASE */ public class RedisChannelWriterInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "io.lettuce.core.protocol.DefaultEndpoint"; + private static final String ENHANCE_CLASS = "io.lettuce.core.RedisChannelWriter"; private static final String REDIS_CHANNEL_WRITER_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisChannelWriterInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[] { - new ConstructorInterceptPoint() { - @Override - public ElementMatcher getConstructorMatcher() { - return takesArgumentWithType(0, "io.lettuce.core.ClientOptions"); - } - - @Override - public String getConstructorInterceptor() { - return REDIS_CHANNEL_WRITER_INTERCEPTOR_CLASS; - } - } - }; + return new ConstructorInterceptPoint[0]; } @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[] { + return new InstanceMethodsInterceptPoint[]{ new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named("writeToChannelAndFlush").or(named("writeAndFlush")); + return named("write").and(takesArgument(0, named("io.lettuce.core.protocol.RedisCommand")).or( + takesArgument(0, List.class))); } @Override @@ -73,12 +64,12 @@ public class RedisChannelWriterInstrumentation extends ClassInstanceMethodsEnhan public boolean isOverrideArgs() { return false; } - } + }, }; } @Override public ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); + return byHierarchyMatch(ENHANCE_CLASS); } } diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClientInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClientInstrumentation.java deleted file mode 100644 index c025c6f3e..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClientInstrumentation.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5.define; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; - -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; - -public class RedisClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "io.lettuce.core.RedisClient"; - - private static final String REDIS_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisClientConstructorInterceptor"; - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[] { - new ConstructorInterceptPoint() { - @Override - public ElementMatcher getConstructorMatcher() { - return takesArgumentWithType(1, "io.lettuce.core.RedisURI"); - } - - @Override - public String getConstructorInterceptor() { - return REDIS_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } - - @Override - public ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClusterClientInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClusterClientInstrumentation.java deleted file mode 100644 index 77811e841..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisClusterClientInstrumentation.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5.define; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; - -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; - -public class RedisClusterClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_CLASS = "io.lettuce.core.cluster.RedisClusterClient"; - - private static final String REDIS_CLUSTER_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisClusterClientConstructorInterceptor"; - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[] { - new ConstructorInterceptPoint() { - @Override - public ElementMatcher getConstructorMatcher() { - return takesArgumentWithType(1, "java.lang.Iterable"); - } - - @Override - public String getConstructorInterceptor() { - return REDIS_CLUSTER_CLIENT_CONSTRUCTOR_INTERCEPTOR_CLASS; - } - } - }; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[0]; - } - - @Override - public ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AsyncCommandInstrumentation.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisCommandInstrumentation.java similarity index 52% rename from apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AsyncCommandInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisCommandInstrumentation.java index eddfabee5..87dfc4871 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/AsyncCommandInstrumentation.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/lettuce/v5/define/RedisCommandInstrumentation.java @@ -26,14 +26,17 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInst import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import static net.bytebuddy.matcher.ElementMatchers.named; -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch.byHierarchyMatch; -public class AsyncCommandInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class RedisCommandInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "io.lettuce.core.protocol.AsyncCommand"; + private static final String ENHANCE_CLASS = "io.lettuce.core.protocol.RedisCommand"; - private static final String ASYNC_COMMAND_METHOD_INTERCEPTOR = "org.apache.skywalking.apm.plugin.lettuce.v5.AsyncCommandMethodInterceptor"; + private static final String REDIS_COMMAND_COMPLETE_METHOD_INTERCEPTOR = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisCommandCompleteMethodInterceptor"; + private static final String REDIS_COMMAND_COMPLETE_EXCEPTIONALLY_METHOD_INTERCEPTOR = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisCommandCompleteExceptionallyMethodInterceptor"; + public static final String REDIS_COMMAND_CANCEL_METHOD_INTERCEPTOR = "org.apache.skywalking.apm.plugin.lettuce.v5.RedisCommandCancelMethodInterceptor"; @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { @@ -46,25 +49,56 @@ public class AsyncCommandInstrumentation extends ClassInstanceMethodsEnhancePlug new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return (named("onComplete").and(takesArgumentWithType(0, "java.util.function.Consumer"))).or(named("onComplete") - .and(takesArgumentWithType(0, "java.util.function.BiConsumer"))); + return named("complete").and(takesArguments(0)); } @Override public String getMethodsInterceptor() { - return ASYNC_COMMAND_METHOD_INTERCEPTOR; + return REDIS_COMMAND_COMPLETE_METHOD_INTERCEPTOR; } @Override public boolean isOverrideArgs() { return true; } + }, + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("completeExceptionally").and(takesArguments(1)).and(takesArgument(0, Throwable.class)); + } + + @Override + public String getMethodsInterceptor() { + return REDIS_COMMAND_COMPLETE_EXCEPTIONALLY_METHOD_INTERCEPTOR; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + }, + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("cancel").and(takesArguments(0)); + } + + @Override + public String getMethodsInterceptor() { + return REDIS_COMMAND_CANCEL_METHOD_INTERCEPTOR; + } + + @Override + public boolean isOverrideArgs() { + return false; + } } }; } @Override public ClassMatch enhanceClass() { - return byName(ENHANCE_CLASS); + return byHierarchyMatch(ENHANCE_CLASS); } } diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/resources/skywalking-plugin.def index 7ab687d0c..bea812747 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/main/resources/skywalking-plugin.def @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.AbstractRedisClientInstrumentation -lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.AsyncCommandInstrumentation -lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.ClientOptionsInstrumentation +lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.DefaultEndpointInstrumentation lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.RedisChannelWriterInstrumentation -lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.RedisClientInstrumentation -lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.RedisClusterClientInstrumentation \ No newline at end of file +lettuce-5.x=org.apache.skywalking.apm.plugin.lettuce.v5.define.RedisCommandInstrumentation \ No newline at end of file diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptorTest.java index 27e8c8caa..95d50afec 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/RedisChannelWriterInterceptorTest.java @@ -18,12 +18,13 @@ package org.apache.skywalking.apm.plugin.lettuce.v5; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.util.ArrayList; -import java.util.List; - +import io.lettuce.core.codec.ByteArrayCodec; +import io.lettuce.core.output.CommandOutput; +import io.lettuce.core.protocol.Command; +import io.lettuce.core.protocol.CommandArgs; +import io.lettuce.core.protocol.CommandType; +import io.lettuce.core.protocol.ProtocolKeyword; +import io.lettuce.core.protocol.RedisCommand; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; @@ -35,11 +36,7 @@ import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; -import org.apache.skywalking.apm.plugin.lettuce.v5.mock.MockClientOptions; -import org.apache.skywalking.apm.plugin.lettuce.v5.mock.MockRedisClusterClient; import org.hamcrest.CoreMatchers; -import org.hamcrest.MatcherAssert; -import org.hamcrest.core.Is; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -47,32 +44,37 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.powermock.reflect.Whitebox; -import io.lettuce.core.RedisURI; -import io.lettuce.core.codec.ByteArrayCodec; -import io.lettuce.core.protocol.Command; -import io.lettuce.core.protocol.CommandArgs; -import io.lettuce.core.protocol.CommandType; -import io.lettuce.core.protocol.RedisCommand; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(TracingSegmentRunner.class) public class RedisChannelWriterInterceptorTest { + public static final String PEER = "192.168.1.12:6379"; + @SegmentStoragePoint private SegmentStorage segmentStorage; @Rule public AgentServiceRule serviceRule = new AgentServiceRule(); - @Mock - private MockInstance mockClientOptionsInstance; @Mock private MockInstance mockRedisChannelWriterInstance; private RedisChannelWriterInterceptor interceptor; - private class MockInstance implements EnhancedInstance { + private RedisCommandCompleteMethodInterceptor redisCommandCompleteMethodInterceptor; + + private static class MockInstance implements EnhancedInstance { private Object object; @Override @@ -86,29 +88,48 @@ public class RedisChannelWriterInterceptorTest { } } - @SuppressWarnings({ - "rawtypes", - "unchecked" - }) + private static class MockRedisCommand extends Command implements EnhancedInstance { + private Object object; + + public MockRedisCommand(ProtocolKeyword type, CommandOutput output) { + super(type, output); + } + + public MockRedisCommand(ProtocolKeyword type, CommandOutput output, CommandArgs args) { + super(type, output, args); + } + + @Override + public Object getSkyWalkingDynamicField() { + return object; + } + + @Override + public void setSkyWalkingDynamicField(Object value) { + this.object = value; + } + } + @Before - public void setUp() throws Exception { + public void setUp() { LettucePluginConfig.Plugin.Lettuce.TRACE_REDIS_PARAMETERS = true; mockRedisChannelWriterInstance = new MockInstance(); - mockClientOptionsInstance = new MockInstance(); - mockClientOptionsInstance.setSkyWalkingDynamicField("127.0.0.1:6379;127.0.0.1:6378;"); + mockRedisChannelWriterInstance.setSkyWalkingDynamicField(PEER); interceptor = new RedisChannelWriterInterceptor(); + redisCommandCompleteMethodInterceptor = new RedisCommandCompleteMethodInterceptor(); } @Test - public void testInterceptor() throws Throwable { - interceptor.onConstruct(mockRedisChannelWriterInstance, new Object[] {mockClientOptionsInstance}); - CommandArgs args = new CommandArgs(new ByteArrayCodec()).addKey("name".getBytes()).addValue("Tom".getBytes()); - RedisCommand redisCommand = new Command(CommandType.SET, null, args); - interceptor.beforeMethod(mockRedisChannelWriterInstance, null, new Object[] {redisCommand}, null, null); + public void testInterceptor() { + CommandArgs args = new CommandArgs<>(new ByteArrayCodec()).addKey("name".getBytes()).addValue("Tom".getBytes()); + MockRedisCommand redisCommand = new MockRedisCommand<>(CommandType.SET, null, args); + interceptor.beforeMethod(mockRedisChannelWriterInstance, null, new Object[]{redisCommand}, null, null); interceptor.afterMethod(mockRedisChannelWriterInstance, null, null, null, null); - MatcherAssert.assertThat((String) mockRedisChannelWriterInstance.getSkyWalkingDynamicField(), Is.is("127.0.0.1:6379;127.0.0.1:6378;")); + redisCommandCompleteMethodInterceptor.afterMethod(redisCommand, null, null, null, null); + TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); List spans = SegmentHelper.getSpans(traceSegment); + assertNotNull(spans); assertThat(spans.size(), is(1)); assertThat(spans.get(0).getOperationName(), is("Lettuce/SET")); assertThat(spans.get(0).isExit(), is(true)); @@ -117,22 +138,25 @@ public class RedisChannelWriterInterceptorTest { assertThat(tags.get(0).getValue(), is("Redis")); assertThat(tags.get(1).getValue(), CoreMatchers.containsString("Tom")); assertThat(SpanHelper.getLayer(spans.get(0)), CoreMatchers.is(SpanLayer.CACHE)); + assertThat(SpanHelper.getPeer(spans.get(0)), is(PEER)); } @Test - public void testOnHugeClusterConsumerConfig() { - List redisURIs = new ArrayList<>(100); - for (int i = 0; i < 100; i++) { - redisURIs.add(RedisURI.create("localhost", i)); + public void testGetSpanCarrierCommand() throws Exception { + Command command = new Command<>(CommandType.SET, null, null); + RedisCommand redisCommand = Whitebox.invokeMethod(interceptor, "getSpanCarrierCommand", command); + assertEquals(command, redisCommand); + List> list = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + list.add(new Command<>(CommandType.SET, null, null)); } - MockRedisClusterClient mockRedisClusterClient = new MockRedisClusterClient(); - MockClientOptions options = new MockClientOptions(); - mockRedisClusterClient.setOptions(options); - RedisClusterClientConstructorInterceptor constructorInterceptor = new RedisClusterClientConstructorInterceptor(); - constructorInterceptor.onConstruct(mockRedisClusterClient, new Object[] { - null, - redisURIs - }); - assertThat(options.getSkyWalkingDynamicField().toString().length(), Is.is(200)); + list.add(command); + RedisCommand last = Whitebox.invokeMethod(interceptor, "getSpanCarrierCommand", list); + assertEquals(command, last); + RedisCommand nullValue1 = Whitebox.invokeMethod(interceptor, "getSpanCarrierCommand", (Object) null); + assertNull(nullValue1); + list.add(null); + RedisCommand nullValue2 = Whitebox.invokeMethod(interceptor, "getSpanCarrierCommand", list); + assertNull(nullValue2); } } diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockClientOptions.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockClientOptions.java deleted file mode 100644 index cb2a89e6f..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockClientOptions.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5.mock; - -import io.lettuce.core.cluster.ClusterClientOptions; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; - -public class MockClientOptions extends ClusterClientOptions implements EnhancedInstance { - - private Object object; - - public MockClientOptions() { - this(ClusterClientOptions.builder()); - } - - protected MockClientOptions(Builder builder) { - super(builder); - } - - @Override - public Object getSkyWalkingDynamicField() { - return object; - } - - @Override - public void setSkyWalkingDynamicField(Object value) { - this.object = value; - } -} diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockRedisClusterClient.java b/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockRedisClusterClient.java deleted file mode 100644 index b97132b21..000000000 --- a/apm-sniffer/apm-sdk-plugin/lettuce-5.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/lettuce/v5/mock/MockRedisClusterClient.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.lettuce.v5.mock; - -import io.lettuce.core.cluster.RedisClusterClient; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; - -public class MockRedisClusterClient extends RedisClusterClient implements EnhancedInstance { - - private Object object; - - @Override - public Object getSkyWalkingDynamicField() { - return object; - } - - @Override - public void setSkyWalkingDynamicField(Object value) { - this.object = value; - } -} diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SpanHelper.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SpanHelper.java index 31ad6e93e..b4f81c4c7 100644 --- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SpanHelper.java +++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SpanHelper.java @@ -40,6 +40,19 @@ public class SpanHelper { return -9999; } + public static String getPeer(AbstractSpan tracingSpan) { + try { + return FieldGetter.get2LevelParentFieldValue(tracingSpan, "peer"); + } catch (Exception e) { + try { + return FieldGetter.getParentFieldValue(tracingSpan, "peer"); + } catch (Exception e1) { + + } + } + return null; + } + public static List getLogs(AbstractSpan tracingSpan) { try { List logs = FieldGetter.get2LevelParentFieldValue(tracingSpan, "logs"); diff --git a/test/plugin/scenarios/lettuce-scenario/config/expectedData.yaml b/test/plugin/scenarios/lettuce-scenario/config/expectedData.yaml index dac050fd7..c89c81ab7 100644 --- a/test/plugin/scenarios/lettuce-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/lettuce-scenario/config/expectedData.yaml @@ -14,53 +14,85 @@ # See the License for the specific language governing permissions and # limitations under the License. segmentItems: -- serviceName: lettuce-scenario - segmentSize: nq 0 - segments: - - segmentId: not null - spans: - - operationName: Lettuce/GET - operationId: 0 - parentSpanId: 0 - spanId: 1 - spanLayer: Cache - startTime: not null - endTime: not null - componentId: 57 - isError: false - spanType: Exit - peer: not null - tags: - - {key: db.type, value: Redis} - - {key: db.statement, value: GET key} - skipAnalysis: 'false' - - operationName: Lettuce/BATCH_WRITE - operationId: 0 - parentSpanId: 0 - spanId: 2 - spanLayer: Cache - startTime: not null - endTime: not null - componentId: 57 - isError: false - spanType: Exit - peer: not null - tags: - - {key: db.type, value: Redis} - - {key: db.statement, value: SET;SET;} - skipAnalysis: 'false' - - operationName: /lettuce-scenario/case/lettuce-case - operationId: 0 - parentSpanId: -1 - spanId: 0 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 1 - isError: false - spanType: Entry - peer: '' - tags: - - {key: url, value: not null} - - {key: http.method, value: GET} - skipAnalysis: 'false' + - serviceName: lettuce-scenario + segmentSize: nq 0 + segments: + - segmentId: not null + spans: + - operationName: /lettuce-scenario/case/healthCheck + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 1 + isError: false + spanType: Entry + peer: '' + skipAnalysis: false + tags: + - {key: url, value: 'http://localhost:8080/lettuce-scenario/case/healthCheck'} + - {key: http.method, value: HEAD} + - segmentId: not null + spans: + - operationName: Lettuce/GET + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Cache + startTime: not null + endTime: not null + componentId: 57 + isError: false + spanType: Exit + peer: not null + skipAnalysis: false + tags: + - {key: db.type, value: Redis} + - {key: db.statement, value: GET key} + - operationName: Lettuce/SET + operationId: 0 + parentSpanId: 0 + spanId: 2 + spanLayer: Cache + startTime: not null + endTime: not null + componentId: 57 + isError: false + spanType: Exit + peer: not null + skipAnalysis: false + tags: + - {key: db.type, value: Redis} + - {key: db.statement, value: SET key value} + - operationName: Lettuce/SET + operationId: 0 + parentSpanId: 0 + spanId: 3 + spanLayer: Cache + startTime: not null + endTime: not null + componentId: 57 + isError: false + spanType: Exit + peer: not null + skipAnalysis: false + tags: + - {key: db.type, value: Redis} + - {key: db.statement, value: SET key value} + - operationName: /lettuce-scenario/case/lettuce-case + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 1 + isError: false + spanType: Entry + peer: '' + skipAnalysis: false + tags: + - {key: url, value: 'http://localhost:8080/lettuce-scenario/case/lettuce-case'} + - {key: http.method, value: GET} diff --git a/test/plugin/scenarios/lettuce-scenario/support-version.list b/test/plugin/scenarios/lettuce-scenario/support-version.list index 89f51953d..add9033ee 100644 --- a/test/plugin/scenarios/lettuce-scenario/support-version.list +++ b/test/plugin/scenarios/lettuce-scenario/support-version.list @@ -16,4 +16,5 @@ 5.2.1.RELEASE 5.1.8.RELEASE -5.0.5.RELEASE \ No newline at end of file +5.0.5.RELEASE +6.1.4.RELEASE \ No newline at end of file