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 SensorCollector _collector;
  12. private readonly Timer _timer;
  13. private readonly IWriteMetrics _writer;
  14. public MetricTimer(TimeSpan interval, SensorCollector 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.Open();
  26. _timer.Start();
  27. });
  28. }
  29. public void Stop()
  30. {
  31. Logger.LogAction("stopping metric timer", () =>
  32. {
  33. _collector.Close();
  34. _timer.Stop();
  35. });
  36. }
  37. private async void ReportMetrics(object sender, ElapsedEventArgs e)
  38. {
  39. Logger.Debug("Starting to report metrics");
  40. try
  41. {
  42. // Every 5 seconds (or superceding interval) we connect to graphite
  43. // and poll the hardware. It may be inefficient to open a new connection
  44. // every 5 seconds, and there are ways to optimize this, but opening a
  45. // new connection is the easiest way to ensure that previous failures
  46. // don't affect future results
  47. var stopwatch = Stopwatch.StartNew();
  48. var sensors = _collector.ReadAllSensors().ToList();
  49. await _writer.ReportMetrics(e.SignalTime, sensors);
  50. Logger.Info($"Sent {sensors.Count} metrics in {stopwatch.Elapsed.TotalMilliseconds}ms");
  51. }
  52. catch (Exception ex)
  53. {
  54. Logger.Error(ex, "Unable to send metrics");
  55. }
  56. }
  57. }
  58. }