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;

/***
* 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;
}
}

+ 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;

/***
/**
* 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);
}
}

+ 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) {
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);
}

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);
}
}

+ 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) {
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 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);
}
}

+ 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) {
for (FlowRule rule : rules) {
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 {

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();
}
}

+ 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;
}

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);
}
}

+ 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.
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…
Cancel
Save