ansible-role-mailserver/templates/dovecot/prometheus-dovecot-master-exporter.j2

47 lines
2.7 KiB
Django/Jinja

#!/usr/bin/python3
import time
import subprocess
import json
from prometheus_client import start_http_server, PROCESS_COLLECTOR, PLATFORM_COLLECTOR, GC_COLLECTOR
from prometheus_client.core import GaugeMetricFamily, CounterMetricFamily, REGISTRY
from prometheus_client.registry import Collector
class CustomCollector(Collector):
def collect(self):
service_status = json.loads(subprocess.run(['doveadm', '-f', 'json', 'service', 'status'], check=True, capture_output=True).stdout.decode())
process_status = json.loads(subprocess.run(['doveadm', '-f', 'json', 'process', 'status'], check=True, capture_output=True).stdout.decode())
dovecot_processes_count = GaugeMetricFamily('dovecot_processes_count', 'Number of running processes per service', labels=['service'])
dovecot_processes_total = CounterMetricFamily('dovecot_processes_total', 'Total count of started processes per service', labels=['service'])
dovecot_processes_limit = GaugeMetricFamily('dovecot_processes_limit', 'Process limit per service', labels=['service'])
dovecot_clients_count = GaugeMetricFamily('dovecot_clients_count', 'Number of connected clients per service', labels=['service'])
dovecot_clients_total = CounterMetricFamily('dovecot_clients_total', 'Total count of clients per service', labels=['service'])
dovecot_clients_per_process_limit = GaugeMetricFamily('dovecot_clients_per_process_limit', 'Client limit per process', labels=['service'])
for line in service_status:
dovecot_processes_count.add_metric([line['name']], int(line['process_count']))
dovecot_processes_total.add_metric([line['name']], int(line['process_total']))
dovecot_processes_limit.add_metric([line['name']], int(line['process_limit']))
dovecot_clients_count.add_metric(
[line['name']],
sum(int(line['client_limit'])-int(proc['available_count']) for proc in process_status if proc['name'] == line['name'])
)
dovecot_clients_total.add_metric(
[line['name']],
sum(int(proc['total_count']) for proc in process_status if proc['name'] == line['name'])
)
dovecot_clients_per_process_limit.add_metric([line['name']], int(line['client_limit']))
yield dovecot_processes_count
yield dovecot_processes_total
yield dovecot_processes_limit
yield dovecot_clients_count
yield dovecot_clients_total
yield dovecot_clients_per_process_limit
REGISTRY.unregister(PROCESS_COLLECTOR)
REGISTRY.unregister(PLATFORM_COLLECTOR)
REGISTRY.unregister(GC_COLLECTOR)
REGISTRY.register(CustomCollector())
if __name__ == '__main__':
start_http_server(addr='127.0.0.1', port=9162)
while True:
time.sleep(100)