1
0

MetricTimer.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using System.Timers;
  5. using NLog;
  6. namespace OhmGraphite
  7. {
  8. public class MetricTimer : IManage
  9. {
  10. private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
  11. private readonly IGiveSensors _collector;
  12. private readonly Timer _timer;
  13. private readonly IWriteMetrics _writer;
  14. public MetricTimer(TimeSpan interval, IGiveSensors collector, IWriteMetrics writer)
  15. {
  16. _timer = new Timer(interval.TotalMilliseconds) { AutoReset = true };
  17. _timer.Elapsed += ReportMetrics;
  18. _collector = collector;
  19. _writer = writer;
  20. }
  21. public void Start()
  22. {
  23. Logger.LogAction("starting metric timer", () =>
  24. {
  25. _collector.Start();
  26. _timer.Start();
  27. });
  28. }
  29. private async void ReportMetrics(object sender, ElapsedEventArgs e)
  30. {
  31. Logger.Debug("Starting to report metrics");
  32. try
  33. {
  34. // Read all the sensors into a list so that they are only polled once.
  35. // Polling sensors can be relatively expensive so the intermediate
  36. // list cuts down on the number of potential updates.
  37. var stopwatch = Stopwatch.StartNew();
  38. var sensors = _collector.ReadAllSensors().ToList();
  39. await _writer.ReportMetrics(e.SignalTime, sensors);
  40. Logger.Info($"Sent {sensors.Count} metrics in {stopwatch.Elapsed.TotalMilliseconds}ms");
  41. }
  42. catch (Exception ex)
  43. {
  44. Logger.Error(ex, "Unable to send metrics");
  45. }
  46. }
  47. public void Dispose()
  48. {
  49. Logger.LogAction("stopping metric timer", () =>
  50. {
  51. _writer?.Dispose();
  52. _collector?.Dispose();
  53. _timer?.Dispose();
  54. });
  55. }
  56. }
  57. }