From 2bc6d2834cd25bd9b1ae3073f051e4f637f4b93b Mon Sep 17 00:00:00 2001 From: Bogdan Date: Thu, 29 Feb 2024 01:11:02 +0200 Subject: [PATCH] ui: add elapsed time per indexer (#15100) --- src/Jackett.Common/Content/index.html | 11 ++++++---- src/Jackett.Common/Indexers/BaseIndexer.cs | 20 +++++++++++++------ src/Jackett.Common/Indexers/IIndexer.cs | 4 +++- .../Indexers/Meta/BaseMetaIndexer.cs | 12 +++++++++-- .../Models/DTO/ManualSearchResult.cs | 2 ++ .../Controllers/ResultsController.cs | 3 +++ 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/Jackett.Common/Content/index.html b/src/Jackett.Common/Content/index.html index e95148c47..670c15fee 100644 --- a/src/Jackett.Common/Content/index.html +++ b/src/Jackett.Common/Content/index.html @@ -580,9 +580,12 @@ > {{Name}} {{#if Error}} - (Error) - {{~else~}} - ({{~Results~}}) + (Error) + {{~else~}} + ({{~Results~}}) + {{#if ElapsedTime}} + [{{~ElapsedTime~}}ms] + {{~/if~}} {{~/if~}} {{~#if @last~}} . @@ -782,6 +785,6 @@ - + diff --git a/src/Jackett.Common/Indexers/BaseIndexer.cs b/src/Jackett.Common/Indexers/BaseIndexer.cs index 2402ef5bb..2cd860294 100644 --- a/src/Jackett.Common/Indexers/BaseIndexer.cs +++ b/src/Jackett.Common/Indexers/BaseIndexer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -323,27 +324,34 @@ namespace Jackett.Common.Indexers var queryCopy = query.Clone(); if (!CanHandleQuery(queryCopy) || !CanHandleCategories(queryCopy, isMetaIndexer)) - return new IndexerResult(this, Array.Empty(), false); + return new IndexerResult(this, Array.Empty(), 0, false); if (!SupportsPagination && queryCopy.Offset > 0) - return new IndexerResult(this, Array.Empty(), false); + return new IndexerResult(this, Array.Empty(), 0, false); if (queryCopy.Cache) { var cachedReleases = cacheService.Search(this, queryCopy); if (cachedReleases != null) - return new IndexerResult(this, cachedReleases, true); + return new IndexerResult(this, cachedReleases, 0, true); } try { + var sw = new Stopwatch(); + + sw.Start(); + var results = await PerformQuery(queryCopy); - results = FilterResults(queryCopy, results); - results = FixResults(queryCopy, results); + + sw.Stop(); + + results = FilterResults(queryCopy, results).ToList(); + results = FixResults(queryCopy, results).ToList(); cacheService.CacheResults(this, queryCopy, results.ToList()); errorCount = 0; expireAt = DateTime.Now.Add(HealthyStatusValidity); - return new IndexerResult(this, results, false); + return new IndexerResult(this, results, sw.ElapsedMilliseconds, false); } catch (TooManyRequestsException ex) { diff --git a/src/Jackett.Common/Indexers/IIndexer.cs b/src/Jackett.Common/Indexers/IIndexer.cs index 3553f00f6..38fe8771c 100644 --- a/src/Jackett.Common/Indexers/IIndexer.cs +++ b/src/Jackett.Common/Indexers/IIndexer.cs @@ -13,12 +13,14 @@ namespace Jackett.Common.Indexers { public IIndexer Indexer { get; set; } public IEnumerable Releases { get; set; } + public long ElapsedTime { get; set; } public bool IsFromCache; - public IndexerResult(IIndexer indexer, IEnumerable releases, bool isFromCache) + public IndexerResult(IIndexer indexer, IEnumerable releases, long elapsedTime, bool isFromCache) { Indexer = indexer; Releases = releases; + ElapsedTime = elapsedTime; IsFromCache = isFromCache; } } diff --git a/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs b/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs index 8b6ca7b8a..e686978c4 100644 --- a/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs +++ b/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Jackett.Common.Models; @@ -48,14 +49,21 @@ namespace Jackett.Common.Indexers.Meta query = query.Clone(); if (query.Offset > 0 || !CanHandleQuery(query) || !CanHandleCategories(query, true)) - return new IndexerResult(this, Array.Empty(), false); + return new IndexerResult(this, Array.Empty(), 0, false); try { + var sw = new Stopwatch(); + + sw.Start(); + var results = await PerformQuery(query); + + sw.Stop(); + // the results are already filtered and fixed by each indexer // some results may come from cache, but we can't inform without refactor the code - return new IndexerResult(this, results, false); + return new IndexerResult(this, results, sw.ElapsedMilliseconds, false); } catch (Exception ex) { diff --git a/src/Jackett.Common/Models/DTO/ManualSearchResult.cs b/src/Jackett.Common/Models/DTO/ManualSearchResult.cs index a4bed6a1b..3b52f21de 100644 --- a/src/Jackett.Common/Models/DTO/ManualSearchResult.cs +++ b/src/Jackett.Common/Models/DTO/ManualSearchResult.cs @@ -19,6 +19,8 @@ namespace Jackett.Common.Models.DTO public int Results { get; set; } [DataMember] public string Error { get; set; } + [DataMember] + public long ElapsedTime { get; set; } } [DataContract] diff --git a/src/Jackett.Server/Controllers/ResultsController.cs b/src/Jackett.Server/Controllers/ResultsController.cs index 11de03170..69dd307d8 100644 --- a/src/Jackett.Server/Controllers/ResultsController.cs +++ b/src/Jackett.Server/Controllers/ResultsController.cs @@ -272,6 +272,7 @@ namespace Jackett.Server.Controllers { resultIndexer.Status = ManualSearchResultIndexerStatus.OK; resultIndexer.Results = t.Result.Releases.Count(); + resultIndexer.ElapsedTime = t.Result.ElapsedTime; resultIndexer.Error = null; indexer = t.Result.Indexer; } @@ -279,6 +280,7 @@ namespace Jackett.Server.Controllers { resultIndexer.Status = ManualSearchResultIndexerStatus.Error; resultIndexer.Results = 0; + resultIndexer.ElapsedTime = 0; resultIndexer.Error = ((IndexerException)t.Exception.InnerException).ToString(); indexer = ((IndexerException)t.Exception.InnerException).Indexer; } @@ -286,6 +288,7 @@ namespace Jackett.Server.Controllers { resultIndexer.Status = ManualSearchResultIndexerStatus.Unknown; resultIndexer.Results = 0; + resultIndexer.ElapsedTime = 0; resultIndexer.Error = null; }