PrometheusCollection.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using NLog;
  3. using OpenHardwareMonitor.Hardware;
  4. using Prometheus;
  5. namespace OhmGraphite
  6. {
  7. public class PrometheusCollection
  8. {
  9. private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
  10. private readonly IGiveSensors _collector;
  11. private MetricFactory _metrics;
  12. public PrometheusCollection(IGiveSensors collector, CollectorRegistry registry)
  13. {
  14. _collector = collector;
  15. registry.AddBeforeCollectCallback(UpdateMetrics);
  16. _metrics = Metrics.WithCustomRegistry(registry);
  17. }
  18. public void UpdateMetrics()
  19. {
  20. Logger.LogAction("prometheus update metrics", PollSensors);
  21. }
  22. private string SuffixForSensorType(SensorType type, out float multiplier)
  23. {
  24. multiplier = 1.0f;
  25. switch (type)
  26. {
  27. case SensorType.Voltage: // V
  28. return "voltage_volts";
  29. case SensorType.Clock: // MHz
  30. multiplier = 1000000;
  31. return "clock_hertz";
  32. case SensorType.Temperature: // °C
  33. return "temperature_celsius";
  34. case SensorType.Frequency: // Hz
  35. return "frequency_hertz";
  36. case SensorType.Power: // W
  37. return "power_watts";
  38. case SensorType.Data: // GB = 2^30 Bytes
  39. multiplier = 1073741824;
  40. return "bytes";
  41. case SensorType.SmallData: // MB = 2^20 Bytes
  42. multiplier = 1048576;
  43. return "bytes";
  44. case SensorType.Throughput: // B/s
  45. return "throughput_bytes_per_second";
  46. case SensorType.Load: // %
  47. case SensorType.Control: // %
  48. case SensorType.Level: // %
  49. case SensorType.Fan: // RPM
  50. case SensorType.Flow: // L/h
  51. case SensorType.Factor: // 1
  52. default:
  53. return type.ToString().ToLower();
  54. }
  55. }
  56. private void PollSensors()
  57. {
  58. foreach (var sensor in _collector.ReadAllSensors())
  59. {
  60. string suffix = SuffixForSensorType(sensor.SensorType, out float multiplier);
  61. _metrics.CreateGauge(
  62. String.Format(
  63. "ohm_{0}_{1}",
  64. Enum.GetName(typeof(HardwareType), sensor.HardwareType).ToLower(),
  65. suffix
  66. ),
  67. "Metric reported by open hardware sensor",
  68. "hardware", "sensor")
  69. .WithLabels(sensor.Hardware, sensor.Sensor)
  70. .Set(sensor.Value * multiplier);
  71. }
  72. }
  73. }
  74. }