Search in sources :

Example 51 with RestOperationMeta

use of org.apache.servicecomb.common.rest.definition.RestOperationMeta in project incubator-servicecomb-java-chassis by apache.

the class TestMicroservicePaths method staticGroup.

@Test
public void staticGroup() {
    RestOperationMeta meta = paths.getStaticPathOperationMap().get("/static/").findValue("POST");
    Assert.assertSame("postStatic", meta.getOperationMeta().getOperationId());
    meta = paths.getStaticPathOperationMap().get("/static/").findValue("GET");
    Assert.assertSame("getStatic", meta.getOperationMeta().getOperationId());
}
Also used : RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) Test(org.junit.Test)

Example 52 with RestOperationMeta

use of org.apache.servicecomb.common.rest.definition.RestOperationMeta in project incubator-servicecomb-java-chassis by apache.

the class SlowInvocationLogger method logSlowProducer.

private void logSlowProducer(Invocation invocation, Response response, OperationConfig operationConfig) {
    RestOperationMeta restOperationMeta = invocation.getOperationMeta().getExtData(RestConst.SWAGGER_REST_OPERATION);
    InvocationStageTrace stageTrace = invocation.getInvocationStageTrace();
    invocation.getTraceIdLogger().warn(LOGGER, "" + "slow({} ms) invocation, {}:\n" + "  http method: {}\n" + "  url        : {}\n" + "  client     : {}\n" + "  status code: {}\n" + "  total      : {} ms\n" + "    prepare                : {} ms\n" + "    threadPoolQueue        : {} ms\n" + "    server filters request : {} ms\n" + "    handlers request       : {} ms\n" + "    business execute       : {} ms\n" + "    handlers response      : {} ms\n" + "    server filters response: {} ms\n" + "    send response          : {} ms", operationConfig.getMsSlowInvocation(), invocation.getInvocationQualifiedName(), restOperationMeta.getHttpMethod(), restOperationMeta.getAbsolutePath(), collectClientAddress(invocation), response.getStatusCode(), formatTime(stageTrace.calcTotalTime()), formatTime(stageTrace.calcInvocationPrepareTime()), formatTime(stageTrace.calcThreadPoolQueueTime()), formatTime(stageTrace.calcServerFiltersRequestTime()), formatTime(stageTrace.calcHandlersRequestTime()), formatTime(stageTrace.calcBusinessTime()), formatTime(stageTrace.calcHandlersResponseTime()), formatTime(stageTrace.calcServerFiltersResponseTime()), formatTime(stageTrace.calcSendResponseTime()));
}
Also used : RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) InvocationStageTrace(org.apache.servicecomb.core.invocation.InvocationStageTrace)

Example 53 with RestOperationMeta

use of org.apache.servicecomb.common.rest.definition.RestOperationMeta in project incubator-servicecomb-java-chassis by apache.

the class TestRequestMeta method testGetSwaggerRestOperation.

@Test
public void testGetSwaggerRestOperation() {
    RestOperationMeta value = requestmeta.getSwaggerRestOperation();
    Assert.assertNotNull(value);
}
Also used : RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) Test(org.junit.Test)

Example 54 with RestOperationMeta

use of org.apache.servicecomb.common.rest.definition.RestOperationMeta in project incubator-servicecomb-java-chassis by apache.

the class RestClientInvocation method invoke.

