1
0

Program.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using NLog;
  2. using LibreHardwareMonitor.Hardware;
  3. using Prometheus;
  4. using Topshelf;
  5. namespace OhmGraphite
  6. {
  7. internal class Program
  8. {
  9. private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
  10. private static void Main()
  11. {
  12. HostFactory.Run(x =>
  13. {
  14. x.Service<IManage>(s =>
  15. {
  16. // We'll want to capture all available hardware metrics
  17. // to send to graphite
  18. var computer = new Computer
  19. {
  20. IsGpuEnabled = true,
  21. IsMotherboardEnabled = true,
  22. IsCpuEnabled = true,
  23. IsMemoryEnabled = true,
  24. IsNetworkEnabled = true,
  25. IsStorageEnabled = true,
  26. IsControllerEnabled = true
  27. };
  28. var collector = new SensorCollector(computer);
  29. // We need to know where the graphite server lives and how often
  30. // to poll the hardware
  31. var config = Logger.LogFunction("parse config", () => MetricConfig.ParseAppSettings(new AppConfigManager()));
  32. var metricsManager = CreateManager(config, collector);
  33. s.ConstructUsing(name => metricsManager);
  34. s.WhenStarted(tc => tc.Start());
  35. s.WhenStopped(tc => tc.Dispose());
  36. });
  37. x.UseNLog();
  38. x.RunAsLocalSystem();
  39. x.SetDescription(
  40. "Extract hardware sensor data and exports it to a given host and port in a graphite compatible format");
  41. x.SetDisplayName("Ohm Graphite");
  42. x.SetServiceName("OhmGraphite");
  43. x.OnException(ex => Logger.Error(ex, "OhmGraphite TopShelf encountered an error"));
  44. });
  45. }
  46. private static IManage CreateManager(MetricConfig config, SensorCollector collector)
  47. {
  48. var hostname = config.LookupName();
  49. double seconds = config.Interval.TotalSeconds;
  50. if (config.Graphite != null)
  51. {
  52. Logger.Info(
  53. $"Graphite host: {config.Graphite.Host} port: {config.Graphite.Port} interval: {seconds} tags: {config.Graphite.Tags}");
  54. var writer = new GraphiteWriter(config.Graphite.Host,
  55. config.Graphite.Port,
  56. hostname,
  57. config.Graphite.Tags);
  58. return new MetricTimer(config.Interval, collector, writer);
  59. }
  60. else if (config.Prometheus != null)
  61. {
  62. Logger.Info($"Prometheus port: {config.Prometheus.Port}");
  63. var registry = PrometheusCollection.SetupDefault(collector);
  64. var server = new MetricServer(config.Prometheus.Host, config.Prometheus.Port, registry: registry);
  65. return new PrometheusServer(server, collector);
  66. }
  67. else if (config.Timescale != null)
  68. {
  69. var writer = new TimescaleWriter(config.Timescale.Connection, config.Timescale.SetupTable, hostname);
  70. return new MetricTimer(config.Interval, collector, writer);
  71. }
  72. else
  73. {
  74. Logger.Info($"Influxdb address: {config.Influx.Address} db: {config.Influx.Db}");
  75. var writer = new InfluxWriter(config.Influx, hostname);
  76. return new MetricTimer(config.Interval, collector, writer);
  77. }
  78. }
  79. }
  80. }