51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
from prometheus_client import start_http_server, Gauge
|
|
import psycopg2
|
|
import time
|
|
|
|
# Configuration de la connexion à la base de données
|
|
conn_params = {
|
|
"host": "admin",
|
|
"database": "admin",
|
|
"user": "admin",
|
|
"password": "admin"
|
|
}
|
|
|
|
# Définition des métriques Prometheus
|
|
QUERY_CALLS = Gauge('postgresql_query_calls', 'Nombre d\'appels de requêtes PostgreSQL', ['query'])
|
|
QUERY_TOTAL_TIME = Gauge('postgresql_query_total_time_ms', 'Temps total des requêtes PostgreSQL en millisecondes', ['query'])
|
|
|
|
def generate_metrics():
|
|
try:
|
|
# Connexion à la base de données
|
|
conn = psycopg2.connect(**conn_params)
|
|
cur = conn.cursor()
|
|
|
|
# Exécution de la requête pour récupérer les informations sur les requêtes
|
|
cur.execute("""
|
|
SELECT
|
|
query,
|
|
calls,
|
|
total_time
|
|
FROM pg_stat_statements
|
|
ORDER BY total_time DESC;
|
|
""")
|
|
|
|
# Mise à jour des métriques Prometheus
|
|
for row in cur:
|
|
query = row[0].replace("\\", "\\\\").replace('"', '\\"') # échappement pour Prometheus
|
|
QUERY_CALLS.labels(query=query).set(row[1])
|
|
QUERY_TOTAL_TIME.labels(query=query).set(row[2] * 1000) # Convertir le temps en millisecondes
|
|
|
|
cur.close()
|
|
conn.close()
|
|
|
|
except psycopg2.Error as e:
|
|
print(f"Erreur de connexion à la base de données: {e}")
|
|
|
|
# Fonction principale pour démarrer l'exporteur
|
|
if __name__ == '__main__':
|
|
start_http_server(8000) # Démarre un serveur HTTP sur le port 8000 pour exposer les métriques
|
|
while True:
|
|
generate_metrics() # Génére les métriques
|
|
time.sleep(60) # Intervalle d'exécution, ici toutes les 60 secondes
|