Search in sources :

Example 1 with MatchConfig

use of com.pamirs.pradar.internal.config.MatchConfig in project LinkAgent by shulieTech.

the class ClientCallStartInterceptor method beforeFirst.

@Override
public void beforeFirst(final Advice advice) throws Exception {
    if (!Pradar.isClusterTest()) {
        return;
    }
    /**
     * 白名单校验
     */
    Object[] args = advice.getParameterArray();
    Object target = advice.getTarget();
    if (args == null || args.length != 2) {
        return;
    }
    if (!(args[1] instanceof Metadata)) {
        return;
    }
    /**
     * 将"/"转换为#分割符 方便配置
     */
    String fullName = getMethodName(target);
    String interfaceName = "";
    String methodName = "";
    if (fullName.contains("/")) {
        String[] arr = fullName.split("/");
        interfaceName = arr[0];
        methodName = arr[1];
    }
    MatchConfig matchConfig = ClusterTestUtils.rpcClusterTest(interfaceName, methodName);
    matchConfig.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, true);
    matchConfig.addArgs("class", interfaceName);
    matchConfig.addArgs("method", methodName);
    matchConfig.addArgs("isInterface", Boolean.TRUE);
    matchConfig.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), matchConfig, new ExecutionCall() {

        @Override
        public Object call(Object param) throws ProcessControlException {
            ClientCall.Listener observer = (ClientCall.Listener) advice.getParameterArray()[0];
            observer.onMessage(param);
            return null;
        }
    });
}
Also used : ProcessControlException(com.shulie.instrument.simulator.api.ProcessControlException) ClientCall(io.grpc.ClientCall) MatchConfig(com.pamirs.pradar.internal.config.MatchConfig) Metadata(io.grpc.Metadata) ExecutionCall(com.pamirs.pradar.internal.config.ExecutionCall)

Example 2 with MatchConfig

use of com.pamirs.pradar.internal.config.MatchConfig in project LinkAgent by shulieTech.

the class FeignMockInterceptor method beforeFirst.

@Override
public void beforeFirst(Advice advice) throws ProcessControlException {
    if (Pradar.isClusterTest()) {
        Object[] parameterArray = advice.getParameterArray();
        Method method = (Method) parameterArray[1];
        String className = method.getDeclaringClass().getName();
        final String methodName = method.getName();
        // todo ClusterTestUtils.rpcClusterTest里面已经做了对象copy,这么写是为了能单模块更新,后面要去掉
        MatchConfig config = copyMatchConfig(ClusterTestUtils.rpcClusterTest(className, methodName));
        config.addArgs("args", advice.getParameterArray());
        config.addArgs("mockLogger", mockLogger);
        config.addArgs("url", className.concat("#").concat(methodName));
        config.addArgs("isInterface", Boolean.TRUE);
        config.addArgs("class", className);
        config.addArgs("method", methodName);
        if (config.getStrategy() instanceof JsonMockStrategy) {
            config.addArgs("advice", advice);
            fixJsonStrategy.processBlock(method.getReturnType(), advice.getClassLoader(), config);
        }
        config.getStrategy().processBlock(method.getReturnType(), advice.getClassLoader(), config);
    }
}
Also used : JsonMockStrategy(com.pamirs.pradar.pressurement.mock.JsonMockStrategy) MatchConfig(com.pamirs.pradar.internal.config.MatchConfig) Method(java.lang.reflect.Method)

Example 3 with MatchConfig

use of com.pamirs.pradar.internal.config.MatchConfig in project LinkAgent by shulieTech.

the class FeignMockInterceptor method copyMatchConfig.

private static MatchConfig copyMatchConfig(MatchConfig matchConfig) {
    MatchConfig copied = new MatchConfig();
    copied.setUrl(matchConfig.getUrl());
    copied.setStrategy(matchConfig.getStrategy());
    copied.setScriptContent(matchConfig.getScriptContent());
    copied.setArgs(new HashMap<String, Object>(matchConfig.getArgs()));
    copied.setForwarding(matchConfig.getForwarding());
    copied.setSuccess(matchConfig.isSuccess());
    return copied;
}
Also used : MatchConfig(com.pamirs.pradar.internal.config.MatchConfig)

Example 4 with MatchConfig

use of com.pamirs.pradar.internal.config.MatchConfig in project LinkAgent by shulieTech.

the class RealCallEnqueueV2Interceptor method beforeFirst.