public void invoke(Invocation invocation, AsyncResponse asyncResp) throws Exception {
    this.invocation = invocation;
    this.asyncResp = asyncResp;
    OperationMeta operationMeta = invocation.getOperationMeta();
    restOperationMeta = operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
    String path = this.createRequestPath(restOperationMeta);
    IpPort ipPort = (IpPort) invocation.getEndpoint().getAddress();
    Future<HttpClientRequest> requestFuture = createRequest(ipPort, path);
    invocation.getInvocationStageTrace().startGetConnection();
    requestFuture.compose(clientRequest -> {
        invocation.getInvocationStageTrace().finishGetConnection();
        this.clientRequest = clientRequest;
        clientRequest.putHeader(org.apache.servicecomb.core.Const.TARGET_MICROSERVICE, invocation.getMicroserviceName());
        RestClientRequestImpl restClientRequest = new RestClientRequestImpl(clientRequest, httpClientWithContext.context(), asyncResp, throwableHandler);
        invocation.getHandlerContext().put(RestConst.INVOCATION_HANDLER_REQUESTCLIENT, restClientRequest);
        Buffer requestBodyBuffer;
        try {
            requestBodyBuffer = restClientRequest.getBodyBuffer();
        } catch (Exception e) {
            return Future.failedFuture(e);
        }
        HttpServletRequestEx requestEx = new VertxClientRequestToHttpServletRequest(clientRequest, requestBodyBuffer);
        invocation.getInvocationStageTrace().startClientFiltersRequest();
        for (HttpClientFilter filter : httpClientFilters) {
            if (filter.enabled()) {
                filter.beforeSendRequest(invocation, requestEx);
            }
        }
        // 从业务线程转移到网络线程中去发送
        invocation.onStartSendRequest();
        httpClientWithContext.runOnContext(httpClient -> {
            clientRequest.setTimeout(operationMeta.getConfig().getMsRequestTimeout());
            clientRequest.response().onComplete(asyncResult -> {
                if (asyncResult.failed()) {
                    fail(asyncResult.cause());
                    return;
                }
                handleResponse(asyncResult.result());
            });
            processServiceCombHeaders(invocation, operationMeta);
            restClientRequest.end().onComplete((t) -> invocation.getInvocationStageTrace().finishWriteToBuffer(System.nanoTime()));
        });
        return Future.succeededFuture();
    }).onFailure(failure -> {
        invocation.getTraceIdLogger().error(LOGGER, "Failed to send request, alreadyFailed:{}, local:{}, remote:{}, message={}.", alreadyFailed, getLocalAddress(), ipPort.getSocketAddress(), ExceptionUtils.getExceptionMessageWithoutTrace(failure));
        throwableHandler.handle(failure);
    });
}
Also used : CommonExceptionData(org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData) InvocationException(org.apache.servicecomb.swagger.invocation.exception.InvocationException) RestClientRequestImpl(org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl) OperationConfig(org.apache.servicecomb.core.definition.OperationConfig) VertxClientRequestToHttpServletRequest(org.apache.servicecomb.foundation.vertx.http.VertxClientRequestToHttpServletRequest) LoggerFactory(org.slf4j.LoggerFactory) TimeoutException(java.util.concurrent.TimeoutException) RequestOptions(io.vertx.core.http.RequestOptions) DefinitionConst(org.apache.servicecomb.registry.definition.DefinitionConst) AsyncResponse(org.apache.servicecomb.swagger.invocation.AsyncResponse) StringUtils(org.apache.commons.lang3.StringUtils) IpPort(org.apache.servicecomb.foundation.common.net.IpPort) ExceptionUtils(org.apache.servicecomb.foundation.common.utils.ExceptionUtils) JsonUtils(org.apache.servicecomb.foundation.common.utils.JsonUtils) ReadStreamPart(org.apache.servicecomb.foundation.vertx.http.ReadStreamPart) HttpClientRequest(io.vertx.core.http.HttpClientRequest) HttpClientResponse(io.vertx.core.http.HttpClientResponse) RestConst(org.apache.servicecomb.common.rest.RestConst) HttpClientFilter(org.apache.servicecomb.common.rest.filter.HttpClientFilter) Status(javax.ws.rs.core.Response.Status) Response(org.apache.servicecomb.swagger.invocation.Response) OperationMeta(org.apache.servicecomb.core.definition.OperationMeta) HttpServletResponseEx(org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx) RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) InvocationStageTrace(org.apache.servicecomb.core.invocation.InvocationStageTrace) HttpStatus(org.apache.servicecomb.foundation.common.http.HttpStatus) Logger(org.slf4j.Logger) HttpClientWithContext(org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext) VertxClientResponseToHttpServletResponse(org.apache.servicecomb.foundation.vertx.http.VertxClientResponseToHttpServletResponse) Const(org.apache.servicecomb.core.Const) Future(io.vertx.core.Future) Invocation(org.apache.servicecomb.core.Invocation) HttpServletRequestEx(org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx) List(java.util.List) Buffer(io.vertx.core.buffer.Buffer) HttpMethod(io.vertx.core.http.HttpMethod) URIEndpointObject(org.apache.servicecomb.foundation.common.net.URIEndpointObject) Handler(io.vertx.core.Handler) Buffer(io.vertx.core.buffer.Buffer) HttpClientRequest(io.vertx.core.http.HttpClientRequest) HttpClientFilter(org.apache.servicecomb.common.rest.filter.HttpClientFilter) RestClientRequestImpl(org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl) VertxClientRequestToHttpServletRequest(org.apache.servicecomb.foundation.vertx.http.VertxClientRequestToHttpServletRequest) IpPort(org.apache.servicecomb.foundation.common.net.IpPort) OperationMeta(org.apache.servicecomb.core.definition.OperationMeta) RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) InvocationException(org.apache.servicecomb.swagger.invocation.exception.InvocationException) TimeoutException(java.util.concurrent.TimeoutException) HttpServletRequestEx(org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx)

Example 55 with RestOperationMeta

use of org.apache.servicecomb.common.rest.definition.RestOperationMeta in project incubator-servicecomb-java-chassis by apache.

the class DefaultHttpClientFilter method extractResponse.

