Add exceptionPredicate in Tracer for customized exception filtering logic (#1496)

This commit is contained in:
pleasecheckhere2016 2020-05-21 15:17:19 +08:00 committed by GitHub
parent 46076b34aa
commit 5523fd0d42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 0 deletions

View File

@ -20,6 +20,7 @@ import com.alibaba.csp.sentinel.context.ContextUtil;
import com.alibaba.csp.sentinel.context.NullContext;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.util.AssertUtil;
import com.alibaba.csp.sentinel.util.function.Predicate;
/**
* This class is used to record other exceptions except block exception.
@ -32,6 +33,8 @@ public class Tracer {
protected static Class<? extends Throwable>[] traceClasses;
protected static Class<? extends Throwable>[] ignoreClasses;
protected static Predicate<Throwable> exceptionPredicate;
protected Tracer() {}
/**
@ -164,6 +167,24 @@ public class Tracer {
return ignoreClasses;
}
/**
* Get exception predicate
* @return the exception predicate.
*/
public static Predicate<? extends Throwable> getExceptionPredicate() {
return exceptionPredicate;
}
/**
* set an exception predicate which indicates the exception should be traced(return true) or ignored(return false)
* except for {@link BlockException}
* @param exceptionPredicate the exception predicate
*/
public static void setExceptionPredicate(Predicate<Throwable> exceptionPredicate) {
AssertUtil.notNull(exceptionPredicate, "exception predicate must not be null");
Tracer.exceptionPredicate = exceptionPredicate;
}
private static void checkNotNull(Class<? extends Throwable>[] classes) {
AssertUtil.notNull(classes, "trace or ignore classes must not be null");
for (Class<? extends Throwable> clazz : classes) {
@ -181,6 +202,10 @@ public class Tracer {
if (t == null || t instanceof BlockException) {
return false;
}
if (exceptionPredicate != null) {
return exceptionPredicate.test(t);
}
if (ignoreClasses != null) {
for (Class<? extends Throwable> clazz : ignoreClasses) {
if (clazz != null && clazz.isAssignableFrom(t.getClass())) {

View File

@ -2,6 +2,7 @@ package com.alibaba.csp.sentinel;
import com.alibaba.csp.sentinel.context.ContextTestUtil;
import com.alibaba.csp.sentinel.context.ContextUtil;
import com.alibaba.csp.sentinel.util.function.Predicate;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
@ -52,6 +53,25 @@ public class TracerTest extends Tracer {
Assert.assertFalse(Tracer.shouldTrace(new Exception()));
}
@Test
public void setExceptionPredicate() {
Predicate<Throwable> throwablePredicate = new Predicate<Throwable>() {
@Override
public boolean test(Throwable throwable) {
if (throwable instanceof TraceException) {
return true;
} else if (throwable instanceof IgnoreException) {
return false;
}
return false;
}
};
Tracer.setExceptionPredicate(throwablePredicate);
Assert.assertTrue(Tracer.shouldTrace(new TraceException()));
Assert.assertFalse(Tracer.shouldTrace(new IgnoreException()));
}
@Test
public void setExceptionsToIgnore() {
Tracer.ignoreClasses = null;
@ -88,6 +108,11 @@ public class TracerTest extends Tracer {
Tracer.setExceptionsToIgnore(IgnoreException.class, null);
}
@Test(expected = IllegalArgumentException.class)
public void testNull3() {
Tracer.setExceptionPredicate(null);
}
private class TraceException extends Exception {}
private class TraceException2 extends Exception {}