@Override
public void beforeFirst(Advice advice) throws ProcessControlException {
    Object target = advice.getTarget();
    Request request = null;
    try {
        request = Reflect.on(target).get(OKHttpConstants.DYNAMIC_FIELD_REQUEST);
    } catch (ReflectException e) {
        request = Reflect.on(target).get(OKHttpConstants.DYNAMIC_FIELD_ORIGINAL_REQUEST);
    }
    final String url = request.urlString();
    final MatchConfig config = ClusterTestUtils.httpClusterTest(url);
    String check = request.header(OKHttpConstants.DYNAMIC_FIELD_HEADER);
    config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, check);
    config.addArgs("url", url);
    config.addArgs("isInterface", Boolean.FALSE);
    final Request finalRequest = request;
    config.getStrategy().processBlock(advice.getBehavior().getReturnType(), advice.getClassLoader(), config, new ExecutionForwardCall() {

        @Override
        public Object forward(Object param) throws ProcessControlException {
            HttpUrl httpUrl = HttpUrl.parse(config.getForwarding());
            Reflect.on(finalRequest).set("url", httpUrl);
            return null;
        }

        @Override
        public Object call(Object param) {
            Headers header = Headers.of(new String[0]);
            Buffer buffer = new Buffer();
            try {
                if (param instanceof String) {
                    buffer.write(String.valueOf(param).getBytes("UTF-8"));
                } else {
                    buffer.write(JSONObject.toJSONBytes(param));
                }
            } catch (IOException e) {
            }
            return new Response.Builder().code(200).body(new RealResponseBody(header, buffer)).request(finalRequest).protocol(Protocol.HTTP_1_0).message("OK").build();
        }
    });
}
Also used : Buffer(okio.Buffer) ProcessControlException(com.shulie.instrument.simulator.api.ProcessControlException) Headers(com.squareup.okhttp.Headers) MatchConfig(com.pamirs.pradar.internal.config.MatchConfig) RealResponseBody(com.squareup.okhttp.internal.http.RealResponseBody) Request(com.squareup.okhttp.Request) IOException(java.io.IOException) ReflectException(com.shulie.instrument.simulator.api.reflect.ReflectException) HttpUrl(okhttp3.HttpUrl) ExecutionForwardCall(com.pamirs.pradar.internal.adapter.ExecutionForwardCall) Response(com.squareup.okhttp.Response) JSONObject(com.alibaba.fastjson.JSONObject)

Example 5 with MatchConfig

use of com.pamirs.pradar.internal.config.MatchConfig in project LinkAgent by shulieTech.

the class AsyncHttpClientv4MethodInterceptor1 method doBefore.

