Fixed: Indexer failures not logged to history

This commit is contained in:
Qstick
2021-05-16 23:21:29 -04:00
parent 4cc52c415c
commit 5cb13e69d7
10 changed files with 38 additions and 25 deletions

View File

@@ -68,6 +68,10 @@ namespace NzbDrone.Common.Http.Dispatchers
HttpWebResponse httpWebResponse; HttpWebResponse httpWebResponse;
var sw = new Stopwatch();
sw.Start();
try try
{ {
if (request.ContentData != null) if (request.ContentData != null)
@@ -144,7 +148,9 @@ namespace NzbDrone.Common.Http.Dispatchers
} }
} }
return new HttpResponse(request, new HttpHeader(httpWebResponse.Headers), httpWebResponse.Cookies, data, httpWebResponse.StatusCode); sw.Stop();
return new HttpResponse(request, new HttpHeader(httpWebResponse.Headers), httpWebResponse.Cookies, data, sw.ElapsedMilliseconds, httpWebResponse.StatusCode);
} }
public async Task DownloadFileAsync(string url, string fileName) public async Task DownloadFileAsync(string url, string fileName)

View File

@@ -11,16 +11,17 @@ namespace NzbDrone.Common.Http
{ {
private static readonly Regex RegexSetCookie = new Regex("^(.*?)=(.*?)(?:;|$)", RegexOptions.Compiled); private static readonly Regex RegexSetCookie = new Regex("^(.*?)=(.*?)(?:;|$)", RegexOptions.Compiled);
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, HttpStatusCode statusCode = HttpStatusCode.OK) public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, byte[] binaryData, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK)
{ {
Request = request; Request = request;
Headers = headers; Headers = headers;
Cookies = cookies; Cookies = cookies;
ResponseData = binaryData; ResponseData = binaryData;
StatusCode = statusCode; StatusCode = statusCode;
ElapsedTime = elapsedTime;
} }
public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, string content, HttpStatusCode statusCode = HttpStatusCode.OK) public HttpResponse(HttpRequest request, HttpHeader headers, CookieCollection cookies, string content, long elapsedTime = 0, HttpStatusCode statusCode = HttpStatusCode.OK)
{ {
Request = request; Request = request;
Headers = headers; Headers = headers;
@@ -28,12 +29,14 @@ namespace NzbDrone.Common.Http
ResponseData = Headers.GetEncodingFromContentType().GetBytes(content); ResponseData = Headers.GetEncodingFromContentType().GetBytes(content);
_content = content; _content = content;
StatusCode = statusCode; StatusCode = statusCode;
ElapsedTime = elapsedTime;
} }
public HttpRequest Request { get; private set; } public HttpRequest Request { get; private set; }
public HttpHeader Headers { get; private set; } public HttpHeader Headers { get; private set; }
public CookieCollection Cookies { get; private set; } public CookieCollection Cookies { get; private set; }
public HttpStatusCode StatusCode { get; private set; } public HttpStatusCode StatusCode { get; private set; }
public long ElapsedTime { get; private set; }
public byte[] ResponseData { get; private set; } public byte[] ResponseData { get; private set; }
private string _content; private string _content;
@@ -93,7 +96,7 @@ namespace NzbDrone.Common.Http
where T : new() where T : new()
{ {
public HttpResponse(HttpResponse response) public HttpResponse(HttpResponse response)
: base(response.Request, response.Headers, response.Cookies, response.ResponseData, response.StatusCode) : base(response.Request, response.Headers, response.Cookies, response.ResponseData, response.ElapsedTime, response.StatusCode)
{ {
Resource = Json.Deserialize<T>(response.Content); Resource = Json.Deserialize<T>(response.Content);
} }

View File

@@ -167,7 +167,7 @@ namespace NzbDrone.Core.IndexerSearch
foreach (var query in indexerReports.Queries) foreach (var query in indexerReports.Queries)
{ {
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, query.ElapsedTime, true, indexerReports.Releases.Count())); _eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, query.ElapsedTime, query.StatusCode == 200, indexerReports.Releases.Count()));
} }
return indexerReports.Releases; return indexerReports.Releases;

