diff --git a/src/dotnet/APIView/APIViewWeb/Repositories/DevopsArtifactRepository.cs b/src/dotnet/APIView/APIViewWeb/Repositories/DevopsArtifactRepository.cs index 54f622098d3..9a28cc311c0 100644 --- a/src/dotnet/APIView/APIViewWeb/Repositories/DevopsArtifactRepository.cs +++ b/src/dotnet/APIView/APIViewWeb/Repositories/DevopsArtifactRepository.cs @@ -66,6 +66,24 @@ public async Task DownloadPackageArtifact(string repoName, string buildI private async Task GetFromDevopsAsync(string request) { var downloadResp = await _devopsClient.GetAsync(request); + + + if (!downloadResp.IsSuccessStatusCode) + { + var retryAfter = downloadResp.Headers.GetValues("Retry-After"); + var rateLimitResource = downloadResp.Headers.GetValues("X-RateLimit-Resource"); + var rateLimitDelay = downloadResp.Headers.GetValues("X-RateLimit-Delay"); + var rateLimitLimit = downloadResp.Headers .GetValues("X-RateLimit-Limit"); + var rateLimitRemaining = downloadResp.Headers.GetValues("X-RateLimit-Remaining"); + var rateLimitReset = downloadResp.Headers.GetValues("X-RateLimit-Reset"); + + var traceMessage = $"request: {request} failed with statusCode: {downloadResp.StatusCode}," + + $"retryAfter: {retryAfter}, rateLimitResource: {rateLimitResource}, rateLimitDelay: {rateLimitDelay}," + + $"rateLimitLimit: {rateLimitLimit}, rateLimitRemaining: {rateLimitRemaining}, rateLimitReset: {rateLimitReset}"; + + _telemetryClient.TrackTrace(traceMessage); + } + int count = 0; int[] waitTimes = new int[] { 0, 1, 2, 4, 8, 16, 32, 64, 128, 256 }; while ((downloadResp.StatusCode == HttpStatusCode.TooManyRequests || downloadResp.StatusCode == HttpStatusCode.BadRequest) && count < waitTimes.Length)