sentinel1.8.6
一直以为自己配置问题, 最后debug发现com.alibaba.csp.sentinel.slots.logger.LogSlot
这里记录日志时NPE了
原来的代码:
@Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode obj, int count, boolean prioritized, Object... args)
throws Throwable {
try {
fireEntry(context, resourceWrapper, obj, count, prioritized, args);
} catch (BlockException e) {
EagleEyeLogUtil.log(resourceWrapper.getName(), e.getClass().getSimpleName(), e.getRuleLimitApp(),
context.getOrigin(), e.getRule().getId(), count);
throw e;
} catch (Throwable e) {
RecordLog.warn("Unexpected entry exception", e);
}
}
e.getRule().getId(), 此处SystemBlockException没有提供rule
修改后的代码:
@Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode obj, int count, boolean prioritized, Object... args)
throws Throwable {
try {
fireEntry(context, resourceWrapper, obj, count, prioritized, args);
} catch (BlockException e) {
EagleEyeLogUtil.log(resourceWrapper.getName(), e.getClass().getSimpleName(), e.getRuleLimitApp(),
context.getOrigin(), Optional.ofNullable(e.getRule()).map(AbstractRule::getId).orElse(null), count);
throw e;
} catch (Throwable e) {
RecordLog.warn("Unexpected entry exception", e);
}
}
修改源码肯定是不合适的, 具体做法如下:
- 在自己的项目下新建同名包同名类
- 将源码中的代码copy并修改上述代码, 以达到覆盖的目的(知识点涉及java类加载机制)
总结:
-
上述方案是因为我们没有采集规则的需求, 如果有, 可以修改覆盖此两处处代码
com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem
+com.alibaba.csp.sentinel.slots.system.SystemBlockException
-
sentinel master分支已修改, 但是未发版, 见PR 2908