mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
WIP metrics reports
This commit is contained in:
parent
cbb374af26
commit
371d23852b
@ -60,6 +60,7 @@ internal class Program
|
|||||||
services.AddSingleton<IVerb, ValidateLists>();
|
services.AddSingleton<IVerb, ValidateLists>();
|
||||||
services.AddSingleton<IVerb, DownloadCef>();
|
services.AddSingleton<IVerb, DownloadCef>();
|
||||||
services.AddSingleton<IVerb, DownloadUrl>();
|
services.AddSingleton<IVerb, DownloadUrl>();
|
||||||
|
services.AddSingleton<IVerb, GenerateMetricsReports>();
|
||||||
}).Build();
|
}).Build();
|
||||||
|
|
||||||
var service = host.Services.GetService<CommandLineBuilder>();
|
var service = host.Services.GetService<CommandLineBuilder>();
|
||||||
|
58
Wabbajack.CLI/Verbs/GenerateMetricsReports.cs
Normal file
58
Wabbajack.CLI/Verbs/GenerateMetricsReports.cs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.CommandLine;
|
||||||
|
using System.CommandLine.Invocation;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Wabbajack.Common;
|
||||||
|
using Wabbajack.DTOs.JsonConverters;
|
||||||
|
using Wabbajack.DTOs.ServerResponses;
|
||||||
|
using Wabbajack.Paths;
|
||||||
|
|
||||||
|
namespace Wabbajack.CLI.Verbs;
|
||||||
|
|
||||||
|
public class GenerateMetricsReports : IVerb
|
||||||
|
{
|
||||||
|
private readonly HttpClient _client;
|
||||||
|
private readonly DTOSerializer _dtos;
|
||||||
|
|
||||||
|
public GenerateMetricsReports(HttpClient client, DTOSerializer dtos)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_dtos = dtos;
|
||||||
|
}
|
||||||
|
public Command MakeCommand()
|
||||||
|
{
|
||||||
|
var command = new Command("generate-metrics-report");
|
||||||
|
command.Add(new Option<AbsolutePath>(new[] {"-o", "-output"}, "Output folder"));
|
||||||
|
command.Description = "Generates usage metrics and outputs a html report about them";
|
||||||
|
command.Handler = CommandHandler.Create(Run);
|
||||||
|
return command;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<int> Run(AbsolutePath output)
|
||||||
|
{
|
||||||
|
var subjects = await GetMetrics("one day ago", "now", "finish_install")
|
||||||
|
.Select(async d => d.GroupingSubject)
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async IAsyncEnumerable<MetricResult> GetMetrics(string start, string end, string action)
|
||||||
|
{
|
||||||
|
await using var response = await _client.GetStreamAsync(new Uri($"https://build.wabbajack.org/metrics/report?action={action}&from={start}&end={end}"));
|
||||||
|
|
||||||
|
var sr = new StreamReader(response, leaveOpen: false);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var line = await sr.ReadLineAsync();
|
||||||
|
if (line == null) break;
|
||||||
|
yield return _dtos.Deserialize<MetricResult>(line)!;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
Wabbajack.DTOs/ServerResponses/MetricResponse.cs
Normal file
14
Wabbajack.DTOs/ServerResponses/MetricResponse.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Wabbajack.DTOs.ServerResponses;
|
||||||
|
|
||||||
|
|
||||||
|
public class MetricResult
|
||||||
|
{
|
||||||
|
public string Action { get; set; }
|
||||||
|
public string Subject { get; set; }
|
||||||
|
public string GroupingSubject { get; set; }
|
||||||
|
public long MetricKey { get; set; }
|
||||||
|
public string UserAgent { get; set; }
|
||||||
|
public DateTime Timestamp { get; set; }
|
||||||
|
}
|
@ -64,20 +64,20 @@ public class MetricsController : ControllerBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("{subject}/{value}")]
|
[Route("{action}/{subject}")]
|
||||||
public async Task<Result> LogMetricAsync(string subject, string value)
|
public async Task<Result> LogMetricAsync(string action, string subject)
|
||||||
{
|
{
|
||||||
var date = DateTime.UtcNow;
|
var date = DateTime.UtcNow;
|
||||||
var metricsKey = Request.Headers[_settings.MetricsKeyHeader].FirstOrDefault();
|
var metricsKey = Request.Headers[_settings.MetricsKeyHeader].FirstOrDefault();
|
||||||
|
|
||||||
// Used in tests
|
// Used in tests
|
||||||
if (value is "Default" or "untitled" || subject == "failed_download" || Guid.TryParse(value, out _))
|
if (subject is "Default" or "untitled" || subject == "failed_download" || Guid.TryParse(subject, out _))
|
||||||
return new Result {Timestamp = date};
|
return new Result {Timestamp = date};
|
||||||
|
|
||||||
await _metricsStore.Ingest(new Metric
|
await _metricsStore.Ingest(new Metric
|
||||||
{
|
{
|
||||||
Timestamp = DateTime.UtcNow,
|
Timestamp = DateTime.UtcNow,
|
||||||
Action = subject,
|
Action = action,
|
||||||
Subject = subject,
|
Subject = subject,
|
||||||
MetricsKey = metricsKey,
|
MetricsKey = metricsKey,
|
||||||
UserAgent = Request.Headers.UserAgent.FirstOrDefault() ?? "<unknown>",
|
UserAgent = Request.Headers.UserAgent.FirstOrDefault() ?? "<unknown>",
|
||||||
|
@ -9,6 +9,7 @@ using Microsoft.Toolkit.HighPerformance;
|
|||||||
using Wabbajack.BuildServer;
|
using Wabbajack.BuildServer;
|
||||||
using Wabbajack.Common;
|
using Wabbajack.Common;
|
||||||
using Wabbajack.DTOs.JsonConverters;
|
using Wabbajack.DTOs.JsonConverters;
|
||||||
|
using Wabbajack.DTOs.ServerResponses;
|
||||||
using Wabbajack.Paths;
|
using Wabbajack.Paths;
|
||||||
using Wabbajack.Paths.IO;
|
using Wabbajack.Paths.IO;
|
||||||
using Wabbajack.Server.DTOs;
|
using Wabbajack.Server.DTOs;
|
||||||
@ -104,13 +105,4 @@ public class Metrics
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MetricResult
|
|
||||||
{
|
|
||||||
public string Action { get; set; }
|
|
||||||
public string Subject { get; set; }
|
|
||||||
public string GroupingSubject { get; set; }
|
|
||||||
public long MetricKey { get; set; }
|
|
||||||
public string UserAgent { get; set; }
|
|
||||||
public DateTime Timestamp { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user