11import dataclasses
22import os
33
4- from prometheus_client import CollectorRegistry , Gauge , push_to_gateway
4+ from prometheus_client import (
5+ CollectorRegistry ,
6+ Counter ,
7+ Gauge ,
8+ delete_from_gateway ,
9+ push_to_gateway ,
10+ )
511from prometheus_client .exposition import basic_auth_handler
612
713from codecarbon .external .logger import logger
1521 emissions_doc ,
1622 emissions_rate_doc ,
1723 energy_consumed_doc ,
24+ energy_consumed_total_doc ,
1825 gpu_energy_doc ,
1926 gpu_power_doc ,
2027 ram_energy_doc ,
@@ -60,6 +67,15 @@ def generate_gauge(metric_doc: MetricDocumentation):
6067 )
6168
6269
70+ def generate_counter (metric_doc : MetricDocumentation ):
71+ return Counter (
72+ metric_doc .name ,
73+ metric_doc .description ,
74+ labelnames ,
75+ registry = registry ,
76+ )
77+
78+
6379duration_gauge = generate_gauge (duration_doc )
6480emissions_gauge = generate_gauge (emissions_doc )
6581emissions_rate_gauge = generate_gauge (emissions_rate_doc )
@@ -70,15 +86,26 @@ def generate_gauge(metric_doc: MetricDocumentation):
7086gpu_energy_gauge = generate_gauge (gpu_energy_doc )
7187ram_energy_gauge = generate_gauge (ram_energy_doc )
7288energy_consumed_gauge = generate_gauge (energy_consumed_doc )
89+ energy_consumed_total = generate_counter (energy_consumed_total_doc )
7390
7491
7592class PrometheusOutput (BaseOutput ):
7693 """
7794 Send emissions data to prometheus pushgateway
7895 """
7996
80- def __init__ (self , prometheus_url : str ):
97+ def __init__ (self , prometheus_url : str , job_name : str = "codecarbon" ):
8198 self .prometheus_url = prometheus_url
99+ self .job_name = job_name
100+
101+ def exit (self ):
102+ # Cleanup metrics from pushgateway on shutdown, prometheus should already have read them
103+ # Otherwise they will persist with their last values
104+ try :
105+ logger .info ("Deleting metrics from Prometheus Pushgateway" )
106+ delete_from_gateway (self .prometheus_url , job = self .job_name )
107+ except Exception as e :
108+ logger .error (e , exc_info = True )
82109
83110 def out (self , total : EmissionsData , delta : EmissionsData ):
84111 try :
@@ -121,10 +148,14 @@ def add_emission(self, carbon_emission: dict):
121148 ]:
122149 gauge .labels (** labels ).set (carbon_emission [emission_name ])
123150
151+ # Update the total energy consumed counter
152+ # This is separate from the total values given to self.out(...)
153+ energy_consumed_total .labels (** labels ).inc (carbon_emission ["energy_consumed" ])
154+
124155 # Send the new metric values
125156 push_to_gateway (
126157 self .prometheus_url ,
127- job = "codecarbon" ,
158+ job = self . job_name ,
128159 registry = registry ,
129160 handler = self ._auth_handler ,
130161 )
0 commit comments