Skip to content

Commit f1577c0

Browse files
committed
fix: retry jitter
1 parent 767eedc commit f1577c0

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

experimental/packages/otlp-exporter-base/src/retryable-transport.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ const MAX_ATTEMPTS = 5;
2121
const INITIAL_BACKOFF = 1000;
2222
const MAX_BACKOFF = 5000;
2323
const BACKOFF_MULTIPLIER = 1.5;
24+
const JITTER = 0.2;
25+
26+
/**
27+
* Get a pseudo-random jitter that falls in the range of [-JITTER, +JITTER]
28+
*/
29+
function getJitter() {
30+
return Math.random() * (2 * JITTER) - JITTER;
31+
}
2432

2533
class RetryingTransport implements IExporterTransport {
2634
constructor(private _transport: IExporterTransport) {}
@@ -38,11 +46,9 @@ class RetryingTransport implements IExporterTransport {
3846
let attempts = MAX_ATTEMPTS;
3947
let nextBackoff = INITIAL_BACKOFF;
4048

41-
// TODO: I'm not 100% sure this is correct, please review in-depth.
4249
while (result.status === 'retryable' && attempts > 0) {
4350
attempts--;
44-
const upperBound = Math.min(nextBackoff, MAX_BACKOFF);
45-
const backoff = Math.random() * upperBound;
51+
const backoff = Math.min(nextBackoff, MAX_BACKOFF) + getJitter();
4652
nextBackoff = nextBackoff * BACKOFF_MULTIPLIER;
4753
result = await this.retry(data, result.retryInMillis ?? backoff);
4854
}

experimental/packages/otlp-exporter-base/test/common/retrying-transport.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ describe('RetryingTransport', function () {
152152

153153
it('does retry 5 times, then resolves as retryable', async function () {
154154
// arrange
155-
// make random return low values so that it does not actually need to wait long for the backoff.
156-
Math.random = sinon.stub().returns(0.001);
155+
// make random return a negative value so that what's passed to setTimeout() is negative and therefore gets executed immediately.
156+
Math.random = sinon.stub().returns(-Infinity);
157157

158158
const retryResponse: ExportResponse = {
159159
status: 'retryable',

0 commit comments

Comments
 (0)