Skip to content

Commit acce15e

Browse files
committed
Adding suggested delay
1 parent 61fb2ee commit acce15e

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

opamp-client/src/main/java/io/opentelemetry/opamp/client/internal/request/service/HttpRequestService.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.opentelemetry.opamp.client.internal.connectivity.http.HttpErrorException;
44
import io.opentelemetry.opamp.client.internal.connectivity.http.HttpSender;
5+
import io.opentelemetry.opamp.client.internal.connectivity.http.RetryAfterParser;
56
import io.opentelemetry.opamp.client.internal.request.Request;
67
import io.opentelemetry.opamp.client.internal.request.delay.AcceptsDelaySuggestion;
78
import io.opentelemetry.opamp.client.internal.request.delay.PeriodicDelay;
@@ -28,6 +29,7 @@ public final class HttpRequestService implements RequestService, Runnable {
2829
private final PeriodicDelay periodicRetryDelay;
2930
private final AtomicBoolean retryModeEnabled = new AtomicBoolean(false);
3031
private final AtomicBoolean isRunning = new AtomicBoolean(false);
32+
private final RetryAfterParser retryAfterParser;
3133
@Nullable private Callback callback;
3234
@Nullable private Supplier<Request> requestSupplier;
3335
public static final PeriodicDelay DEFAULT_DELAY_BETWEEN_REQUESTS =
@@ -57,18 +59,21 @@ public static HttpRequestService create(
5759
requestSender,
5860
PeriodicTaskExecutor.create(periodicRequestDelay),
5961
periodicRequestDelay,
60-
periodicRetryDelay);
62+
periodicRetryDelay,
63+
RetryAfterParser.getInstance());
6164
}
6265

6366
HttpRequestService(
6467
HttpSender requestSender,
6568
PeriodicTaskExecutor executor,
6669
PeriodicDelay periodicRequestDelay,
67-
PeriodicDelay periodicRetryDelay) {
70+
PeriodicDelay periodicRetryDelay,
71+
RetryAfterParser retryAfterParser) {
6872
this.requestSender = requestSender;
6973
this.executor = executor;
7074
this.periodicRequestDelay = periodicRequestDelay;
7175
this.periodicRetryDelay = periodicRetryDelay;
76+
this.retryAfterParser = retryAfterParser;
7277
}
7378

7479
@Override
@@ -154,7 +159,7 @@ private void handleHttpError(HttpSender.Response response) {
154159
String retryAfterHeader = response.getHeader("Retry-After");
155160
Duration retryAfter = null;
156161
if (retryAfterHeader != null) {
157-
retryAfter = Duration.ofSeconds(Long.parseLong(retryAfterHeader));
162+
retryAfter = retryAfterParser.parse(retryAfterHeader);
158163
}
159164
enableRetryMode(retryAfter);
160165
}

opamp-client/src/test/java/io/opentelemetry/opamp/client/internal/request/service/HttpRequestServiceTest.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import io.opentelemetry.opamp.client.internal.connectivity.http.HttpErrorException;
1818
import io.opentelemetry.opamp.client.internal.connectivity.http.HttpSender;
19+
import io.opentelemetry.opamp.client.internal.connectivity.http.RetryAfterParser;
1920
import io.opentelemetry.opamp.client.internal.request.Request;
2021
import io.opentelemetry.opamp.client.internal.request.delay.AcceptsDelaySuggestion;
2122
import io.opentelemetry.opamp.client.internal.request.delay.PeriodicDelay;
@@ -53,7 +54,12 @@ class HttpRequestServiceTest {
5354
@BeforeEach
5455
void setUp() {
5556
httpRequestService =
56-
new HttpRequestService(requestSender, executor, periodicRequestDelay, periodicRetryDelay);
57+
new HttpRequestService(
58+
requestSender,
59+
executor,
60+
periodicRequestDelay,
61+
periodicRetryDelay,
62+
RetryAfterParser.getInstance());
5763
}
5864

5965
@Test
@@ -186,6 +192,23 @@ void verifySendingRequest_whenThereIsATooManyRequestsError() {
186192

187193
verify(callback).onRequestFailed(new HttpErrorException(429, "Error message"));
188194
verify(executor).setPeriodicDelay(periodicRetryDelay);
195+
verify(periodicRetryDelay, never()).suggestDelay(any());
196+
}
197+
198+
@Test
199+
void verifySendingRequest_whenThereIsATooManyRequestsError_withSuggestedDelay() {
200+
HttpSender.Response response = mock();
201+
when(response.statusCode()).thenReturn(429);
202+
when(response.statusMessage()).thenReturn("Error message");
203+
when(response.getHeader("Retry-After")).thenReturn("5");
204+
prepareRequest();
205+
enqueueResponse(response);
206+
207+
httpRequestService.run();
208+
209+
verify(callback).onRequestFailed(new HttpErrorException(429, "Error message"));
210+
verify(executor).setPeriodicDelay(periodicRetryDelay);
211+
verify(periodicRetryDelay).suggestDelay(Duration.ofSeconds(5));
189212
}
190213

191214
@Test
@@ -241,6 +264,23 @@ void verifySendingRequest_whenThereIsAServiceUnavailableError() {
241264

242265
verify(callback).onRequestFailed(new HttpErrorException(503, "Error message"));
243266
verify(executor).setPeriodicDelay(periodicRetryDelay);
267+
verify(periodicRetryDelay, never()).suggestDelay(any());
268+
}
269+
270+
@Test
271+
void verifySendingRequest_whenThereIsAServiceUnavailableError_withSuggestedDelay() {
272+
HttpSender.Response response = mock();
273+
when(response.getHeader("Retry-After")).thenReturn("2");
274+
when(response.statusCode()).thenReturn(503);
275+
when(response.statusMessage()).thenReturn("Error message");
276+
prepareRequest();
277+
enqueueResponse(response);
278+
279+
httpRequestService.run();
280+
281+
verify(callback).onRequestFailed(new HttpErrorException(503, "Error message"));
282+
verify(executor).setPeriodicDelay(periodicRetryDelay);
283+
verify(periodicRetryDelay).suggestDelay(Duration.ofSeconds(2));
244284
}
245285

246286
@Test

0 commit comments

Comments
 (0)