View File

@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Indexers.BroadcastheNet
case HttpStatusCode.NotFound: case HttpStatusCode.NotFound:
throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed."); throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed.");
case HttpStatusCode.ServiceUnavailable: case HttpStatusCode.ServiceUnavailable:
throw new RequestLimitReachedException("Cannot do more than 150 API requests per hour."); throw new RequestLimitReachedException(indexerResponse, "Cannot do more than 150 API requests per hour.");
default: default:
if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK)
{ {

View File

@@ -46,7 +46,7 @@ namespace NzbDrone.Core.Indexers.Headphones
if (errorMessage == "Request limit reached") if (errorMessage == "Request limit reached")
{ {
throw new RequestLimitReachedException("API limit reached"); throw new RequestLimitReachedException(indexerResponse, "API limit reached");
} }
throw new NewznabException(indexerResponse, errorMessage); throw new NewznabException(indexerResponse, errorMessage);

View File

@@ -45,7 +45,7 @@ namespace NzbDrone.Core.Indexers.Newznab
if (errorMessage == "Request limit reached") if (errorMessage == "Request limit reached")
{ {
throw new RequestLimitReachedException("API limit reached"); throw new RequestLimitReachedException(indexerResponse, "API limit reached");
} }
throw new NewznabException(indexerResponse, errorMessage); throw new NewznabException(indexerResponse, errorMessage);

View File

@@ -42,7 +42,7 @@ namespace NzbDrone.Core.Indexers.Torznab
if (errorMessage == "Request limit reached") if (errorMessage == "Request limit reached")
{ {
throw new RequestLimitReachedException("API limit reached"); throw new RequestLimitReachedException(indexerResponse, "API limit reached");
} }
throw new TorznabException("Torznab error detected: {0}", errorMessage); throw new TorznabException("Torznab error detected: {0}", errorMessage);

View File

@@ -1,17 +1,23 @@
using NzbDrone.Common.Exceptions; using NzbDrone.Common.Exceptions;
namespace NzbDrone.Core.Indexers.Exceptions namespace NzbDrone.Core.Indexers.Exceptions
{ {
public class RequestLimitReachedException : NzbDroneException public class RequestLimitReachedException : NzbDroneException
{ {
public RequestLimitReachedException(string message, params object[] args) private readonly IndexerResponse _indexerResponse;
public RequestLimitReachedException(IndexerResponse response, string message, params object[] args)
: base(message, args) : base(message, args)
{ {
_indexerResponse = response;
} }
public RequestLimitReachedException(string message) public RequestLimitReachedException(IndexerResponse response, string message)
: base(message) : base(message)
{ {
_indexerResponse = response;
} }
public IndexerResponse Response => _indexerResponse;
} }
} }

View File

@@ -302,6 +302,8 @@ namespace NzbDrone.Core.Indexers
} }
catch (TooManyRequestsException ex) catch (TooManyRequestsException ex)
{ {
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
if (ex.RetryAfter != TimeSpan.Zero) if (ex.RetryAfter != TimeSpan.Zero)
{ {
_indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter); _indexerStatusService.RecordFailure(Definition.Id, ex.RetryAfter);
@@ -315,11 +317,13 @@ namespace NzbDrone.Core.Indexers
} }
catch (HttpException ex) catch (HttpException ex)
{ {
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id); _indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn("{0} {1}", this, ex.Message); _logger.Warn("{0} {1}", this, ex.Message);
} }
catch (RequestLimitReachedException) catch (RequestLimitReachedException ex)
{ {
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.HttpResponse.ElapsedTime, StatusCode = (int)ex.Response.HttpResponse.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1)); _indexerStatusService.RecordFailure(Definition.Id, TimeSpan.FromHours(1));
_logger.Warn("API Request Limit reached for {0}", this); _logger.Warn("API Request Limit reached for {0}", this);
} }
@@ -330,6 +334,7 @@ namespace NzbDrone.Core.Indexers
} }
catch (CloudFlareCaptchaException ex) catch (CloudFlareCaptchaException ex)
{ {
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.ElapsedTime, StatusCode = (int)ex.Response.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id); _indexerStatusService.RecordFailure(Definition.Id);
ex.WithData("FeedUrl", url); ex.WithData("FeedUrl", url);
if (ex.IsExpired) if (ex.IsExpired)
@@ -343,6 +348,7 @@ namespace NzbDrone.Core.Indexers
} }
catch (IndexerException ex) catch (IndexerException ex)
{ {
result.Queries.Add(new IndexerQueryResult { ElapsedTime = ex.Response.HttpResponse.ElapsedTime, StatusCode = (int)ex.Response.HttpResponse.StatusCode });
_indexerStatusService.RecordFailure(Definition.Id); _indexerStatusService.RecordFailure(Definition.Id);
_logger.Warn(ex, "{0}", url); _logger.Warn(ex, "{0}", url);
} }
@@ -384,7 +390,7 @@ namespace NzbDrone.Core.Indexers
return new IndexerQueryResult return new IndexerQueryResult
{ {
Releases = releases, Releases = releases,
ElapsedTime = response.ElapsedTime, ElapsedTime = response.HttpResponse.ElapsedTime,
StatusCode = (int)response.HttpResponse.StatusCode StatusCode = (int)response.HttpResponse.StatusCode
}; };
} }
@@ -450,13 +456,9 @@ namespace NzbDrone.Core.Indexers
} }
} }
var stopWatch = Stopwatch.StartNew();
request.HttpRequest.SuppressHttpError = true; request.HttpRequest.SuppressHttpError = true;
var response = await _httpClient.ExecuteAsync(request.HttpRequest); var response = await _httpClient.ExecuteAsync(request.HttpRequest);
stopWatch.Stop();
// Check reponse to see if auth is needed, if needed try again // Check reponse to see if auth is needed, if needed try again
if (CheckIfLoginNeeded(response)) if (CheckIfLoginNeeded(response))
{ {
@@ -486,16 +488,14 @@ namespace NzbDrone.Core.Indexers
UpdateCookies(Cookies, DateTime.Now + TimeSpan.FromDays(30)); UpdateCookies(Cookies, DateTime.Now + TimeSpan.FromDays(30));
return new IndexerResponse(request, response, stopWatch.ElapsedMilliseconds); return new IndexerResponse(request, response);
} }
protected async Task<HttpResponse> ExecuteAuth(HttpRequest request) protected async Task<HttpResponse> ExecuteAuth(HttpRequest request)
{ {
var stopWatch = Stopwatch.StartNew();
var response = await _httpClient.ExecuteAsync(request); var response = await _httpClient.ExecuteAsync(request);
stopWatch.Stop();
_eventAggregator.PublishEvent(new IndexerAuthEvent(Definition.Id, !response.HasHttpError, stopWatch.ElapsedMilliseconds)); _eventAggregator.PublishEvent(new IndexerAuthEvent(Definition.Id, !response.HasHttpError, response.ElapsedTime));
return response; return response;
} }

View File

@@ -7,11 +7,10 @@ namespace NzbDrone.Core.Indexers
private readonly IndexerRequest _indexerRequest; private readonly IndexerRequest _indexerRequest;
private readonly HttpResponse _httpResponse; private readonly HttpResponse _httpResponse;
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse, long elapsedTime = 0) public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse)
{ {
_indexerRequest = indexerRequest; _indexerRequest = indexerRequest;
_httpResponse = httpResponse; _httpResponse = httpResponse;
ElapsedTime = elapsedTime;
} }
public IndexerRequest Request => _indexerRequest; public IndexerRequest Request => _indexerRequest;
@@ -21,6 +20,5 @@ namespace NzbDrone.Core.Indexers
public HttpResponse HttpResponse => _httpResponse; public HttpResponse HttpResponse => _httpResponse;
public string Content => _httpResponse.Content; public string Content => _httpResponse.Content;
public long ElapsedTime { get; private set; }
} }
} }