MetricsDownloader.cs
1 using Logging; 2 using System.Globalization; 3 4 namespace MetricsPlugin 5 { 6 public class MetricsDownloader 7 { 8 private readonly ILog log; 9 10 public MetricsDownloader(ILog log) 11 { 12 this.log = log; 13 } 14 15 public LogFile? DownloadAllMetrics(string targetName, IMetricsAccess access) 16 { 17 var metrics = access.GetAllMetrics(); 18 if (metrics == null || metrics.Sets.Length == 0 || metrics.Sets.All(s => s.Values.Length == 0)) return null; 19 20 var headers = new[] { "timestamp" }.Concat(metrics.Sets.Select(s => s.Name)).ToArray(); 21 var map = CreateValueMap(metrics); 22 23 return WriteToFile(targetName, headers, map); 24 } 25 26 private LogFile WriteToFile(string nodeName, string[] headers, Dictionary<DateTime, List<string>> map) 27 { 28 var file = log.CreateSubfile("csv"); 29 log.Log($"Downloading metrics for {nodeName} to file {file.Filename}"); 30 31 file.Write(string.Join(",", headers)); 32 33 foreach (var pair in map) 34 { 35 file.Write(string.Join(",", new[] { FormatTimestamp(pair.Key) }.Concat(pair.Value))); 36 } 37 38 return file; 39 } 40 41 private Dictionary<DateTime, List<string>> CreateValueMap(Metrics metrics) 42 { 43 var map = CreateForAllTimestamps(metrics); 44 foreach (var metric in metrics.Sets) 45 { 46 AddToMap(map, metric); 47 } 48 return map; 49 50 } 51 52 private Dictionary<DateTime, List<string>> CreateForAllTimestamps(Metrics metrics) 53 { 54 var result = new Dictionary<DateTime, List<string>>(); 55 var timestamps = metrics.Sets.SelectMany(s => s.Values).Select(v => v.Timestamp).Distinct().ToArray(); 56 foreach (var timestamp in timestamps) result.Add(timestamp, new List<string>()); 57 return result; 58 } 59 60 private void AddToMap(Dictionary<DateTime, List<string>> map, MetricsSet metric) 61 { 62 foreach (var key in map.Keys) 63 { 64 map[key].Add(GetValueAtTimestamp(key, metric)); 65 } 66 } 67 68 private string GetValueAtTimestamp(DateTime key, MetricsSet metric) 69 { 70 var value = metric.Values.SingleOrDefault(v => v.Timestamp == key); 71 if (value == null) return ""; 72 return value.Value.ToString(CultureInfo.InvariantCulture); 73 } 74 75 private string FormatTimestamp(DateTime key) 76 { 77 var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 78 var diff = key - origin; 79 return Math.Floor(diff.TotalSeconds).ToString(CultureInfo.InvariantCulture); 80 } 81 } 82 }