diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java index d429db4d9b..785fce0b9a 100644 --- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java +++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java @@ -17,6 +17,7 @@ package org.apache.hugegraph.api.filter; +import static org.apache.hugegraph.api.filter.PathFilter.REQUEST_PARAMS_JSON; import static org.apache.hugegraph.api.filter.PathFilter.REQUEST_TIME; import static org.apache.hugegraph.metrics.MetricsUtil.METRICS_PATH_FAILED_COUNTER; import static org.apache.hugegraph.metrics.MetricsUtil.METRICS_PATH_RESPONSE_TIME_HISTOGRAM; @@ -24,7 +25,9 @@ import static org.apache.hugegraph.metrics.MetricsUtil.METRICS_PATH_TOTAL_COUNTER; import java.io.IOException; +import java.net.InetAddress; import java.net.URI; +import java.net.UnknownHostException; import org.apache.hugegraph.auth.HugeAuthenticator; import org.apache.hugegraph.config.HugeConfig; @@ -40,6 +43,7 @@ import jakarta.ws.rs.container.ContainerResponseContext; import jakarta.ws.rs.container.ContainerResponseFilter; import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.UriInfo; import jakarta.ws.rs.ext.Provider; // TODO: should add test for this class @@ -114,9 +118,11 @@ public void filter(ContainerRequestContext requestContext, // Record slow query if meet needs, watch out the perf if (timeThreshold > 0 && executeTime > timeThreshold && needRecordLog(requestContext)) { - // TODO: set RequestBody null, handle it later & should record "client IP" - LOG.info("[Slow Query] execTime={}ms, body={}, method={}, path={}, query={}", - executeTime, null, method, path, uri.getQuery()); + + LOG.info("[Slow Query] ip={} execTime={}ms, body={}, method={}, path={}, query={}", + getClientIP(requestContext), executeTime, + requestContext.getProperty(REQUEST_PARAMS_JSON), method, path, + uri.getQuery()); } } @@ -128,6 +134,16 @@ public void filter(ContainerRequestContext requestContext, } } + private String getClientIP(ContainerRequestContext requestContext) { + try { + UriInfo uriInfo = requestContext.getUriInfo(); + String host = uriInfo.getRequestUri().getHost(); + return InetAddress.getByName(host).getHostAddress(); + } catch (UnknownHostException e) { + return "unknown"; + } + } + private boolean statusOk(int status) { return status >= 200 && status < 300; } diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java index dda43b3fba..23722dc1c6 100644 --- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java +++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java @@ -17,9 +17,16 @@ package org.apache.hugegraph.api.filter; +import static org.apache.hugegraph.api.API.CHARSET; + +import java.io.BufferedInputStream; import java.io.IOException; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.IOUtils; + import jakarta.inject.Singleton; +import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.container.ContainerRequestContext; import jakarta.ws.rs.container.ContainerRequestFilter; import jakarta.ws.rs.container.PreMatching; @@ -32,27 +39,37 @@ public class PathFilter implements ContainerRequestFilter { public static final String REQUEST_TIME = "request_time"; public static final String REQUEST_PARAMS_JSON = "request_params_json"; + public static final int MAX_SLOW_LOG_BODY_LENGTH = 512; @Override public void filter(ContainerRequestContext context) throws IOException { - context.setProperty(REQUEST_TIME, System.currentTimeMillis()); + long startTime = System.currentTimeMillis(); + + context.setProperty(REQUEST_TIME, startTime); + + collectRequestParams(context); + } - // TODO: temporarily comment it to fix loader bug, handle it later - /*// record the request json + private void collectRequestParams(ContainerRequestContext context) throws IOException { String method = context.getMethod(); - String requestParamsJson = ""; - if (method.equals(HttpMethod.POST)) { - requestParamsJson = IOUtils.toString(context.getEntityStream(), - Charsets.toCharset(CHARSET)); - // replace input stream because we have already read it - InputStream in = IOUtils.toInputStream(requestParamsJson, Charsets.toCharset(CHARSET)); - context.setEntityStream(in); + if (method.equals(HttpMethod.POST) || method.equals(HttpMethod.PUT) || + method.equals(HttpMethod.DELETE)) { + BufferedInputStream bufferedStream = new BufferedInputStream(context.getEntityStream()); + + bufferedStream.mark(Integer.MAX_VALUE); + String body = IOUtils.toString(bufferedStream, + Charsets.toCharset(CHARSET)); + body = body.length() > MAX_SLOW_LOG_BODY_LENGTH ? + body.substring(0, MAX_SLOW_LOG_BODY_LENGTH) : body; + + context.setProperty(REQUEST_PARAMS_JSON, body); + + bufferedStream.reset(); + + context.setEntityStream(bufferedStream); } else if (method.equals(HttpMethod.GET)) { - MultivaluedMap pathParameters = context.getUriInfo() - .getPathParameters(); - requestParamsJson = pathParameters.toString(); + context.setProperty(REQUEST_PARAMS_JSON, + context.getUriInfo().getPathParameters().toString()); } - - context.setProperty(REQUEST_PARAMS_JSON, requestParamsJson);*/ } }