using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using Nancy; using ReactiveUI; using Wabbajack.Common; namespace Wabbajack.CacheServer { /// /// Extremely /// public class Metrics : NancyModule { private static SemaphoreSlim _lockObject = new SemaphoreSlim(1); public static async Task Log(params object[] args) { var msg = new[] {string.Join("\t", args.Select(a => a.ToString()))}; Utils.Log(msg.First()); await _lockObject.WaitAsync(); try { File.AppendAllLines("stats.tsv", msg); } finally { _lockObject.Release(); } } public Metrics() : base("/") { Get("/metrics/{Action}/{Value}", HandleMetrics); Get("/metrics/chart/", HandleChart); Get("/metrics/chart/{Action}/", HandleChart); Get("/metrics/chart/{Action}/{Value}/", HandleChart); } private async Task HandleMetrics(dynamic arg) { var date = DateTime.UtcNow; await Log(date, arg.Action, arg.Value); return date.ToString(); } private static async Task GetData() { await _lockObject.WaitAsync(); try { return File.ReadAllLines("stats.tsv"); } finally { _lockObject.Release(); } } private async Task HandleChart(dynamic arg) { var data = (await GetData()).Select(line => line.Split('\t')) .Where(line => line.Length == 3) .Select(line => new {date = DateTime.Parse(line[0]), Action = line[1], Value = line[2]}); // Remove guids / Default, which come from testing data = data.Where(d => !Guid.TryParse(d.Value ?? "", out _) && (d.Value ?? "") != "Default"); if (arg?.Action != null) data = data.Where(d => d.Action == arg.Action); if (arg?.Value != null) data = data.Where(d => d.Value.StartsWith(arg.Value)); var grouped_and_counted = data.GroupBy(d => d.date.ToString("yyyy-MM-dd")) .OrderBy(d => d.Key) .Select(d => new {Day = d.Key, Count = d.Count()}) .ToList(); var sb = new StringBuilder(); sb.Append(""); sb.Append(""); sb.Append(""); sb.Append(""); var response = (Response)sb.ToString(); response.ContentType = "text/html"; return response; } } }