Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions src/main/java/org/prebid/cache/handlers/CacheHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.prebid.cache.exceptions.RequestParsingException;
import org.prebid.cache.exceptions.ResourceNotFoundException;
import org.prebid.cache.exceptions.UnsupportedMediaTypeException;
import org.prebid.cache.log.ConditionalLogger;
import org.prebid.cache.metrics.MetricsRecorder;
import org.prebid.cache.metrics.MetricsRecorder.MetricsRecorderTimer;
import org.springframework.core.io.buffer.DataBufferLimitException;
Expand All @@ -18,20 +19,27 @@
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeoutException;

@Slf4j
abstract class CacheHandler extends MetricsHandler {

private static final int UNKNOWN_SIZE_VALUE = 1;
private static final double SAMPLING_RATE = 0.01;
ServiceType type;
static final String ID_KEY = "uuid";
static final String CACHE_HOST_KEY = "ch";
private static final String UUID_DUPLICATION = "UUID duplication.";

protected String metricTagPrefix;

private final ConditionalLogger conditionalLogger;
private final Double samplingRate;

protected CacheHandler(Double samplingRate) {
this.samplingRate = samplingRate;
this.conditionalLogger = new ConditionalLogger(log);
}

protected enum PayloadType implements StringTypeConvertible {
JSON("json"),
XML("xml");
Expand Down Expand Up @@ -74,18 +82,16 @@ <T> Mono<T> validateErrorResult(final Mono<T> mono) {
private Mono<ServerResponse> handleErrorMetrics(final Throwable error,
final ServerRequest request) {
if (error instanceof ResourceNotFoundException) {
log.debug(error.getMessage());
conditionalLogger.info(error.getMessage(), samplingRate);
} else if (error instanceof BadRequestException) {
log.error(error.getMessage());
} else if (error instanceof TimeoutException) {
metricsRecorder.markMeterForTag(this.metricTagPrefix, MetricsRecorder.MeasurementTag.ERROR_TIMEDOUT);
} else if (error instanceof DataBufferLimitException) {
if (ThreadLocalRandom.current().nextDouble() < SAMPLING_RATE) {
final Long contentLength = request.headers().contentLength()
.orElse(UNKNOWN_SIZE_VALUE);

log.error("Request length: `{}` exceeds maximum size limit", contentLength);
}
final long contentLength = request.headers().contentLength().orElse(UNKNOWN_SIZE_VALUE);
conditionalLogger.error(
Comment thread
AntoxaAntoxic marked this conversation as resolved.
"Request length: `" + contentLength + "` exceeds maximum size limit",
samplingRate);
} else {
log.error("Error occurred while processing the request: '{}', cause: '{}'",
ExceptionUtils.getMessage(error), ExceptionUtils.getMessage(error));
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/org/prebid/cache/handlers/GetCacheHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.prebid.cache.repository.ReactiveRepository;
import org.prebid.cache.routers.ApiConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -48,8 +49,10 @@ public GetCacheHandler(final ReactiveRepository<PayloadWrapper, String> reposito
final ApiConfig apiConfig,
final MetricsRecorder metricsRecorder,
final PrebidServerResponseBuilder builder,
final CircuitBreaker webClientCircuitBreaker) {
final CircuitBreaker webClientCircuitBreaker,
@Value("${sampling.rate:0.01}") final Double samplingRate) {

super(samplingRate);
this.metricsRecorder = metricsRecorder;
this.type = ServiceType.FETCH;
this.repository = repository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.prebid.cache.repository.CacheConfig;
import org.prebid.cache.repository.ReactiveRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -64,8 +65,10 @@ public PostCacheHandler(final ReactiveRepository<PayloadWrapper, String> reposit
final MetricsRecorder metricsRecorder,
final PrebidServerResponseBuilder builder,
final Supplier<Date> currentDateProvider,
final CircuitBreaker webClientCircuitBreaker) {
final CircuitBreaker webClientCircuitBreaker,
@Value("${sampling.rate:0.01}") final Double samplingRate) {

super(samplingRate);
this.metricsRecorder = metricsRecorder;
this.type = ServiceType.SAVE;
this.repository = repository;
Expand Down
37 changes: 37 additions & 0 deletions src/main/java/org/prebid/cache/log/ConditionalLogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.prebid.cache.log;

import lombok.AllArgsConstructor;
import org.slf4j.Logger;

import java.util.concurrent.ThreadLocalRandom;

@AllArgsConstructor
public class ConditionalLogger {

private final Logger logger;

public void info(String message, double samplingRate) {
if (samplingRate >= 1.0d || ThreadLocalRandom.current().nextDouble() < samplingRate) {
logger.info(message);
}
}

public void debug(String message, double samplingRate) {
if (samplingRate >= 1.0d || ThreadLocalRandom.current().nextDouble() < samplingRate) {
logger.debug(message);
}
}

public void error(String message, double samplingRate) {
if (samplingRate >= 1.0d || ThreadLocalRandom.current().nextDouble() < samplingRate) {
logger.error(message);
}
}

public void warn(String message, double samplingRate) {
if (samplingRate >= 1.0d || ThreadLocalRandom.current().nextDouble() < samplingRate) {
logger.warn(message);
}
}

}
1 change: 1 addition & 0 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ cache:
# logging
logging.level.root: info
logging.config: classpath:log4j2-console.xml
sampling.rate: 0.01

# metrics
management:
Expand Down
15 changes: 13 additions & 2 deletions src/test/java/org/prebid/cache/handlers/GetCacheHandlerTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.prebid.cache.repository.ReactiveRepository;
import org.prebid.cache.routers.ApiConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -41,6 +42,7 @@
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
Expand Down Expand Up @@ -78,14 +80,23 @@ class GetCacheHandlerTests extends CacheHandlerTests {
@MockBean
ReactiveRepository<PayloadWrapper, String> repository;

@Value("${sampling.rate:2.0}")
Double samplingRate;

GetCacheHandler handler;

WireMockServer serverMock;

@BeforeEach
public void setup() {
handler =
new GetCacheHandler(repository, cacheConfig, apiConfig, metricsRecorder, responseBuilder, webClientCircuitBreaker);
handler = new GetCacheHandler(
repository,
cacheConfig,
apiConfig,
metricsRecorder,
responseBuilder,
webClientCircuitBreaker,
samplingRate);
serverMock = new WireMockServer(8080);
serverMock.start();
}
Expand Down
29 changes: 22 additions & 7 deletions src/test/java/org/prebid/cache/handlers/PostCacheHandlerTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.prebid.cache.repository.ReactiveRepository;
import org.prebid.cache.routers.ApiConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
Expand All @@ -39,7 +40,12 @@
import java.util.function.Consumer;
import java.util.function.Supplier;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
import static com.github.tomakehurst.wiremock.client.WireMock.equalToIgnoreCase;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;
import static org.prebid.cache.util.AwaitilityUtil.awaitAndVerify;
Expand Down Expand Up @@ -78,10 +84,19 @@ class PostCacheHandlerTests extends CacheHandlerTests {
@MockBean
ReactiveRepository<PayloadWrapper, String> repository;

@Value("${sampling.rate:2.0}")
Double samplingRate;

@Test
void testVerifyError() {
PostCacheHandler handler = new PostCacheHandler(repository, cacheConfig, metricsRecorder, builder,
currentDateProvider, webClientCircuitBreaker);
PostCacheHandler handler = new PostCacheHandler(
repository,
cacheConfig,
metricsRecorder,
builder,
currentDateProvider,
webClientCircuitBreaker,
samplingRate);
verifyJacksonError(handler);
verifyRepositoryError(handler);
}
Expand All @@ -108,7 +123,7 @@ void testVerifySave() {
given(repository.save(payloadWrapper)).willReturn(Mono.just(payloadWrapper));

final var handler = new PostCacheHandler(repository, cacheConfig, metricsRecorder, builder,
currentDateProvider, webClientCircuitBreaker);
currentDateProvider, webClientCircuitBreaker, samplingRate);

final var payload = new PayloadTransfer("json", "2be04ba5-8f9b-4a1e-8100-d573c40312f8", "", 1800L, null,
"prebid_");
Expand Down Expand Up @@ -141,7 +156,7 @@ void testSecondaryCacheSuccess() {
.willReturn(aResponse().withBody("{\"responses\":[{\"uuid\":\"2be04ba5-8f9b-4a1e-8100-d573c40312f8\"}]}")));

final var handler = new PostCacheHandler(repository, cacheConfig, metricsRecorder, builder,
currentDateProvider, webClientCircuitBreaker);
currentDateProvider, webClientCircuitBreaker, samplingRate);

final var payload = new PayloadTransfer("json", "2be04ba5-8f9b-4a1e-8100-d573c40312f8", "", 1800L, null,
"prebid_");
Expand Down Expand Up @@ -176,7 +191,7 @@ void testExternalUUIDInvalid() {
cacheConfig.getMinExpiry(), cacheConfig.getMaxExpiry(),
false, Collections.emptyList(), cacheConfig.getSecondaryCachePath(), 100, 100, "example.com", "http");
final var handler = new PostCacheHandler(repository, cacheConfigLocal, metricsRecorder, builder,
currentDateProvider, webClientCircuitBreaker);
currentDateProvider, webClientCircuitBreaker, samplingRate);

final var payload = new PayloadTransfer("json", "2be04ba5-8f9b-4a1e-8100-d573c40312f8", "", 1800L, null,
"prebid_");
Expand Down Expand Up @@ -210,7 +225,7 @@ void testUUIDDuplication() {
5, cacheConfig.getMaxExpiry(), cacheConfig.isAllowExternalUUID(),
Collections.emptyList(), cacheConfig.getSecondaryCachePath(), 100, 100, "example.com", "http");
final var handler = new PostCacheHandler(repository, cacheConfigLocal, metricsRecorder, builder,
currentDateProvider, webClientCircuitBreaker);
currentDateProvider, webClientCircuitBreaker, samplingRate);

final var payload = new PayloadTransfer("json", "2be04ba5-8f9b-4a1e-8100-d573c40312f8", "", 1800L, null,
"prebid_");
Expand Down