use of com.shulie.instrument.simulator.api.ProcessControlException in project LinkAgent by shulieTech.
the class HttpClientv3MethodInterceptor method beforeLast.
@Override
public void beforeLast(Advice advice) throws ProcessControlException {
Object[] args = advice.getParameterArray();
try {
final HttpMethod method = (HttpMethod) args[1];
if (method == null) {
return;
}
int port = method.getURI().getPort();
String path = method.getURI().getPath();
String url = getService(method.getURI().getScheme(), method.getURI().getHost(), port, path);
final MatchConfig config = ClusterTestUtils.httpClusterTest(url);
Header header = method.getRequestHeader(PradarService.PRADAR_WHITE_LIST_CHECK);
if (header == null) {
config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, true);
} else {
config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, header.getValue());
}
config.addArgs("url", url);
config.addArgs("isInterface", Boolean.FALSE);
if (config.getStrategy() instanceof JsonMockStrategy) {
config.addArgs("extraMethod", method);
fixJsonStrategy.processBlock(java.lang.String.class, advice.getClassLoader(), config);
}
config.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config, new ExecutionForwardCall() {
@Override
public Object call(Object param) throws ProcessControlException {
byte[] bytes = JSONObject.toJSONBytes(param);
Reflect.on(method).set("responseBody", bytes);
ProcessController.returnImmediately(int.class, 200);
return true;
}
@Override
public Object forward(Object param) throws ProcessControlException {
String forwarding = config.getForwarding();
try {
method.setURI(new URI(forwarding));
} catch (URIException e) {
}
return null;
}
});
} catch (URIException e) {
LOGGER.error("", e);
if (Pradar.isClusterTest()) {
throw new PressureMeasureError(e);
}
} catch (ProcessControlException pce) {
throw pce;
} catch (Throwable t) {
LOGGER.error("", t);
if (Pradar.isClusterTest()) {
throw new PressureMeasureError(t);
}
}
}
use of com.shulie.instrument.simulator.api.ProcessControlException in project LinkAgent by shulieTech.
the class HttpClientv4MethodInterceptor1 method beforeLast.
@Override
public void beforeLast(Advice advice) throws ProcessControlException {
if (!Pradar.isClusterTest()) {
return;
}
Object[] args = advice.getParameterArray();
final HttpUriRequest request = (HttpUriRequest) args[0];
if (request == null) {
return;
}
String host = request.getURI().getHost();
int port = request.getURI().getPort();
String path = request.getURI().getPath();
// 判断是否在白名单中
String url = getService(request.getURI().getScheme(), host, port, path);
MatchConfig config = ClusterTestUtils.httpClusterTest(url);
Header[] headers = request.getHeaders(PradarService.PRADAR_WHITE_LIST_CHECK);
if (headers.length > 0) {
config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, headers[0].getValue());
}
config.addArgs("url", url);
config.addArgs("request", request);
config.addArgs("method", "uri");
config.addArgs("isInterface", Boolean.FALSE);
if (config.getStrategy() instanceof JsonMockStrategy) {
fixJsonStrategy.processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config);
}
config.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config, new ExecutionCall() {
@Override
public Object call(Object param) {
StatusLine statusline = new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "");
try {
HttpEntity entity = null;
if (param instanceof String) {
entity = new StringEntity(String.valueOf(param), "UTF-8");
} else {
entity = new ByteArrayEntity(JSONObject.toJSONBytes(param));
}
BasicHttpResponse response = new BasicHttpResponse(statusline);
response.setEntity(entity);
if (HttpClientConstants.clazz == null) {
HttpClientConstants.clazz = Class.forName("org.apache.http.impl.execchain.HttpResponseProxy");
}
return Reflect.on(HttpClientConstants.clazz).create(response, null).get();
} catch (Exception e) {
}
return null;
}
});
}
use of com.shulie.instrument.simulator.api.ProcessControlException in project LinkAgent by shulieTech.
the class HttpClientv5MethodInterceptor1 method beforeLast.
@Override
public void beforeLast(Advice advice) throws ProcessControlException {
Object[] args = advice.getParameterArray();
// ClassicHttpRequest
final ClassicHttpRequest request = (ClassicHttpRequest) args[0];
if (request == null) {
return;
}
URI uri = null;
try {
uri = request.getUri();
} catch (URISyntaxException e) {
logger.error("获取不到url", e);
}
String host = uri.getHost();
int port = uri.getPort();
String path = uri.getPath();
// 判断是否在白名单中
String url = getService(uri.getScheme(), host, port, path);
MatchConfig config = ClusterTestUtils.httpClusterTest(url);
Header[] headers = request.getHeaders(PradarService.PRADAR_WHITE_LIST_CHECK);
config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, headers[0].getValue());
config.addArgs("url", url);
config.addArgs("request", request);
config.addArgs("method", "uri");
config.addArgs("isInterface", Boolean.FALSE);
config.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config, new ExecutionCall() {
@Override
public Object call(Object param) {
try {
HttpEntity entity = null;
if (param instanceof String) {
entity = new StringEntity(String.valueOf(param));
} else {
entity = new ByteArrayEntity(JSONObject.toJSONBytes(param), ContentType.create(request.getEntity().getContentType()));
}
BasicClassicHttpResponse response = new BasicClassicHttpResponse(200);
response.setEntity(entity);
if (HttpClientConstants.clazz == null) {
HttpClientConstants.clazz = Class.forName("org.apache.hc.client5.http.impl.classic.CloseableHttpResponse");
}
return Reflect.on(HttpClientConstants.clazz).create(response, null).get();
} catch (Exception e) {
}
return null;
}
});
}
use of com.shulie.instrument.simulator.api.ProcessControlException in project LinkAgent by shulieTech.
the class DubboConsumerInterceptor method beforeLast.
@Override
public void beforeLast(Advice advice) throws ProcessControlException {
final RpcInvocation invocation = (RpcInvocation) advice.getParameterArray()[0];
String interfaceName = getInterfaceName(invocation);
String methodName = invocation.getMethodName();
MatchConfig config = ClusterTestUtils.rpcClusterTest(interfaceName, methodName);
invocation.setAttachment(PradarService.PRADAR_WHITE_LIST_CHECK, String.valueOf(config.isSuccess()));
config.addArgs("args", advice.getParameterArray());
config.addArgs("url", interfaceName.concat("#").concat(methodName));
config.addArgs("isInterface", Boolean.TRUE);
config.addArgs("class", interfaceName);
config.addArgs("method", methodName);
config.addArgs("invocation", invocation);
if (isShentongEvent(interfaceName)) {
config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, "true");
}
if (config.getStrategy() instanceof JsonMockStrategy) {
fixJsonStrategy.processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config);
}
config.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config, new ExecutionCall() {
@Override
public Object call(Object param) {
try {
// for 2.8.4
return Reflect.on("org.apache.dubbo.rpc.RpcResult").create(param).get();
} catch (Exception e) {
if (logger.isInfoEnabled()) {
logger.info("find dubbo 2.8.4 class org.apache.dubbo.rpc.RpcResult fail, find others!", e);
}
//
}
try {
Reflect reflect = Reflect.on("org.apache.dubbo.rpc.AsyncRpcResult");
try {
// for 2.7.5
java.util.concurrent.CompletableFuture<AppResponse> future = new java.util.concurrent.CompletableFuture<AppResponse>();
future.complete(new AppResponse(param));
Reflect result = reflect.create(future, invocation);
return result.get();
} catch (ReflectException e) {
// for 2.7.3
Reflect result = reflect.create(invocation);
return result.get();
}
} catch (Exception e) {
logger.error("fail to load dubbo 2.7.x class org.apache.dubbo.rpc.AsyncRpcResult", e);
throw new ReflectException("fail to load dubbo 2.7.x class org.apache.dubbo.rpc.AsyncRpcResult", e);
}
}
});
}
use of com.shulie.instrument.simulator.api.ProcessControlException in project LinkAgent by shulieTech.
the class MockStrategy method processNonBlock.
@Override
public Object processNonBlock(Class returnType, ClassLoader classLoader, Object params, ExecutionCall call) throws ProcessControlException {
if (Pradar.isClusterTest()) {
if (params instanceof MatchConfig) {
try {
MatchConfig config = (MatchConfig) params;
String scriptContent = config.getScriptContent();
ScriptEvaluator evaluator = ScriptManager.getInstance().getScriptEvaluator("bsh");
Object result = evaluator.evaluate(scriptContent, config.getArgs());
return call.call(result);
} catch (ProcessControlException e) {
throw e;
} catch (Throwable e) {
LOGGER.error("mock处理异常 {}", e);
ErrorReporter.buildError().setErrorType(ErrorTypeEnum.mock).setErrorCode("mock-0001").setMessage("mock处理异常!" + e.getMessage()).setDetail("脚本内容" + ((MatchConfig) params).getScriptContent()).report();
throw new PressureMeasureError(e);
}
}
}
return true;
}
Aggregations