/ ProjectPlugins / MetricsPlugin / MetricsDownloader.cs
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  }