mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
Grab Stats
This commit is contained in:
@@ -30,6 +30,21 @@ function getTotalRequestsData(indexerStats) {
|
||||
return data;
|
||||
}
|
||||
|
||||
function getNumberGrabsData(indexerStats) {
|
||||
const data = indexerStats.map((indexer) => {
|
||||
return {
|
||||
label: indexer.indexerName,
|
||||
value: indexer.numberOfGrabs
|
||||
};
|
||||
});
|
||||
|
||||
data.sort((a, b) => {
|
||||
return b.value - a.value;
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function Stats(props) {
|
||||
const {
|
||||
items,
|
||||
@@ -70,6 +85,12 @@ function Stats(props) {
|
||||
title='Total Indexer Queries'
|
||||
/>
|
||||
</div>
|
||||
<div className={styles.halfWidthChart}>
|
||||
<BarChart
|
||||
data={getNumberGrabsData(items)}
|
||||
title='Total Indexer Grabs'
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</PageContent>
|
||||
|
@@ -111,6 +111,7 @@ namespace NzbDrone.Core.History
|
||||
};
|
||||
|
||||
history.Data.Add("Successful", message.Successful.ToString());
|
||||
history.Data.Add("Source", message.Source ?? string.Empty);
|
||||
|
||||
_historyRepository.Insert(history);
|
||||
}
|
||||
|
@@ -8,5 +8,6 @@ namespace NzbDrone.Core.IndexerStats
|
||||
public string IndexerName { get; set; }
|
||||
public int AverageResponseTime { get; set; }
|
||||
public int NumberOfQueries { get; set; }
|
||||
public int NumberOfGrabs { get; set; }
|
||||
}
|
||||
}
|
||||
|
@@ -48,7 +48,8 @@ namespace NzbDrone.Core.IndexerStats
|
||||
private SqlBuilder Builder() => new SqlBuilder()
|
||||
.Select(@"Indexers.Id AS IndexerId,
|
||||
Indexers.Name AS IndexerName,
|
||||
COUNT(History.Id) AS NumberOfQueries,
|
||||
SUM(CASE WHEN EventType == 2 then 1 else 0 end) AS NumberOfQueries,
|
||||
SUM(CASE WHEN EventType == 1 then 1 else 0 end) AS NumberOfGrabs,
|
||||
AVG(json_extract(History.Data,'$.elapsedTime')) AS AverageResponseTime")
|
||||
.Join<History.History, IndexerDefinition>((t, r) => t.IndexerId == r.Id)
|
||||
.GroupBy<IndexerDefinition>(x => x.Id);
|
||||
|
@@ -13,7 +13,7 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
public interface IDownloadService
|
||||
{
|
||||
byte[] DownloadReport(string link, int indexerId);
|
||||
byte[] DownloadReport(string link, int indexerId, string source);
|
||||
}
|
||||
|
||||
public class DownloadService : IDownloadService
|
||||
@@ -37,7 +37,7 @@ namespace NzbDrone.Core.Indexers
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public byte[] DownloadReport(string link, int indexerId)
|
||||
public byte[] DownloadReport(string link, int indexerId, string source)
|
||||
{
|
||||
var url = new HttpUri(link);
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace NzbDrone.Core.Indexers
|
||||
}
|
||||
|
||||
var indexer = _indexerFactory.GetInstance(_indexerFactory.Get(indexerId));
|
||||
bool success;
|
||||
var success = false;
|
||||
var downloadedBytes = Array.Empty<byte>();
|
||||
|
||||
try
|
||||
@@ -60,7 +60,7 @@ namespace NzbDrone.Core.Indexers
|
||||
catch (ReleaseUnavailableException)
|
||||
{
|
||||
_logger.Trace("Release {0} no longer available on indexer.", link);
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, false));
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source));
|
||||
throw;
|
||||
}
|
||||
catch (ReleaseDownloadException ex)
|
||||
@@ -75,11 +75,11 @@ namespace NzbDrone.Core.Indexers
|
||||
_indexerStatusService.RecordFailure(indexerId);
|
||||
}
|
||||
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, false));
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source));
|
||||
throw;
|
||||
}
|
||||
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success));
|
||||
_eventAggregator.PublishEvent(new IndexerDownloadEvent(indexerId, success, source));
|
||||
return downloadedBytes;
|
||||
}
|
||||
}
|
||||
|
@@ -11,11 +11,13 @@ namespace NzbDrone.Core.Indexers.Events
|
||||
{
|
||||
public int IndexerId { get; set; }
|
||||
public bool Successful { get; set; }
|
||||
public string Source { get; set; }
|
||||
|
||||
public IndexerDownloadEvent(int indexerId, bool successful)
|
||||
public IndexerDownloadEvent(int indexerId, bool successful, string source)
|
||||
{
|
||||
IndexerId = indexerId;
|
||||
Successful = successful;
|
||||
Source = source;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using Nancy;
|
||||
using Nancy.ModelBinding;
|
||||
@@ -115,8 +116,10 @@ namespace Prowlarr.Api.V1.Indexers
|
||||
|
||||
var indexerInstance = _indexerFactory.GetInstance(indexer);
|
||||
|
||||
var source = UserAgentParser.ParseSource(Request.Headers.UserAgent);
|
||||
|
||||
var downloadBytes = Array.Empty<byte>();
|
||||
downloadBytes = _downloadService.DownloadReport(_downloadMappingService.ConvertToNormalLink(link), id);
|
||||
downloadBytes = _downloadService.DownloadReport(_downloadMappingService.ConvertToNormalLink(link), id, source);
|
||||
|
||||
// handle magnet URLs
|
||||
if (downloadBytes.Length >= 7
|
||||
|
@@ -11,6 +11,7 @@ namespace Prowlarr.Api.V1.Indexers
|
||||
public string IndexerName { get; set; }
|
||||
public int NumberOfQueries { get; set; }
|
||||
public int AverageResponseTime { get; set; }
|
||||
public int NumberOfGrabs { get; set; }
|
||||
}
|
||||
|
||||
public static class IndexerStatsResourceMapper
|
||||
@@ -27,7 +28,8 @@ namespace Prowlarr.Api.V1.Indexers
|
||||
IndexerId = model.IndexerId,
|
||||
IndexerName = model.IndexerName,
|
||||
NumberOfQueries = model.NumberOfQueries,
|
||||
AverageResponseTime = model.AverageResponseTime
|
||||
AverageResponseTime = model.AverageResponseTime,
|
||||
NumberOfGrabs = model.NumberOfGrabs
|
||||
};
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user