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