protected Response extractResponse(Invocation invocation, HttpServletResponseEx responseEx) {
    Object result = invocation.getHandlerContext().get(RestConst.READ_STREAM_PART);
    if (result != null) {
        return Response.create(responseEx.getStatusType(), result);
    }
    OperationMeta operationMeta = invocation.getOperationMeta();
    JavaType responseType = invocation.findResponseType(responseEx.getStatus());
    RestOperationMeta swaggerRestOperation = operationMeta.getExtData(RestConst.SWAGGER_REST_OPERATION);
    ProduceProcessor produceProcessor = findProduceProcessor(swaggerRestOperation, responseEx);
    if (produceProcessor == null) {
        // This happens outside the runtime such as Servlet filter response. Here we give a default json parser to it
        // and keep user data not get lose.
        String msg = String.format("method %s, path %s, statusCode %d, reasonPhrase %s, response content-type %s is not supported", swaggerRestOperation.getHttpMethod(), swaggerRestOperation.getAbsolutePath(), responseEx.getStatus(), responseEx.getStatusType().getReasonPhrase(), responseEx.getHeader(HttpHeaders.CONTENT_TYPE));
        LOGGER.warn(msg);
        produceProcessor = ProduceProcessorManager.INSTANCE.findDefaultProcessor();
    }
    try {
        result = produceProcessor.decodeResponse(responseEx.getBodyBuffer(), responseType);
        Response response = Response.create(responseEx.getStatusType(), result);
        if (response.isFailed()) {
            LOGGER.warn("invoke operation [{}] failed, status={}, msg={}", invocation.getMicroserviceQualifiedName(), responseEx.getStatusType().getStatusCode(), result == null ? "" : result.toString());
        }
        return response;
    } catch (Exception e) {
        LOGGER.error("failed to decode response body, exception is [{}]", e.getMessage());
        String msg = String.format("method %s, path %s, statusCode %d, reasonPhrase %s, response content-type %s is not supported", swaggerRestOperation.getHttpMethod(), swaggerRestOperation.getAbsolutePath(), responseEx.getStatus(), responseEx.getStatusType().getReasonPhrase(), responseEx.getHeader(HttpHeaders.CONTENT_TYPE));
        if (HttpStatus.isSuccess(responseEx.getStatus())) {
            return Response.createConsumerFail(new InvocationException(400, responseEx.getStatusType().getReasonPhrase(), new CommonExceptionData(msg), e));
        }
        return Response.createConsumerFail(new InvocationException(responseEx.getStatus(), responseEx.getStatusType().getReasonPhrase(), new CommonExceptionData(msg), e));
    }
}
Also used : Response(org.apache.servicecomb.swagger.invocation.Response) JavaType(com.fasterxml.jackson.databind.JavaType) ProduceProcessor(org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor) RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) InvocationException(org.apache.servicecomb.swagger.invocation.exception.InvocationException) CommonExceptionData(org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData) OperationMeta(org.apache.servicecomb.core.definition.OperationMeta) RestOperationMeta(org.apache.servicecomb.common.rest.definition.RestOperationMeta) InvocationException(org.apache.servicecomb.swagger.invocation.exception.InvocationException)

Aggregations

RestOperationMeta (org.apache.servicecomb.common.rest.definition.RestOperationMeta)55 OperationMeta (org.apache.servicecomb.core.definition.OperationMeta)24 Test (org.junit.Test)20 InvocationException (org.apache.servicecomb.swagger.invocation.exception.InvocationException)10 Response (org.apache.servicecomb.swagger.invocation.Response)9 CommonExceptionData (org.apache.servicecomb.swagger.invocation.exception.CommonExceptionData)9 InvocationStageTrace (org.apache.servicecomb.core.invocation.InvocationStageTrace)8 HttpClientWithContext (org.apache.servicecomb.foundation.vertx.client.http.HttpClientWithContext)7 Invocation (org.apache.servicecomb.core.Invocation)6 URIEndpointObject (org.apache.servicecomb.foundation.common.net.URIEndpointObject)6 HttpServletResponseEx (org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx)6 HttpClientRequest (io.vertx.core.http.HttpClientRequest)5 HttpMethod (io.vertx.core.http.HttpMethod)5 HashMap (java.util.HashMap)5 RestClientRequestImpl (org.apache.servicecomb.common.rest.codec.param.RestClientRequestImpl)5 ProduceProcessor (org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor)5 HttpServletRequestEx (org.apache.servicecomb.foundation.vertx.http.HttpServletRequestEx)5 AsyncResponse (org.apache.servicecomb.swagger.invocation.AsyncResponse)5 HttpClientResponse (io.vertx.core.http.HttpClientResponse)4 RequestOptions (io.vertx.core.http.RequestOptions)4