Carry the triggered rule in subclasses of BlockException (#469)

* Extract getRule in BlockException and refine override methods in subclasses

Signed-off-by: Eric Zhao <sczyh16@gmail.com>
This commit is contained in:
Eric Zhao 2019-01-31 14:24:05 +08:00 committed by GitHub
parent 1368154000
commit 412e1ece47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 121 additions and 19 deletions

View File

@ -15,8 +15,9 @@
*/
package com.alibaba.csp.sentinel.slots.block;
/***
* Abstract exception indicating blocked by Sentinel due to flow control, degraded or system guard.
/**
* Abstract exception indicating blocked by Sentinel due to flow control,
* circuit breaking or system protection triggered.
*
* @author youji.zj
*/
@ -42,6 +43,7 @@ public abstract class BlockException extends Exception {
THROW_OUT_EXCEPTION.setStackTrace(sentinelStackTrace);
}
protected AbstractRule rule;
private String ruleLimitApp;
public BlockException(String ruleLimitApp) {
@ -49,6 +51,12 @@ public abstract class BlockException extends Exception {
this.ruleLimitApp = ruleLimitApp;
}
public BlockException(String ruleLimitApp, AbstractRule rule) {
super();
this.ruleLimitApp = ruleLimitApp;
this.rule = rule;
}
public BlockException(String message, Throwable cause) {
super(message, cause);
}
@ -58,6 +66,12 @@ public abstract class BlockException extends Exception {
this.ruleLimitApp = ruleLimitApp;
}
public BlockException(String ruleLimitApp, String message, AbstractRule rule) {
super(message);
this.ruleLimitApp = ruleLimitApp;
this.rule = rule;
}
@Override
public Throwable fillInStackTrace() {
return this;
@ -98,4 +112,8 @@ public abstract class BlockException extends Exception {
return false;
}
public AbstractRule getRule() {
return rule;
}
}

View File

@ -17,9 +17,11 @@ package com.alibaba.csp.sentinel.slots.block.authority;
import com.alibaba.csp.sentinel.slots.block.BlockException;
/***
/**
* Block exception for request origin access (authority) control.
*
* @author youji.zj
* @author Eric Zhao
*/
public class AuthorityException extends BlockException {
@ -27,6 +29,10 @@ public class AuthorityException extends BlockException {
super(ruleLimitApp);
}
public AuthorityException(String ruleLimitApp, AuthorityRule rule) {
super(ruleLimitApp, rule);
}
public AuthorityException(String message, Throwable cause) {
super(message, cause);
}
@ -40,4 +46,15 @@ public class AuthorityException extends BlockException {
return this;
}
/**
* Get triggered rule.
* Note: the rule result is a reference to rule map and SHOULD NOT be modified.
*
* @return triggered rule
* @since 1.4.2
*/
@Override
public AuthorityRule getRule() {
return rule.as(AuthorityRule.class);
}
}

View File

@ -58,7 +58,7 @@ public class AuthoritySlot extends AbstractLinkedProcessorSlot<DefaultNode> {
for (AuthorityRule rule : rules) {
if (!AuthorityRuleChecker.passCheck(rule, context)) {
throw new AuthorityException(context.getOrigin());
throw new AuthorityException(context.getOrigin(), rule);
}
}
}

View File

@ -26,6 +26,10 @@ public class DegradeException extends BlockException {
super(ruleLimitApp);
}
public DegradeException(String ruleLimitApp, DegradeRule rule) {
super(ruleLimitApp, rule);
}
public DegradeException(String message, Throwable cause) {
super(message, cause);
}
@ -38,4 +42,16 @@ public class DegradeException extends BlockException {
public Throwable fillInStackTrace() {
return this;
}
/**
* Get triggered rule.
* Note: the rule result is a reference to rule map and SHOULD NOT be modified.
*
* @return triggered rule
* @since 1.4.2
*/
@Override
public DegradeRule getRule() {
return rule.as(DegradeRule.class);
}
}

View File

@ -76,7 +76,7 @@ public class DegradeRuleManager {
for (DegradeRule rule : rules) {
if (!rule.passCheck(context, node, count)) {
throw new DegradeException(rule.getLimitApp());
throw new DegradeException(rule.getLimitApp(), rule);
}
}
}

View File

@ -23,10 +23,13 @@ import com.alibaba.csp.sentinel.slots.block.BlockException;
public class FlowException extends BlockException {
public FlowException(String ruleLimitApp) {
super(ruleLimitApp);
}
public FlowException(String ruleLimitApp, FlowRule rule) {
super(ruleLimitApp, rule);
}
public FlowException(String message, Throwable cause) {
super(message, cause);
}
@ -40,4 +43,15 @@ public class FlowException extends BlockException {
return this;
}
/**
* Get triggered rule.
* Note: the rule result is a reference to rule map and SHOULD NOT be modified.
*
* @return triggered rule
* @since 1.4.2
*/
@Override
public FlowRule getRule() {
return rule.as(FlowRule.class);
}
}

View File

@ -151,7 +151,7 @@ public class FlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
if (rules != null) {
for (FlowRule rule : rules) {
if (!canPassCheck(rule, context, node, count, prioritized)) {
throw new FlowException(rule.getLimitApp());
throw new FlowException(rule.getLimitApp(), rule);
}
}
}

View File

@ -22,25 +22,34 @@ import com.alibaba.csp.sentinel.slots.block.BlockException;
*/
public class SystemBlockException extends BlockException {
String resourceName;
public String getResourceName() {
return resourceName;
}
private final String resourceName;
public SystemBlockException(String resourceName, String message, Throwable cause) {
super(message, cause);
this.resourceName = resourceName;
}
public SystemBlockException(String resourceName, String ruleLimitApp) {
super(ruleLimitApp);
public SystemBlockException(String resourceName, String limitType) {
super(limitType);
this.resourceName = resourceName;
}
public String getResourceName() {
return resourceName;
}
@Override
public Throwable fillInStackTrace() {
return this;
}
/**
* Return the limit type of system rule.
*
* @return the limit type
* @since 1.4.2
*/
public String getLimitType() {
return getRuleLimitApp();
}
}

View File

@ -32,11 +32,17 @@ public class ParamFlowException extends BlockException {
this.resourceName = resourceName;
}
public ParamFlowException(String resourceName, String message) {
super(message, message);
public ParamFlowException(String resourceName, String param) {
super(param, param);
this.resourceName = resourceName;
}
public ParamFlowException(String resourceName, String param, ParamFlowRule rule) {
super(param, param);
this.resourceName = resourceName;
this.rule = rule;
}
public String getResourceName() {
return resourceName;
}
@ -45,4 +51,26 @@ public class ParamFlowException extends BlockException {
public Throwable fillInStackTrace() {
return this;
}
/**
* Get the parameter value that triggered the parameter flow control.
*
* @return the parameter value
* @since 1.4.2
*/
public String getLimitParam() {
return getMessage();
}
/**
* Get triggered rule.
* Note: the rule result is a reference to rule map and SHOULD NOT be modified.
*
* @return triggered rule
* @since 1.4.2
*/
@Override
public ParamFlowRule getRule() {
return rule.as(ParamFlowRule.class);
}
}

View File

@ -81,12 +81,12 @@ public class ParamFlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
// Here we add the block count.
addBlockCount(resourceWrapper, count, args);
String message = "";
String triggeredParam = "";
if (args.length > rule.getParamIdx()) {
Object value = args[rule.getParamIdx()];
message = String.valueOf(value);
triggeredParam = String.valueOf(value);
}
throw new ParamFlowException(resourceWrapper.getName(), message);
throw new ParamFlowException(resourceWrapper.getName(), triggeredParam, rule);
}
}
}