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:
parent
1368154000
commit
412e1ece47
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue