fix(server): fix server slow log, support loader import & client IP#2466
fix(server): fix server slow log, support loader import & client IP#2466SunnyBoy-WYH wants to merge 3 commits into
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #2466 +/- ##
============================================
- Coverage 56.94% 49.91% -7.03%
+ Complexity 827 741 -86
============================================
Files 612 612
Lines 49672 49697 +25
Branches 6681 6685 +4
============================================
- Hits 28284 24806 -3478
- Misses 18572 22317 +3745
+ Partials 2816 2574 -242 ☔ View full report in Codecov by Sentry. |
|
|
||
| // TODO: temporarily comment it to fix loader bug, handle it later | ||
| /*// record the request json | ||
| private void recordRequestJson(ContainerRequestContext context) throws IOException { |
There was a problem hiding this comment.
prefer collectRequestParams(), seems 'record' means output to log
| bufferedStream.mark(Integer.MAX_VALUE); | ||
|
|
||
| context.setProperty(REQUEST_PARAMS_JSON, | ||
| IOUtils.toString(bufferedStream, Charsets.toCharset(CHARSET))); |
There was a problem hiding this comment.
maybe it's very large for batch-write, can we cut part of the content?
There was a problem hiding this comment.
maybe we can cut the special length? like 512?
There was a problem hiding this comment.
or we will make it can be config? like 512/1024/2048 and default will be 512? @imbajin @liuxiaocs7 @VGalaxies
| .getPathParameters(); | ||
| requestParamsJson = pathParameters.toString(); | ||
| context.setProperty(REQUEST_PARAMS_JSON, | ||
| context.getUriInfo().getPathParameters().toString()); |
There was a problem hiding this comment.
can we also add all other branchs like PUT/DELETE
| LOG.info("[Slow Query] ip={} execTime={}ms, body={}, method={}, path={}, query={}", | ||
| getClientIP(requestContext), executeTime, | ||
| requestContext.getProperty(REQUEST_PARAMS_JSON), method, path, | ||
| uri.getQuery()); |
There was a problem hiding this comment.
are they repeated when GET: uri.getQuery() and REQUEST_PARAMS_JSON
There was a problem hiding this comment.
for GET , REQUEST_PARAMS_JSON will extract the id info from /example/{id} ; uri.getQuery() will extract id=1 from http://example.com/resource?id=1
| executeTime, null, method, path, uri.getQuery()); | ||
|
|
||
| LOG.info("[Slow Query] ip={} execTime={}ms, body={}, method={}, path={}, query={}", | ||
| getClientIP(requestContext), executeTime, |
There was a problem hiding this comment.
prefer this style: defining a local var for better readability:
for both: getClientIP and REQUEST_PARAMS_JSON.
| private String getClientIP(ContainerRequestContext requestContext) { | ||
| try { | ||
| UriInfo uriInfo = requestContext.getUriInfo(); | ||
| String host = uriInfo.getRequestUri().getHost(); |
There was a problem hiding this comment.
return here if host is an ip or empty?
| String host = uriInfo.getRequestUri().getHost(); | ||
| return InetAddress.getByName(host).getHostAddress(); | ||
| } catch (UnknownHostException e) { | ||
| return "unknown"; |
| .getPathParameters(); | ||
| requestParamsJson = pathParameters.toString(); | ||
| context.setProperty(REQUEST_PARAMS_JSON, | ||
| context.getUriInfo().getPathParameters().toString()); |
There was a problem hiding this comment.
can we also add all other branchs like PUT/DELETE -- seems still missing
There was a problem hiding this comment.
Pull request overview
Restores capture of request bodies in PathFilter (previously commented out because it broke loader GZIP batch imports) using a BufferedInputStream with mark/reset, and extends AccessLogFilter's [Slow Query] log line to include the request body and a client IP.
Changes:
PathFilternow captures request bodies for POST/PUT/DELETE via a buffered, mark/reset-able stream, truncating to 512 chars, and stores it asREQUEST_PARAMS_JSON.AccessLogFilterincludes the captured body and a "client IP" (derived from the request URI host) in the slow-query log line.- A new constant
MAX_SLOW_LOG_BODY_LENGTH = 512is introduced inPathFilter.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java |
Re-enables request-body capture using BufferedInputStream.mark/reset so the entity stream can be replayed by downstream readers (e.g. GZIP-decoded loader batches), with a 512-char truncation. |
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java |
Adds body and ip= fields to the slow-query log line, with a new getClientIP helper resolving an address from the request URI host. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| 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"; | ||
| } | ||
| } |
| 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); |
fix #2468
we support slow log before ,but it cause bug when loader batch import data, the feat PR see #2327
and later we downgrade it ,see pr : #2347
the bug due to:
so we ready to resolve it , use BufferedInputStream to cache the stream:
` BufferedInputStream bufferedStream = new BufferedInputStream(context.getEntityStream());
`
case:
[Slow Query] ip=127.0.0.1 execTime=22ms, body={"gremlin":"hugegraph.backendStoreFeatures() .supportsSharedStorage();","bindings":{},"language":"gremlin-groovy","aliases":{"g":"__g_hugegraph"}}, method=POST, path=/gremlin, query=null
and then i test it
