diff --git a/app.py b/app.py index 1c81301..1d66249 100644 --- a/app.py +++ b/app.py @@ -16,6 +16,9 @@ import requests import sys from sanic.log import logger, logging +if METRICS: + from sanic_prometheus import monitor + app = Sanic(__name__) app.static("/res", "res/") @@ -36,6 +39,8 @@ app.blueprint([room_bp, karaoke_bp, propic_bp, export_bp, stats_bp, api_bp, carp @app.exception(exceptions.SanicException) async def clear_session(request, exception): + print(exception) + print(request) tpl = app.ctx.tpl.get_template('error.html') r = html(tpl.render(exception=exception)) @@ -207,4 +212,13 @@ if __name__ == "__main__": pass sleep(5) print("Connected to pretix!", file=sys.stderr) + + if(METRICS): + if(METRICS_USE_ANOTHER_SOCKET): + print(f"Startin metrics server on {METRICS_IP}:{METRICS_PORT} on path '{METRICS_PATH}'") + monitor(app, metrics_path=METRICS_PATH).start_server(addr=METRICS_IP, port=METRICS_PORT) + else: + print(f"Startin metrics server on path '{METRICS_PATH}'") + monitor(app, metrics_path=METRICS_PATH).expose_endpoint() + app.run(host="127.0.0.1", port=8188, dev=DEV_MODE, access_log=ACCESS_LOG) diff --git a/config.example.py b/config.example.py index 28db10e..5fa52f9 100644 --- a/config.example.py +++ b/config.example.py @@ -40,6 +40,12 @@ DEV_MODE = True ACCESS_LOG = True EXTRA_PRINTS = True +METRICS = True +METRICS_USE_ANOTHER_SOCKET = True +METRICS_IP = "172.17.0.1" +METRICS_PORT = "1211" +METRICS_PATH = "/metrics" + # Additional configured locales. # If an order has a country that's not listed here, # Will default to an english preference. diff --git a/requirements.txt b/requirements.txt index c2ae761..1914903 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ httpx Pillow aztec_code_generator Jinja2 -Requests \ No newline at end of file +Requests +sanic_prometheus \ No newline at end of file diff --git a/stuff/systemMetrics.py b/stuff/systemMetrics.py new file mode 100644 index 0000000..696b499 --- /dev/null +++ b/stuff/systemMetrics.py @@ -0,0 +1,91 @@ +import psutil +import time +import sys + +from sanic import Sanic +from sanic import response as res + +DEV_MODE = False +ACCESS_LOG = False + +app = Sanic(__name__) + +@app.route("/") +async def main(req): + return res.text("I\'m a teapot", status=418) + +@app.route("/metrics") +async def metrics(req): + out = [] + + cpus = psutil.cpu_percent(percpu=True) + totalCpu = 0 + for i in range(len(cpus)): + out.append(f'monitor_cpu_core_usage_percent{{core="{i}"}} {cpus[i]}') + totalCpu += cpus[i] + out.append(f'monitor_cpu_core_usage_percent{{core="avg"}} {"%.2f" % (totalCpu / len(cpus))}') + + diskIo = psutil.disk_io_counters(nowrap=True) + out.append(f'monitor_diskio{{value="read_count"}} {diskIo.read_count}') + out.append(f'monitor_diskio{{value="write_count"}} {diskIo.write_count}') + out.append(f'monitor_diskio{{value="read_bytes"}} {diskIo.read_bytes}') + out.append(f'monitor_diskio{{value="write_bytes"}} {diskIo.write_bytes}') + out.append(f'monitor_diskio{{value="read_time"}} {diskIo.read_time}') + out.append(f'monitor_diskio{{value="write_time"}} {diskIo.write_time}') + + disks = psutil.disk_partitions() + for disk in disks: + try: + dUsage = psutil.disk_usage(disk.mountpoint) + out.append(f'monitor_disk_usage_percent{{partition="{disk.mountpoint}"}} {dUsage.percent}') + except: + pass + + mem = psutil.virtual_memory() + out.append(f'monitor_memory{{value="total"}} {mem.total}') + out.append(f'monitor_memory{{value="available"}} {mem.available}') + out.append(f'monitor_memory{{value="percent"}} {mem.percent}') + out.append(f'monitor_memory{{value="used"}} {mem.used}') + out.append(f'monitor_memory{{value="free"}} {mem.free}') + + swap = psutil.swap_memory() + out.append(f'monitor_swap{{value="total"}} {swap.total}') + out.append(f'monitor_swap{{value="used"}} {swap.used}') + out.append(f'monitor_swap{{value="free"}} {swap.free}') + out.append(f'monitor_swap{{value="percent"}} {swap.percent}') + out.append(f'monitor_swap{{value="sin"}} {swap.sin}') + out.append(f'monitor_swap{{value="sout"}} {swap.sout}') + + bootTime = psutil.boot_time() + out.append(f'monitor_boot_time{{}} {int(time.time() - bootTime)}') + + netioConnections = psutil.net_connections() + out.append(f'monitor_netio_connections{{}} {len(netioConnections)}') + netioCounters = psutil.net_io_counters(nowrap=True) + out.append(f'monitor_netio_counters{{value="bytes_sent"}} {netioCounters.bytes_sent}') + out.append(f'monitor_netio_counters{{value="bytes_recv"}} {netioCounters.bytes_recv}') + out.append(f'monitor_netio_counters{{value="packets_sent"}} {netioCounters.packets_sent}') + out.append(f'monitor_netio_counters{{value="packets_recv"}} {netioCounters.packets_recv}') + out.append(f'monitor_netio_counters{{value="errin"}} {netioCounters.errin}') + out.append(f'monitor_netio_counters{{value="errout"}} {netioCounters.errout}') + out.append(f'monitor_netio_counters{{value="dropin"}} {netioCounters.dropin}') + out.append(f'monitor_netio_counters{{value="dropout"}} {netioCounters.dropout}') + + return res.text("\n".join(out), status=200) + + +if __name__ == '__main__': + ip = "127.0.0.1" + port = 2611 + if(len(sys.argv) > 1): + ip = sys.argv[1] + if(len(sys.argv) > 2): + try: + port = int(sys.argv[2]) + except: + print("Port must be a numeric value!") + exit(1) + if(port < 1 or port > 0xffff): + print("Port must be in [1, 65535] range!") + exit(1) + app.run(host=ip, port=port, dev=DEV_MODE, access_log=ACCESS_LOG)