commit 31eea082ab1fc7e08bc9d83a81fc3b95ef4a9d15 Author: chris Date: Tue Sep 15 12:22:03 2020 +0200 init diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1be12bc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM reg.zknt.org/zknt/python + +COPY requirements.txt /app/requirements.txt +WORKDIR /app +RUN apk add --no-cache libffi && pip3 install -r requirements.txt && apk del libffi + +COPY . /app +ENV FLASK_APP=rspamd_exporter.py +EXPOSE 5000 +ENTRYPOINT flask run --host=0.0.0.0 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0a836fa --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests==2.24.0 +Flask==1.1.2 diff --git a/rspamd_exporter.py b/rspamd_exporter.py new file mode 100644 index 0000000..7f939f3 --- /dev/null +++ b/rspamd_exporter.py @@ -0,0 +1,38 @@ +import os + +import requests +from flask import Flask + + +password = os.environ.get("RSPAMD_EXPORTER_PASSWORD") +url = os.environ.get("RSPAMD_EXPORTER_URL") +instance = os.environ.get("RSPAMD_EXPORTER_INSTANCE") + + +def json_to_prom(json, prefix, instance): + outlines = "" + for k,v in json.items(): + k = k.replace(' ', '_') + k = k.replace('.', '_') + if type(k) != list: + v = [v] + for item in v: + if len(v) != 1: + prefix = prefix + "_" + v.index(item) + if type(item) is bool: + outlines += "{}_{}{{instance=\"{}\"}} {}\n".format(prefix, k, instance, 1 if item else 0) + if type(item) in [int, str]: + outlines += "{}_{}{{instance=\"{}\"}} {}\n".format(prefix, k, instance,item) + if type(item) is dict: + outlines += json_to_prom(item, "{}_{}".format(prefix, k), instance) + return outlines + + +app = Flask(__name__) + +@app.route('/metrics') +def metrics(): + rspamd_json = requests.get(url, headers={"Password": password}).json() + prom_lines = json_to_prom(rspamd_json, "rspamd", instance) + prom_lines += 'up{{instance="{}"}} 1'.format(instance) + return prom_lines