91 lines
2.6 KiB
Python
Executable File
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)
|