Skip to content

Commit

Permalink
Provide RequestContext to RequestLog sanitizers (line#2803)
Browse files Browse the repository at this point in the history
Motivation:

A user sometimes needs to sanitize a `RequestLog` depending on
additional information available in `RequestContext`, e.g. current
request path.

Modifications:

- Use `BiFunction<RequestContext,...>` instead of `Function` for
  sanitization.
- `RegexBasedSanitizer` is now a `BiFunction`.
- Deprecate the methods that require `Function`s in:
  - `Logging{Client,RpcClient,Service}Builder`
  - `RequestOnlyLog.toRequestOnlyString()`
  - `RequestLog.toResponseOnlyString()`

Result:

- A user can implement a sanitizer that behaves differently dependin on
  the current context.
- The methods that require `Function`s in the following methods have
  been deprecated:
  - `Logging{Client,RpcClient,Service}Builder`
  - `RequestOnlyLog.toRequestOnlyString()`
  - `RequestLog.toResponseOnlyString()`
  • Loading branch information
trustin committed Jun 17, 2020
1 parent 74af186 commit ead4d10
Show file tree
Hide file tree
Showing 16 changed files with 738 additions and 211 deletions.
Expand Up @@ -20,6 +20,7 @@
import static com.linecorp.armeria.internal.common.logging.LoggingDecorators.logResponse;
import static java.util.Objects.requireNonNull;

import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;

Expand All @@ -33,10 +34,12 @@
import com.linecorp.armeria.client.SimpleDecoratingClient;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestOnlyLog;
import com.linecorp.armeria.common.util.Functions;
import com.linecorp.armeria.common.util.Sampler;

/**
Expand All @@ -54,14 +57,16 @@ abstract class AbstractLoggingClient<I extends Request, O extends Response>
private final Logger logger;
private final Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper;
private final Function<? super RequestLog, LogLevel> responseLogLevelMapper;
private final Function<? super HttpHeaders, ?> requestHeadersSanitizer;
private final Function<Object, ?> requestContentSanitizer;
private final Function<? super HttpHeaders, ?> requestTrailersSanitizer;

private final Function<? super HttpHeaders, ?> responseHeadersSanitizer;
private final Function<Object, ?> responseContentSanitizer;
private final Function<? super HttpHeaders, ?> responseTrailersSanitizer;
private final Function<? super Throwable, ?> responseCauseSanitizer;

private final BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestHeadersSanitizer;
private final BiFunction<? super RequestContext, Object, ?> requestContentSanitizer;
private final BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestTrailersSanitizer;

private final BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseHeadersSanitizer;
private final BiFunction<? super RequestContext, Object, ?> responseContentSanitizer;
private final BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseTrailersSanitizer;
private final BiFunction<? super RequestContext, ? super Throwable, ?> responseCauseSanitizer;

private final Sampler<? super ClientRequestContext> sampler;

/**
Expand All @@ -73,33 +78,36 @@ abstract class AbstractLoggingClient<I extends Request, O extends Response>
null,
log -> level,
log -> level,
Function.identity(),
Function.identity(),
Function.identity(),
Function.identity(),
Function.identity(),
Function.identity(),
Function.identity(),
Functions.second(),
Functions.second(),
Functions.second(),
Functions.second(),
Functions.second(),
Functions.second(),
Functions.second(),
Sampler.always());
}

/**
* Creates a new instance that logs {@link Request}s and {@link Response}s at the specified
* {@link LogLevel}s with the specified sanitizers.
*/
AbstractLoggingClient(Client<I, O> delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
Function<? super HttpHeaders, ?> requestHeadersSanitizer,
Function<Object, ?> requestContentSanitizer,
Function<? super HttpHeaders, ?> requestTrailersSanitizer,
Function<? super HttpHeaders, ?> responseHeadersSanitizer,
Function<Object, ?> responseContentSanitizer,
Function<? super HttpHeaders, ?> responseTrailersSanitizer,
Function<? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {
AbstractLoggingClient(
Client<I, O> delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> requestContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestTrailersSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> responseContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseTrailersSanitizer,
BiFunction<? super RequestContext, ? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {

super(requireNonNull(delegate, "delegate"));

this.logger = logger != null ? logger : LoggerFactory.getLogger(getClass());
this.requestLogLevelMapper = requireNonNull(requestLogLevelMapper, "requestLogLevelMapper");
this.responseLogLevelMapper = requireNonNull(responseLogLevelMapper, "responseLogLevelMapper");
Expand Down
Expand Up @@ -16,6 +16,7 @@

package com.linecorp.armeria.client.logging;

import java.util.function.BiFunction;
import java.util.function.Function;

import javax.annotation.Nullable;
Expand All @@ -28,6 +29,7 @@
import com.linecorp.armeria.common.HttpRequest;
import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.RequestLog;
Expand Down Expand Up @@ -65,18 +67,20 @@ public static LoggingClientBuilder builder() {
* {@link LogLevel}s with the specified sanitizers.
* If the logger is null, it means that the default logger is used.
*/
LoggingClient(HttpClient delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
Function<? super HttpHeaders, ?> requestHeadersSanitizer,
Function<Object, ?> requestContentSanitizer,
Function<? super HttpHeaders, ?> requestTrailersSanitizer,
Function<? super HttpHeaders, ?> responseHeadersSanitizer,
Function<Object, ?> responseContentSanitizer,
Function<? super HttpHeaders, ?> responseTrailersSanitizer,
Function<? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {
LoggingClient(
HttpClient delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> requestContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestTrailersSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> responseContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseTrailersSanitizer,
BiFunction<? super RequestContext, ? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {

super(delegate, logger, requestLogLevelMapper, responseLogLevelMapper,
requestHeadersSanitizer, requestContentSanitizer, requestTrailersSanitizer,
responseHeadersSanitizer, responseContentSanitizer, responseTrailersSanitizer,
Expand Down
Expand Up @@ -13,16 +13,17 @@
* License for the specific language governing permissions and limitations
* under the License.
*/

package com.linecorp.armeria.client.logging;

import java.util.function.BiFunction;
import java.util.function.Function;

import org.slf4j.Logger;

import com.linecorp.armeria.client.ClientRequestContext;
import com.linecorp.armeria.client.HttpClient;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.logging.LogLevel;
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.common.logging.RequestOnlyLog;
Expand Down Expand Up @@ -108,50 +109,113 @@ public LoggingClientBuilder responseLogLevelMapper(
}

@Override
public LoggingClientBuilder requestHeadersSanitizer(
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestHeadersSanitizer) {
return (LoggingClientBuilder) super.requestHeadersSanitizer(requestHeadersSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder requestHeadersSanitizer(
Function<? super HttpHeaders, ?> requestHeadersSanitizer) {
return (LoggingClientBuilder) super.requestHeadersSanitizer(requestHeadersSanitizer);
}

@Override
public LoggingClientBuilder responseHeadersSanitizer(
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseHeadersSanitizer) {
return (LoggingClientBuilder) super.responseHeadersSanitizer(responseHeadersSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder responseHeadersSanitizer(
Function<? super HttpHeaders, ?> responseHeadersSanitizer) {
return (LoggingClientBuilder) super.responseHeadersSanitizer(responseHeadersSanitizer);
}

@Override
public LoggingClientBuilder requestTrailersSanitizer(
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestTrailersSanitizer) {
return (LoggingClientBuilder) super.requestTrailersSanitizer(requestTrailersSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder requestTrailersSanitizer(
Function<? super HttpHeaders, ?> requestTrailersSanitizer) {
return (LoggingClientBuilder) super.requestTrailersSanitizer(requestTrailersSanitizer);
}

@Override
public LoggingClientBuilder responseTrailersSanitizer(
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseTrailersSanitizer) {
return (LoggingClientBuilder) super.responseTrailersSanitizer(responseTrailersSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder responseTrailersSanitizer(
Function<? super HttpHeaders, ?> responseTrailersSanitizer) {
return (LoggingClientBuilder) super.responseTrailersSanitizer(responseTrailersSanitizer);
}

@Override
public LoggingClientBuilder headersSanitizer(
BiFunction<? super RequestContext, ? super HttpHeaders, ?> headersSanitizer) {
return (LoggingClientBuilder) super.headersSanitizer(headersSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder headersSanitizer(Function<? super HttpHeaders, ?> headersSanitizer) {
return (LoggingClientBuilder) super.headersSanitizer(headersSanitizer);
}

@Override
public LoggingClientBuilder requestContentSanitizer(
BiFunction<? super RequestContext, Object, ?> requestContentSanitizer) {
return (LoggingClientBuilder) super.requestContentSanitizer(requestContentSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder requestContentSanitizer(Function<Object, ?> requestContentSanitizer) {
return (LoggingClientBuilder) super.requestContentSanitizer(requestContentSanitizer);
}

@Override
public LoggingClientBuilder responseContentSanitizer(
BiFunction<? super RequestContext, Object, ?> responseContentSanitizer) {
return (LoggingClientBuilder) super.responseContentSanitizer(responseContentSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder responseContentSanitizer(Function<Object, ?> responseContentSanitizer) {
return (LoggingClientBuilder) super.responseContentSanitizer(responseContentSanitizer);
}

@Override
public LoggingClientBuilder contentSanitizer(
BiFunction<? super RequestContext, Object, ?> contentSanitizer) {
return (LoggingClientBuilder) super.contentSanitizer(contentSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder contentSanitizer(Function<Object, ?> contentSanitizer) {
return (LoggingClientBuilder) super.contentSanitizer(contentSanitizer);
}

@Override
public LoggingClientBuilder responseCauseSanitizer(
BiFunction<? super RequestContext, ? super Throwable, ?> responseCauseSanitizer) {
return (LoggingClientBuilder) super.responseCauseSanitizer(responseCauseSanitizer);
}

@Override
@Deprecated
public LoggingClientBuilder responseCauseSanitizer(
Function<? super Throwable, ?> responseCauseSanitizer) {
return (LoggingClientBuilder) super.responseCauseSanitizer(responseCauseSanitizer);
Expand Down
Expand Up @@ -16,6 +16,7 @@

package com.linecorp.armeria.client.logging;

import java.util.function.BiFunction;
import java.util.function.Function;

import javax.annotation.Nullable;
Expand All @@ -26,6 +27,7 @@
import com.linecorp.armeria.client.RpcClient;
import com.linecorp.armeria.common.HttpHeaders;
import com.linecorp.armeria.common.Request;
import com.linecorp.armeria.common.RequestContext;
import com.linecorp.armeria.common.Response;
import com.linecorp.armeria.common.RpcRequest;
import com.linecorp.armeria.common.RpcResponse;
Expand Down Expand Up @@ -65,18 +67,20 @@ public static LoggingRpcClientBuilder builder() {
* {@link LogLevel}s with the specified sanitizers.
* If the logger is null, it means that the default logger is used.
*/
LoggingRpcClient(RpcClient delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
Function<? super HttpHeaders, ?> requestHeadersSanitizer,
Function<Object, ?> requestContentSanitizer,
Function<? super HttpHeaders, ?> requestTrailersSanitizer,
Function<? super HttpHeaders, ?> responseHeadersSanitizer,
Function<Object, ?> responseContentSanitizer,
Function<? super HttpHeaders, ?> responseTrailersSanitizer,
Function<? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {
LoggingRpcClient(
RpcClient delegate,
@Nullable Logger logger,
Function<? super RequestOnlyLog, LogLevel> requestLogLevelMapper,
Function<? super RequestLog, LogLevel> responseLogLevelMapper,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> requestContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> requestTrailersSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseHeadersSanitizer,
BiFunction<? super RequestContext, Object, ?> responseContentSanitizer,
BiFunction<? super RequestContext, ? super HttpHeaders, ?> responseTrailersSanitizer,
BiFunction<? super RequestContext, ? super Throwable, ?> responseCauseSanitizer,
Sampler<? super ClientRequestContext> sampler) {

super(delegate, logger, requestLogLevelMapper, responseLogLevelMapper,
requestHeadersSanitizer, requestContentSanitizer, requestTrailersSanitizer,
responseHeadersSanitizer, responseContentSanitizer, responseTrailersSanitizer,
Expand Down

0 comments on commit ead4d10

Please sign in to comment.