formatRetryTraceLine function

String formatRetryTraceLine({
  1. required RetryBudgetClass budget,
  2. required int attempt,
  3. required int cap,
  4. required RetryBackoffDecision decision,
})

The retry trace line format contract (issue #1398 AC4): every retry names the budget it drew from, the attempt (n/cap, 1-based), and the delay source with its value.

  • budget=connection attempt=2/4 delay=ladder:10s
  • budget=stream attempt=1/3 delay=server:12s
  • budget=stream attempt=2/3 delay=clamp:60s (server advertised 300s)
  • a malformed header appends retry-after malformed ("soon") (E3).

Implementation

String formatRetryTraceLine({
  required RetryBudgetClass budget,
  required int attempt,
  required int cap,
  required RetryBackoffDecision decision,
}) {
  final buffer = StringBuffer(
    'budget=${budget.label} attempt=$attempt/$cap '
    'delay=${decision.source.label}:${_traceDuration(decision.delay)}',
  );
  if (decision.source == RetryDelaySource.clamp) {
    buffer.write(
      ' (server advertised ${_traceDuration(decision.advertised!)})',
    );
  }
  if (decision.malformedHeader) {
    buffer.write(' retry-after malformed ("${decision.rawHeader}")');
  }
  return buffer.toString();
}