public void ShouldLogAtLeastOnceWhenMaxReqIsZero() { var duration = TimeSpan.FromMilliseconds(10); var sender = new RateLimiterZipkinSender(_underlyingSender.Object, 0, duration); sender.Send(_data); Thread.Sleep(TimeSpan.FromMilliseconds(duration.TotalMilliseconds * 10 * 1.05)); sender.Send(_data); _logger.Verify(logger => logger.LogWarning(It.IsAny <string>()), Times.AtLeastOnce()); }
public void SendsNothingWhenMaxReqIsZero() { var sender = new RateLimiterZipkinSender(_underlyingSender.Object, 0); sender.Send(_data); _underlyingSender.Verify(zipkinSender => zipkinSender.Send(It.Is <byte[]>(bytes => bytes == _data)), Times.Never()); }
public void RequestsAreNotThrottledIfMaxReqIsNotReached(int maxReq) { var sender = new RateLimiterZipkinSender(_underlyingSender.Object, maxReq, TimeSpan.FromSeconds(5)); for (var i = 0; i < maxReq + 1; i++) { sender.Send(_data); } _underlyingSender.Verify(zipkinSender => zipkinSender.Send(It.Is <byte[]>(bytes => bytes == _data)), Times.Exactly(maxReq)); }
public void ExcessiveRequestsAreThrottledOnLongTerm(int maxSendRequest, int perSpanMs, int numberOfSpan) { var perSpan = TimeSpan.FromMilliseconds(perSpanMs); var sender = new RateLimiterZipkinSender(_underlyingSender.Object, maxSendRequest, perSpan); var watch = Stopwatch.StartNew(); while (true) { if (watch.ElapsedMilliseconds >= perSpan.TotalMilliseconds * numberOfSpan) { break; } sender.Send(_data); } var tolerance = 1.5 / numberOfSpan + 1.05; var trueSendExpect = numberOfSpan * maxSendRequest; var sendExpectationWithBurstTolerance = (int)Math.Ceiling(trueSendExpect * tolerance); _underlyingSender.Verify(zipkinSender => zipkinSender.Send(It.Is <byte[]>(bytes => bytes == _data)), Times.AtMost(sendExpectationWithBurstTolerance)); }