prometheus_poudriere/bin/prometheus_poudriere

91 lines
2.6 KiB
Python
Executable File

#!/usr/local/bin/python3
"""
Prometheus exporter for poudriere
Usage:
prometheus_poudriere [options]
prometheus_poudriere -h | --help
prometheus_poudriere --version
Options:
--listen-address=<[host]:port> Address the httpd gets bound to [default: 127.0.0.1:9969]
--poudriere-path=<path> Path to the main poudriere directory [default: /usr/local/poudriere]
"""
__version__ = '0.0.0'
from sys import stderr
from time import sleep
import os
import json
import docopt
import prometheus_client
import prometheus_client.core
class PoudriereCollector(object):
def __init__(self, poudriere_path):
self.poudriere_path = poudriere_path
self.json_path = os.path.join(poudriere_path, 'data/logs/bulk/.data.json')
def collect(self):
try:
fd = open(self.json_path, 'r')
except FileNotFoundError:
print(f"JSON file not found: '{self.json_path}'", file=stderr)
return None
except PermissionError:
print(f"No read permission for JSON file: '{self.json_path}'", file=stderr)
return None
try:
data = json.loads(fd.read())
except Exception:
return print(f"Invalid data in '{self.json_path}'", file=stderr)
finally:
fd.close()
labels = {}
for master_name, master_info in data['masternames'].items():
labels['master'] = master_name
labels['jail'] = master_info['jailname']
labels['portstree'] = master_info['ptname']
labels['set'] = master_info['setname']
labels['build'] = master_info['latest']['buildname']
labels['status'] = master_info['latest']['status']
stats = master_info['latest']['stats']
for name, value in stats.items():
counter = prometheus_client.core.CounterMetricFamily(f'poudriere_{name}', name, labels=labels.keys())
counter.add_metric(labels.values(), value)
yield counter
if __name__ == '__main__':
parameters = docopt.docopt(__doc__, version=f'prometheus_poudriere {__version__}')
try:
host, port = parameters['--listen-address'].split(':')
port = int(port)
except Exception:
print(f"Invalid listen address: {parameters['--listen-address']}", file=stderr)
collector = PoudriereCollector(poudriere_path=parameters['--poudriere-path'])
prometheus_client.core.REGISTRY.register(collector)
prometheus_client.start_http_server(port, addr=host)
print("prometheus_poudriere is up!")
while True:
sleep(1)