Browse Source

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>
master
Eric Zhao GitHub 6 years ago
parent
commit
412e1ece47
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 121 additions and 19 deletions
  1. +20
    -2
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/BlockException.java
  2. +18
    -1
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthorityException.java
  3. +1
    -1
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java
  4. +16
    -0
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeException.java
  5. +1
    -1
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRuleManager.java
  6. +15
    -1
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowException.java
  7. +1
    -1
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java
  8. +16
    -7
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemBlockException.java
  9. +30
    -2
      sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowException.java
  10. +3
    -3
      sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java

+ 20
- 2
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/BlockException.java View File

@@ -15,8 +15,9 @@
*/ */
package com.alibaba.csp.sentinel.slots.block; 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 * @author youji.zj
*/ */
@@ -42,6 +43,7 @@ public abstract class BlockException extends Exception {
THROW_OUT_EXCEPTION.setStackTrace(sentinelStackTrace); THROW_OUT_EXCEPTION.setStackTrace(sentinelStackTrace);
} }


protected AbstractRule rule;
private String ruleLimitApp; private String ruleLimitApp;


public BlockException(String ruleLimitApp) { public BlockException(String ruleLimitApp) {
@@ -49,6 +51,12 @@ public abstract class BlockException extends Exception {
this.ruleLimitApp = ruleLimitApp; this.ruleLimitApp = ruleLimitApp;
} }


public BlockException(String ruleLimitApp, AbstractRule rule) {
super();
this.ruleLimitApp = ruleLimitApp;
this.rule = rule;
}

public BlockException(String message, Throwable cause) { public BlockException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
@@ -58,6 +66,12 @@ public abstract class BlockException extends Exception {
this.ruleLimitApp = ruleLimitApp; this.ruleLimitApp = ruleLimitApp;
} }


public BlockException(String ruleLimitApp, String message, AbstractRule rule) {
super(message);
this.ruleLimitApp = ruleLimitApp;
this.rule = rule;
}

@Override @Override
public Throwable fillInStackTrace() { public Throwable fillInStackTrace() {
return this; return this;
@@ -98,4 +112,8 @@ public abstract class BlockException extends Exception {


return false; return false;
} }

public AbstractRule getRule() {
return rule;
}
} }

+ 18
- 1
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthorityException.java View File

@@ -17,9 +17,11 @@ package com.alibaba.csp.sentinel.slots.block.authority;


import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.BlockException;


/***
/**
* Block exception for request origin access (authority) control.
* *
* @author youji.zj * @author youji.zj
* @author Eric Zhao
*/ */
public class AuthorityException extends BlockException { public class AuthorityException extends BlockException {


@@ -27,6 +29,10 @@ public class AuthorityException extends BlockException {
super(ruleLimitApp); super(ruleLimitApp);
} }


public AuthorityException(String ruleLimitApp, AuthorityRule rule) {
super(ruleLimitApp, rule);
}

public AuthorityException(String message, Throwable cause) { public AuthorityException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
@@ -40,4 +46,15 @@ public class AuthorityException extends BlockException {
return this; 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);
}
} }

+ 1
- 1
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/authority/AuthoritySlot.java View File

@@ -58,7 +58,7 @@ public class AuthoritySlot extends AbstractLinkedProcessorSlot<DefaultNode> {


for (AuthorityRule rule : rules) { for (AuthorityRule rule : rules) {
if (!AuthorityRuleChecker.passCheck(rule, context)) { if (!AuthorityRuleChecker.passCheck(rule, context)) {
throw new AuthorityException(context.getOrigin());
throw new AuthorityException(context.getOrigin(), rule);
} }
} }
} }


+ 16
- 0
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeException.java View File

@@ -26,6 +26,10 @@ public class DegradeException extends BlockException {
super(ruleLimitApp); super(ruleLimitApp);
} }


public DegradeException(String ruleLimitApp, DegradeRule rule) {
super(ruleLimitApp, rule);
}

public DegradeException(String message, Throwable cause) { public DegradeException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
@@ -38,4 +42,16 @@ public class DegradeException extends BlockException {
public Throwable fillInStackTrace() { public Throwable fillInStackTrace() {
return this; 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);
}
} }

+ 1
- 1
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRuleManager.java View File

@@ -76,7 +76,7 @@ public class DegradeRuleManager {


for (DegradeRule rule : rules) { for (DegradeRule rule : rules) {
if (!rule.passCheck(context, node, count)) { if (!rule.passCheck(context, node, count)) {
throw new DegradeException(rule.getLimitApp());
throw new DegradeException(rule.getLimitApp(), rule);
} }
} }
} }


+ 15
- 1
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowException.java View File

@@ -23,10 +23,13 @@ import com.alibaba.csp.sentinel.slots.block.BlockException;
public class FlowException extends BlockException { public class FlowException extends BlockException {


public FlowException(String ruleLimitApp) { public FlowException(String ruleLimitApp) {

super(ruleLimitApp); super(ruleLimitApp);
} }


public FlowException(String ruleLimitApp, FlowRule rule) {
super(ruleLimitApp, rule);
}

public FlowException(String message, Throwable cause) { public FlowException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
@@ -40,4 +43,15 @@ public class FlowException extends BlockException {
return this; 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);
}
} }

+ 1
- 1
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java View File

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


+ 16
- 7
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/system/SystemBlockException.java View File

@@ -22,25 +22,34 @@ import com.alibaba.csp.sentinel.slots.block.BlockException;
*/ */
public class SystemBlockException extends 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) { public SystemBlockException(String resourceName, String message, Throwable cause) {
super(message, cause); super(message, cause);
this.resourceName = resourceName; this.resourceName = resourceName;
} }


public SystemBlockException(String resourceName, String ruleLimitApp) {
super(ruleLimitApp);
public SystemBlockException(String resourceName, String limitType) {
super(limitType);
this.resourceName = resourceName; this.resourceName = resourceName;
} }


public String getResourceName() {
return resourceName;
}

@Override @Override
public Throwable fillInStackTrace() { public Throwable fillInStackTrace() {
return this; return this;
} }


/**
* Return the limit type of system rule.
*
* @return the limit type
* @since 1.4.2
*/
public String getLimitType() {
return getRuleLimitApp();
}
} }

+ 30
- 2
sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowException.java View File

@@ -32,11 +32,17 @@ public class ParamFlowException extends BlockException {
this.resourceName = resourceName; this.resourceName = resourceName;
} }


public ParamFlowException(String resourceName, String message) {
super(message, message);
public ParamFlowException(String resourceName, String param) {
super(param, param);
this.resourceName = resourceName; this.resourceName = resourceName;
} }


public ParamFlowException(String resourceName, String param, ParamFlowRule rule) {
super(param, param);
this.resourceName = resourceName;
this.rule = rule;
}

public String getResourceName() { public String getResourceName() {
return resourceName; return resourceName;
} }
@@ -45,4 +51,26 @@ public class ParamFlowException extends BlockException {
public Throwable fillInStackTrace() { public Throwable fillInStackTrace() {
return this; 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);
}
} }

+ 3
- 3
sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowSlot.java View File

@@ -81,12 +81,12 @@ public class ParamFlowSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
// Here we add the block count. // Here we add the block count.
addBlockCount(resourceWrapper, count, args); addBlockCount(resourceWrapper, count, args);


String message = "";
String triggeredParam = "";
if (args.length > rule.getParamIdx()) { if (args.length > rule.getParamIdx()) {
Object value = args[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…
Cancel
Save