MetricTimer.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. // Every 5 seconds (or superseding interval) we connect to graphite
  35. // and poll the hardware. It may be inefficient to open a new connection
  36. // every 5 seconds, and there are ways to optimize this, but opening a
  37. // new connection is the easiest way to ensure that previous failures
  38. // don't affect future results
  39. var stopwatch = Stopwatch.StartNew();
  40. var sensors = _collector.ReadAllSensors().ToList();
  41. await _writer.ReportMetrics(e.SignalTime, sensors);
  42. Logger.Info($"Sent {sensors.Count} metrics in {stopwatch.Elapsed.TotalMilliseconds}ms");
  43. }
  44. catch (Exception ex)
  45. {
  46. Logger.Error(ex, "Unable to send metrics");
  47. }
  48. }
  49. public void Dispose()
  50. {
  51. Logger.LogAction("stopping metric timer", () =>
  52. {
  53. _collector?.Dispose();
  54. _timer?.Dispose();
  55. });
  56. }
  57. }
  58. }