47 lines
2.7 KiB
Django/Jinja
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)
|