@Override
public void doBefore(final Advice advice) throws ProcessControlException {
    Object[] args = advice.getParameterArray();
    final HttpUriRequest request = (HttpUriRequest) args[0];
    if (request == null) {
        return;
    }
    InnerWhiteListCheckUtil.check();
    String host = request.getURI().getHost();
    int port = request.getURI().getPort();
    String path = request.getURI().getPath();
    // 判断是否在白名单中
    String url = getService(request.getURI().getScheme(), host, port, path);
    final MatchConfig config = ClusterTestUtils.httpClusterTest(url);
    Header[] wHeaders = request.getHeaders(PradarService.PRADAR_WHITE_LIST_CHECK);
    if (wHeaders != null && wHeaders.length > 0) {
        config.addArgs(PradarService.PRADAR_WHITE_LIST_CHECK, wHeaders[0].getValue());
    }
    config.addArgs("url", url);
    config.addArgs("request", request);
    config.addArgs("method", "uri");
    config.addArgs("isInterface", Boolean.FALSE);
    if (args.length == 2) {
        config.addArgs("futureCallback", args[1]);
    } else if (args.length == 3) {
        config.addArgs("futureCallback", args[2]);
    }
    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) {
            if (null == config.getArgs().get("futureCallback")) {
                return null;
            }
            // 现在先暂时注释掉因为只有jdk8以上才能用
            FutureCallback<HttpResponse> futureCallback = (FutureCallback<HttpResponse>) config.getArgs().get("futureCallback");
            StatusLine statusline = new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "");
            try {
                HttpEntity entity = null;
                if (param instanceof String) {
                    entity = new StringEntity(String.valueOf(param));
                } else {
                    entity = new ByteArrayEntity(JSONObject.toJSONBytes(param));
                }
                BasicHttpResponse response = new BasicHttpResponse(statusline);
                response.setEntity(entity);
                futureCallback.completed(response);
                java.util.concurrent.CompletableFuture future = new java.util.concurrent.CompletableFuture();
                future.complete(response);
                return future;
            } catch (Exception e) {
            }
            return null;
        }
    });
    String method = request.getMethod();
    Pradar.startClientInvoke(path, method);
    Pradar.remoteIp(host);
    Pradar.remotePort(port);
    Pradar.middlewareName(HttpClientConstants.HTTP_CLIENT_NAME_4X);
    Header[] headers = request.getHeaders("content-length");
    if (headers != null && headers.length != 0) {
        try {
            Header header = headers[0];
            Pradar.requestSize(Integer.valueOf(header.getValue()));
        } catch (NumberFormatException e) {
        }
    }
    final Map<String, String> context = Pradar.getInvokeContextMap();
    for (Map.Entry<String, String> entry : context.entrySet()) {
        String key = entry.getKey();
        String value = entry.getValue();
        if (request.getHeaders(HeaderMark.DONT_MODIFY_HEADER) == null || request.getHeaders(HeaderMark.DONT_MODIFY_HEADER).length == 0) {
            request.setHeader(key, value);
        }
    }
    Pradar.popInvokeContext();
    final Object future = args[args.length - 1];
    if (!(future instanceof FutureCallback)) {
        return;
    }
    advice.changeParameter(args.length - 1, new FutureCallback() {

        @Override
        public void completed(Object result) {
            Pradar.setInvokeContext(context);
            ((FutureCallback) future).completed(result);
            try {
                if (result instanceof HttpResponse) {
                    afterTrace(request, (HttpResponse) result);
                } else {
                    afterTrace(request, null);
                }
            } catch (Throwable e) {
                LOGGER.error("AsyncHttpClient execute future endTrace error.", e);
                Pradar.endClientInvoke("200", HttpClientConstants.PLUGIN_TYPE);
            }
        }

        @Override
        public void failed(Exception ex) {
            Pradar.setInvokeContext(context);
            ((FutureCallback) future).failed(ex);
            try {
                exceptionTrace(request, ex);
            } catch (Throwable e) {
                LOGGER.error("AsyncHttpClient execute future endTrace error.", e);
                Pradar.endClientInvoke("200", HttpClientConstants.PLUGIN_TYPE);
            }
        }

        @Override
        public void cancelled() {
            Pradar.setInvokeContext(context);
            ((FutureCallback) future).cancelled();
            try {
                exceptionTrace(request, null);
            } catch (Throwable e) {
                LOGGER.error("AsyncHttpClient execute future endTrace error.", e);
                Pradar.endClientInvoke("200", HttpClientConstants.PLUGIN_TYPE);
            }
        }
    });
}
Also used : HttpUriRequest(org.apache.http.client.methods.HttpUriRequest) StringEntity(org.apache.http.entity.StringEntity) ByteArrayEntity(org.apache.http.entity.ByteArrayEntity) FutureCallback(org.apache.http.concurrent.FutureCallback) MatchConfig(com.pamirs.pradar.internal.config.MatchConfig) BasicHttpResponse(org.apache.http.message.BasicHttpResponse) SocketTimeoutException(java.net.SocketTimeoutException) ProcessControlException(com.shulie.instrument.simulator.api.ProcessControlException) BasicStatusLine(org.apache.http.message.BasicStatusLine) JsonMockStrategy(com.pamirs.pradar.pressurement.mock.JsonMockStrategy) BasicStatusLine(org.apache.http.message.BasicStatusLine) BasicHttpResponse(org.apache.http.message.BasicHttpResponse) JSONObject(com.alibaba.fastjson.JSONObject) ExecutionCall(com.pamirs.pradar.internal.config.ExecutionCall) Map(java.util.Map)

Aggregations

MatchConfig (com.pamirs.pradar.internal.config.MatchConfig)33 ProcessControlException (com.shulie.instrument.simulator.api.ProcessControlException)22 JSONObject (com.alibaba.fastjson.JSONObject)15 ExecutionCall (com.pamirs.pradar.internal.config.ExecutionCall)12 JsonMockStrategy (com.pamirs.pradar.pressurement.mock.JsonMockStrategy)12 SocketTimeoutException (java.net.SocketTimeoutException)10 PressureMeasureError (com.pamirs.pradar.exception.PressureMeasureError)8 IOException (java.io.IOException)8 ExecutionForwardCall (com.pamirs.pradar.internal.adapter.ExecutionForwardCall)7 URISyntaxException (java.net.URISyntaxException)6 Map (java.util.Map)6 URI (java.net.URI)5 ByteArrayEntity (org.apache.http.entity.ByteArrayEntity)5 StringEntity (org.apache.http.entity.StringEntity)5 BasicHttpResponse (org.apache.http.message.BasicHttpResponse)5 BasicStatusLine (org.apache.http.message.BasicStatusLine)5 URL (java.net.URL)4 Buffer (okio.Buffer)4 ScriptEvaluator (com.pamirs.pradar.script.ScriptEvaluator)3 ReflectException (com.shulie.instrument.simulator.api.reflect.ReflectException)3