未验证 提交 8ff8cd05 编写于 作者: 静夜思朝颜's avatar 静夜思朝颜 提交者: GitHub

Merge pull request #4379 from lsyf/master

Fix ehcache:  missing interceptor of private constructor and setName method
/*
* 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.ehcache.v2;
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 EhcacheCacheNameInterceptor 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 {
String name = (String) allArguments[0];
objInst.setSkyWalkingDynamicField(new EhcacheEnhanceInfo(name));
return ret;
}
@Override
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
Class<?>[] argumentsTypes, Throwable t) {
}
}
/*
* 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.ehcache.v2;
import net.sf.ehcache.Cache;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor;
public class EhcachePrivateConstructorInterceptor implements InstanceConstructorInterceptor {
@Override
public void onConstruct(EnhancedInstance objInst, Object[] allArguments) {
Cache cache = (Cache) allArguments[0];
// get cache name
if (cache != null && cache.getCacheConfiguration() != null) {
objInst.setSkyWalkingDynamicField(new EhcacheEnhanceInfo(cache.getCacheConfiguration().getName()));
}
}
}
......@@ -28,6 +28,7 @@ import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
import static org.apache.skywalking.apm.agent.core.plugin.match.NameMatch.byName;
/**
......@@ -37,6 +38,7 @@ public class EhcachePluginInstrumentation extends ClassInstanceMethodsEnhancePlu
public static final String INTERCEPT_CLASS = "net.sf.ehcache.Cache";
public static final String CONSTRUCTOR_CLASS_INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.ehcache.v2.EhcacheConstructorInterceptor";
public static final String PRIVATE_CONSTRUCTOR_CLASS_INTERCEPT_CLASS = "org.apache.skywalking.apm.plugin.ehcache.v2.EhcachePrivateConstructorInterceptor";
// get and put value
public static final String PUT_CACHE_ENHANCE_METHOD = "put";
......@@ -69,6 +71,10 @@ public class EhcachePluginInstrumentation extends ClassInstanceMethodsEnhancePlu
public static final String READ_LOCK_RELEASE_ENHANCE_METHOD = "releaseRead" + LOCK_ENHANCE_METHOD_SUFFIX;
public static final String READ_WRITE_LOCK_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.ehcache.v2.EhcacheLockInterceptor";
// cache name
public static final String CACHE_NAME_ENHANCE_METHOD = "setName";
public static final String CACHE_NAME_INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.ehcache.v2.EhcacheCacheNameInterceptor";
@Override
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[] {
......@@ -82,6 +88,17 @@ public class EhcachePluginInstrumentation extends ClassInstanceMethodsEnhancePlu
public String getConstructorInterceptor() {
return CONSTRUCTOR_CLASS_INTERCEPT_CLASS;
}
},
new ConstructorInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getConstructorMatcher() {
return isPrivate().and(takesArgument(0, named("net.sf.ehcache.Cache")));
}
@Override
public String getConstructorInterceptor() {
return PRIVATE_CONSTRUCTOR_CLASS_INTERCEPT_CLASS;
}
}
};
}
......@@ -89,6 +106,23 @@ public class EhcachePluginInstrumentation extends ClassInstanceMethodsEnhancePlu
@Override
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[] {
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return named(CACHE_NAME_ENHANCE_METHOD).and(takesArgument(0, String.class));
}
@Override
public String getMethodsInterceptor() {
return CACHE_NAME_INTERCEPTOR_CLASS;
}
@Override
public boolean isOverrideArgs() {
return false;
}
},
new InstanceMethodsInterceptPoint() {
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
......
......@@ -45,6 +45,8 @@ import static org.apache.skywalking.apm.plugin.ehcache.v2.define.EhcachePluginIn
import static org.apache.skywalking.apm.plugin.ehcache.v2.define.EhcachePluginInstrumentation.READ_LOCK_TRY_ENHANCE_METHOD;
import static org.apache.skywalking.apm.plugin.ehcache.v2.define.EhcachePluginInstrumentation.WRITE_LOCK_RELEASE_ENHANCE_METHOD;
import static org.apache.skywalking.apm.plugin.ehcache.v2.define.EhcachePluginInstrumentation.WRITE_LOCK_TRY_ENHANCE_METHOD;
import static org.apache.skywalking.apm.plugin.ehcache.v2.define.EhcachePluginInstrumentation.CACHE_NAME_ENHANCE_METHOD;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
@RunWith(PowerMockRunner.class)
......@@ -64,10 +66,13 @@ public class EhcacheInterceptorTest {
private EhcacheOperateAllInterceptor operateAllInterceptor;
private EhcacheLockInterceptor lockInterceptor;
private EhcacheConstructorInterceptor constructorInterceptor;
private EhcachePrivateConstructorInterceptor privateConstructorInterceptor;
private EhcacheCacheNameInterceptor cacheNameInterceptor;
private Object[] operateObjectArguments;
private Object[] operateElementArguments;
private Object[] tryLockArguments;
private Object[] releaseLockArguments;
private Object[] cacheNameArguments;
private Exception exception;
......@@ -80,14 +85,19 @@ public class EhcacheInterceptorTest {
private Method releaseReadLockMethod;
private Method releaseWriteLockMethod;
private Method setNameMethod;
private EnhancedInstance enhancedInstance = new EnhancedInstance() {
EhcacheEnhanceInfo ehcacheEnhanceInfo;
@Override
public Object getSkyWalkingDynamicField() {
return new EhcacheEnhanceInfo(CACHE_NAME);
return ehcacheEnhanceInfo;
}
@Override
public void setSkyWalkingDynamicField(Object value) {
ehcacheEnhanceInfo = (EhcacheEnhanceInfo) value;
}
};
......@@ -97,6 +107,8 @@ public class EhcacheInterceptorTest {
operateElementInterceptor = new EhcacheOperateElementInterceptor();
operateAllInterceptor = new EhcacheOperateAllInterceptor();
constructorInterceptor = new EhcacheConstructorInterceptor();
privateConstructorInterceptor = new EhcachePrivateConstructorInterceptor();
cacheNameInterceptor = new EhcacheCacheNameInterceptor();
lockInterceptor = new EhcacheLockInterceptor();
exception = new Exception();
......@@ -108,6 +120,7 @@ public class EhcacheInterceptorTest {
3000
};
releaseLockArguments = new Object[] {"dataKey"};
cacheNameArguments = new Object[] {"cacheName"};
putCacheMethod = Whitebox.getMethods(Cache.class, PUT_CACHE_ENHANCE_METHOD)[0];
getCacheMethod = Whitebox.getMethods(Cache.class, GET_CACHE_ENHANCE_METHOD)[0];
......@@ -117,6 +130,10 @@ public class EhcacheInterceptorTest {
tryWriteLockMethod = Whitebox.getMethods(Cache.class, WRITE_LOCK_TRY_ENHANCE_METHOD)[0];
releaseReadLockMethod = Whitebox.getMethods(Cache.class, READ_LOCK_RELEASE_ENHANCE_METHOD)[0];
releaseWriteLockMethod = Whitebox.getMethods(Cache.class, WRITE_LOCK_RELEASE_ENHANCE_METHOD)[0];
setNameMethod = Whitebox.getMethods(Cache.class, CACHE_NAME_ENHANCE_METHOD)[0];
enhancedInstance.setSkyWalkingDynamicField(new EhcacheEnhanceInfo(CACHE_NAME));
}
@Test
......@@ -124,6 +141,20 @@ public class EhcacheInterceptorTest {
constructorInterceptor.onConstruct(enhancedInstance, new Object[] {new CacheConfiguration(CACHE_NAME, 20)});
}
@Test
public void assertPrivateConstruct() throws Throwable {
privateConstructorInterceptor.onConstruct(enhancedInstance, new Object[] {new Cache(new CacheConfiguration(CACHE_NAME, 20))});
}
@Test
public void assertSetNameSuccess() throws Throwable {
cacheNameInterceptor.beforeMethod(enhancedInstance, setNameMethod, cacheNameArguments, null, null);
cacheNameInterceptor.handleMethodException(enhancedInstance, setNameMethod, null, null, exception);
cacheNameInterceptor.afterMethod(enhancedInstance, setNameMethod, cacheNameArguments, null, null);
Assert.assertThat(((EhcacheEnhanceInfo) enhancedInstance.getSkyWalkingDynamicField()).getCacheName(), equalTo("cacheName"));
}
@Test
public void assertPutSuccess() throws Throwable {
// put arguments
......
......@@ -100,6 +100,21 @@ segmentItems:
peerId: 0
tags:
- {key: db.statement, value: dataKey}
- operationName: Ehcache/put/testCache2
operationId: 0
parentSpanId: 0
spanId: 6
spanLayer: Cache
startTime: nq 0
endTime: nq 0
componentId: 75
componentName: ''
isError: false
spanType: Local
peer: ''
peerId: 0
tags:
- {key: db.statement, value: dataKey}
- operationName: /ehcache-2.x-scenario/case/ehcache
operationId: 0
parentSpanId: -1
......
......@@ -58,6 +58,14 @@ public class CaseServlet extends HttpServlet {
cache.releaseReadLockOnKey(objectKey);
}
// EhcacheCacheNameInterceptor
cacheManager.addCacheIfAbsent("testCache2");
Cache cloneCache = cacheManager.getCache("testCache2");
// EhcacheOperateElementInterceptor
cloneCache.put(el);
PrintWriter printWriter = resp.getWriter();
printWriter.write("success");
printWriter.flush();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册