Skip to content

Commit 2afdc4b

Browse files
author
Tomas Longo
committed
Add test for http exception handler
Signed-off-by: Tomas Longo <tomas.longo@sap.com>
1 parent 03cd8e8 commit 2afdc4b

6 files changed

Lines changed: 117 additions & 10 deletions

File tree

data-prepper-plugins/otel-trace-source/src/main/java/org/opensearch/dataprepper/plugins/source/oteltrace/grpc/GrpcService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import org.opensearch.dataprepper.plugins.source.oteltrace.OTelTraceGrpcService;
2020
import org.opensearch.dataprepper.plugins.source.oteltrace.OTelTraceSourceConfig;
2121
import org.opensearch.dataprepper.plugins.source.oteltrace.RetryInfoConfig;
22-
import org.opensearch.dataprepper.plugins.source.oteltrace.certificate.CertificateProviderFactory;
2322
import org.slf4j.Logger;
2423
import org.slf4j.LoggerFactory;
2524

@@ -84,7 +83,6 @@ public com.linecorp.armeria.server.grpc.GrpcService create(Buffer<Record<Object>
8483
grpcServiceBuilder.addService(ServerInterceptors.intercept(oTelTraceGrpcService, serverInterceptors));
8584
}
8685

87-
// todo tlongo extract into separate grpc config. Can't we have only one healthcheck for the whole server? We are already configuring one OtelTraceSource
8886
if (oTelTraceSourceConfig.hasHealthCheck()) {
8987
LOG.info("Health check is enabled");
9088
grpcServiceBuilder.addService(new HealthGrpcService());

data-prepper-plugins/otel-trace-source/src/main/java/org/opensearch/dataprepper/plugins/source/oteltrace/http/ArmeriaHttpService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,5 @@ private void processRequest(final ExportTraceServiceRequest request) {
108108
}
109109

110110
successRequestsCounter.increment();
111-
112-
// todo tlongo what is the responseObserver used for?
113-
// responseObserver.onNext(ExportTraceServiceResponse.newBuilder().build());
114-
// responseObserver.onCompleted();
115111
}
116112
}

data-prepper-plugins/otel-trace-source/src/main/java/org/opensearch/dataprepper/plugins/source/oteltrace/http/HttpExceptionHandler.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import io.grpc.StatusRuntimeException;
3030
import io.micrometer.core.instrument.Counter;
3131

