瀏覽代碼

feat: integrate Prometheus metrics for cell measurements and start metrics server

Silas Gruen 8 月之前
父節點
當前提交
f5c5d5e1be
共有 4 個文件被更改,包括 37 次插入2 次删除
  1. 2 0
      main.py
  2. 2 1
      requirements.txt
  3. 11 1
      src/models/cell.py
  4. 22 0
      src/services/prometheus_service.py

+ 2 - 0
main.py

@@ -7,6 +7,7 @@ from src.services.mqtt_service import MQTTService
 from src.services.i2c_service import I2CService
 from src.services.http_service import HTTPService
 from src.controllers.measurement_controller import MeasurementController
+from src.services.prometheus_service import start_metrics_server
 
 async def main():
     # Load config
@@ -38,6 +39,7 @@ async def main():
     mqtt_service = MQTTService(config)
     http_service = HTTPService(config)
     controller = MeasurementController(config, i2c_service, http_service, mqtt_service)
+    start_metrics_server(8000)
 
     await controller.start_polling()
 

+ 2 - 1
requirements.txt

@@ -6,4 +6,5 @@ pyyaml==6.0.1
 pytest==7.4.0
 pytest-asyncio==0.21.1
 requests==2.32.3
-pydantic
+pydantic
+prometheus_client

+ 11 - 1
src/models/cell.py

@@ -1,6 +1,7 @@
 import logging
 from dataclasses import dataclass
 from datetime import datetime
+from src.services.prometheus_service import cell_voltage, cell_current, cell_temperature, cell_health
 
 logger = logging.getLogger(__name__)
 
@@ -31,7 +32,7 @@ class Cell():
 
     def add_measurement(self, data: MeasureValues):
         """
-        Add a new measurement to the list of measurements.
+        Add a new measurement to the list of measurements and update Prometheus metrics.
         """
         now = datetime.now()
         if self.last_measured_time is not None:
@@ -39,6 +40,15 @@ class Cell():
             self.measurements_duration.append(duration)
             self.measurements.append(data)
             logger.debug(f"Added measurement for cell {self.id}: {data} ({duration:.1f}s)")
+            
+            # Update Prometheus metrics
+            cell_id = str(self.id)
+            cell_voltage.labels(cell_id=cell_id).set(data.voltage)
+            cell_current.labels(cell_id=cell_id).set(data.current)
+            cell_temperature.labels(cell_id=cell_id).set(data.temperature)
+            if self.estimated_health >= 0:
+                cell_health.labels(cell_id=cell_id).set(self.estimated_health)
+                
         self.last_measured_time = datetime.now()
 
     def _find_cycles(self) -> list[tuple[int, float]]:

+ 22 - 0
src/services/prometheus_service.py

@@ -0,0 +1,22 @@
+from prometheus_client import start_http_server, Gauge
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+# Create gauge metrics for cell measurements
+cell_voltage = Gauge('cell_voltage_mv', 'Cell voltage in mV', ['cell_id'])
+cell_current = Gauge('cell_current_ma', 'Cell current in mA', ['cell_id'])
+cell_temperature = Gauge('cell_temperature_celsius', 'Cell temperature in celsius', ['cell_id'])
+cell_health = Gauge('cell_health_percentage', 'Cell health in percentage', ['cell_id'])
+
+def start_metrics_server(port: int = 8000):
+    """
+    Start the Prometheus metrics server on the specified port.
+    """
+    try:
+        start_http_server(port)
+        logger.info(f"Started Prometheus metrics server on port {port}")
+    except Exception as e:
+        logger.error(f"Failed to start metrics server: {e}")
+        raise