diff --git a/apm-sniffer/apm-agent-core/pom.xml b/apm-sniffer/apm-agent-core/pom.xml index 6e398be8a3bd2e1d002b0374efb94b217b645769..9ea7e33d6686bc3c2be7da5cb54b68d50d3ce360 100644 --- a/apm-sniffer/apm-agent-core/pom.xml +++ b/apm-sniffer/apm-agent-core/pom.xml @@ -36,7 +36,7 @@ UTF-8 9.4.2.v20170220 1.8.0 - 1.7.6 + 1.7.9 org.apache.skywalking.apm.dependencies com.lmax.disruptor diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/ILog.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/ILog.java index 0589c2659c55279a33ed367e5ffdbbe68aefd5f9..5c4d4960851d2e0aa3bd56a3ebd607aff2c8deb2 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/ILog.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/ILog.java @@ -33,6 +33,8 @@ public interface ILog { void warn(String format, Object... arguments); + void warn(Throwable e, String format, Object... arguments); + void error(String format, Throwable e); void error(Throwable e, String format, Object... arguments); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/NoopLogger.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/NoopLogger.java index 6aa243c7b068a224784f1cd52cc9924652f6ae09..2ad720692b3e9da1bd24d3153aaecf4dfd575901 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/NoopLogger.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/api/NoopLogger.java @@ -26,9 +26,7 @@ package org.apache.skywalking.apm.agent.core.logging.api; * Created by xin on 2016/11/10. */ public enum NoopLogger implements ILog { - INSTANCE { - - }; + INSTANCE; @Override public void info(String message) { @@ -89,4 +87,10 @@ public enum NoopLogger implements ILog { public void error(Throwable e, String format, Object... arguments) { } + + + @Override + public void warn(Throwable e, String format, Object... arguments) { + + } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/EasyLogger.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/EasyLogger.java index d7c423616235e2e1cada6b31697b78a2e6f6773f..c8e5845adb53eeab684207e17e3c26a383ebf44b 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/EasyLogger.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/logging/core/EasyLogger.java @@ -105,6 +105,12 @@ public class EasyLogger implements ILog { logger(LogLevel.WARN, replaceParam(format, arguments), null); } + @Override + public void warn(Throwable e, String format, Object... arguments) { + if (isWarnEnable()) + logger(LogLevel.WARN, replaceParam(format, arguments), e); + } + @Override public void error(String format, Throwable e) { if (isErrorEnable()) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java index 09606c05e952f896e67aa2efa02e1e86f80c4976..99e49a50ce238f88ea1c2a70ff4fb3fdd968eb81 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/PluginFinder.java @@ -30,6 +30,7 @@ import org.apache.skywalking.apm.agent.core.plugin.bytebuddy.AbstractJunction; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.IndirectMatch; import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.ProtectiveShieldMatcher; import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.not; @@ -98,6 +99,6 @@ public class PluginFinder { judge = judge.or(((IndirectMatch)match).buildJunction()); } } - return judge; + return new ProtectiveShieldMatcher(judge); } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/match/ProtectiveShieldMatcher.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/match/ProtectiveShieldMatcher.java new file mode 100644 index 0000000000000000000000000000000000000000..d1c80a66355a56e0c71d1fa773fba452af801f8e --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/match/ProtectiveShieldMatcher.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.agent.core.plugin.match; + +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.logging.api.ILog; +import org.apache.skywalking.apm.agent.core.logging.api.LogManager; + +/** + * In same cases, some frameworks and libraries use some binary codes tech too. From the community feedback, some of + * them have compatible issues with byte-buddy core, which trigger "Can't resolve type description" exception. + * + * So I build this protective shield by a nested matcher. When the origin matcher(s) can't resolve the type, the + * SkyWalking agent ignores this types. + * + * Notice: this ignore mechanism may miss some instrumentations, but at most cases, it's same. If missing happens, + * please pay attention to the WARNING logs. + * + * @author wu-sheng + */ +public class ProtectiveShieldMatcher extends ElementMatcher.Junction.AbstractBase { + private static final ILog logger = LogManager.getLogger(ProtectiveShieldMatcher.class); + + private final ElementMatcher matcher; + + public ProtectiveShieldMatcher(ElementMatcher matcher) { + this.matcher = matcher; + } + + public boolean matches(T target) { + try { + return this.matcher.matches(target); + } catch (Throwable t) { + logger.warn(t, "Byte-buddy occurs exception when match type."); + return false; + } + } +}