32-
// todo tlongo add tests for metrics
3332
public class HttpExceptionHandler implements ExceptionHandlerFunction {
3433
private static final Logger LOG = LoggerFactory.getLogger(HttpExceptionHandler.class);
3534

@@ -61,7 +60,6 @@ public HttpResponse handleException(final ServiceRequestContext ctx,
6160
StatusHolder statusHolder = createStatus(exceptionCause);
6261

6362
try {
64-
// todo tlongo why do we need this in the first place?
6563
JsonFormat.TypeRegistry typeRegistry = JsonFormat.TypeRegistry.newBuilder()
6664
.add(RetryInfo.getDescriptor())
6765
.build();

data-prepper-plugins/otel-trace-source/src/main/java/org/opensearch/dataprepper/plugins/source/oteltrace/http/HttpService.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
public class HttpService {
2525
private static final Logger LOG = LoggerFactory.getLogger(HttpService.class);
26-
// todo tlongo include in config
2726
private static final RetryInfoConfig DEFAULT_RETRY_INFO = new RetryInfoConfig(Duration.ofMillis(100), Duration.ofMillis(2000));
2827

2928
private final PluginMetrics pluginMetrics;

data-prepper-plugins/otel-trace-source/src/test/java/org/opensearch/dataprepper/plugins/source/oteltrace/OTelTraceSource_HttpServiceTest.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ class OTelTraceSource_HttpServiceTest {
126126
private PipelineDescription pipelineDescription;
127127
private OTelTraceSource SOURCE;
128128

129-
private static HttpBasicAuthenticationConfig PROVIDED_CONFIG = new HttpBasicAuthenticationConfig("username", "password");
129+
private static final HttpBasicAuthenticationConfig PROVIDED_CONFIG = new HttpBasicAuthenticationConfig("username", "password");
130130

131131

132132
@BeforeEach
@@ -175,6 +175,25 @@ private void configureObjectUnderTest() {
175175
SOURCE = new OTelTraceSource(oTelTraceSourceConfig, pluginMetrics, pluginFactory, pipelineDescription);
176176
}
177177

178+
@Test
179+
void healthcheck_is_up() {
180+
when(oTelTraceSourceConfig.enableHttpHealthCheck()).thenReturn(true);
181+
SOURCE.start(buffer);
182+
183+
WebClient.of().execute(RequestHeaders.builder()
184+
.scheme(SessionProtocol.HTTP)
185+
.authority("127.0.0.1:21890")
186+
.method(HttpMethod.HEAD)
187+
.path("/health")
188+
.contentType(MediaType.JSON_UTF_8)
189+
.build())
190+
.aggregate()
191+
.whenComplete((response, throwable) -> assertThat(response.status(), is(HttpStatus.OK)))
192+
.join();
193+
194+
verifyNoInteractions(buffer);
195+
}
196+
178197
@Test
179198
void request_fails_because_of_invalid_payload() throws Exception {
180199
ExportTraceServiceRequest request = createInvalidExportTraceRequest();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package org.opensearch.dataprepper.plugins.source.oteltrace.http;
2+
3+
4+
import java.time.Duration;
5+
import java.util.concurrent.TimeoutException;
6+
7+
import static org.mockito.Mockito.times;
8+
import static org.mockito.Mockito.verify;
9+
import static org.mockito.Mockito.when;
10+
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.extension.ExtendWith;
14+
import org.mockito.Mock;
15+
import org.mockito.junit.jupiter.MockitoExtension;
16+
import org.opensearch.dataprepper.HttpRequestExceptionHandler;
17+
import org.opensearch.dataprepper.exceptions.BadRequestException;
18+
import org.opensearch.dataprepper.exceptions.BufferWriteException;
19+
import org.opensearch.dataprepper.exceptions.RequestCancelledException;
20+
import org.opensearch.dataprepper.metrics.PluginMetrics;
21+
import org.opensearch.dataprepper.model.buffer.SizeOverflowException;
22+
23+
import com.linecorp.armeria.common.HttpRequest;
24+
import com.linecorp.armeria.server.RequestTimeoutException;
25+
import com.linecorp.armeria.server.ServiceRequestContext;
26+
27+
import io.micrometer.core.instrument.Counter;
28+
29+
@ExtendWith(MockitoExtension.class)
30+
class HttpExceptionHandlerTest {
31+
HttpExceptionHandler httpExceptionHandler;
32+
33+
@Mock
34+
private PluginMetrics pluginMetrics;
35+
36+
@Mock
37+
private ServiceRequestContext requestContext;
38+
39+
@Mock
40+
private HttpRequest httpRequest;
41+
42+
@Mock
43+
private Counter requestTimeoutsCounter;
44+
45+
@Mock
46+
private Counter badRequestsCounter;
47+
48+
@Mock
49+
private Counter requestsTooLargeCounter;
50+
51+
@Mock
52+
private Counter internalServerErrorCounter;
53+
@BeforeEach
54+
public void setUp() {
55+
when(pluginMetrics.counter(HttpRequestExceptionHandler.REQUEST_TIMEOUTS)).thenReturn(requestTimeoutsCounter);
56+
when(pluginMetrics.counter(HttpRequestExceptionHandler.BAD_REQUESTS)).thenReturn(badRequestsCounter);
57+
when(pluginMetrics.counter(HttpRequestExceptionHandler.REQUESTS_TOO_LARGE)).thenReturn(requestsTooLargeCounter);
58+
when(pluginMetrics.counter(HttpRequestExceptionHandler.INTERNAL_SERVER_ERROR)).thenReturn(internalServerErrorCounter);
59+
httpExceptionHandler = new HttpExceptionHandler(pluginMetrics, Duration.ofMillis(100), Duration.ofSeconds(2));
60+
}
61+
62+
@Test
63+
public void testHandleBadRequestException() {
64+
httpExceptionHandler.handleException(requestContext, httpRequest, new BadRequestException("msg", null));
65+
verify(badRequestsCounter).increment();
66+
}
67+
68+
@Test
69+
public void testHandleTimeoutException() {
70+
httpExceptionHandler.handleException(requestContext, httpRequest, new BufferWriteException(null, new TimeoutException()));
71+
verify(requestTimeoutsCounter, times(1)).increment();
72+
}
73+
74+
@Test
75+
public void testHandleArmeriaTimeoutException() {
76+
httpExceptionHandler.handleException(requestContext, httpRequest, RequestTimeoutException.get());
77+
verify(requestTimeoutsCounter, times(1)).increment();
78+
}
79+
80+
@Test
81+
public void testHandleSizeOverflowException() {
82+
httpExceptionHandler.handleException(requestContext, httpRequest, new SizeOverflowException("msg"));
83+
verify(requestsTooLargeCounter).increment();
84+
}
85+
86+
@Test
87+
public void testHandleRequestCancelledException() {
88+
httpExceptionHandler.handleException(requestContext, httpRequest, new RequestCancelledException("msg"));
89+
verify(requestTimeoutsCounter, times(1)).increment();
90+
}
91+
92+
@Test
93+
public void testHandleInternalServerException() {
94+
httpExceptionHandler.handleException(requestContext, httpRequest, new RuntimeException("msg"));
95+
verify(internalServerErrorCounter, times(1)).increment();
96+
}
97+
}

0 commit comments

Comments
 (0)