From 76bddbc7333646568578b4b5bc9d1215a22d624c Mon Sep 17 00:00:00 2001 From: Arrelin Date: Wed, 18 Mar 2026 09:35:08 +0300 Subject: [PATCH] Add exporter.py --- exporter.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 exporter.py diff --git a/exporter.py b/exporter.py new file mode 100644 index 0000000..5e96347 --- /dev/null +++ b/exporter.py @@ -0,0 +1,34 @@ + import time + import docker + from prometheus_client import start_http_server, Gauge + + client = docker.from_env() + + cpu_gauge = Gauge("container_cpu_percent", "CPU usage %", ["name"]) + mem_gauge = Gauge("container_mem_bytes", "Memory usage bytes", ["name"]) + net_rx_gauge = Gauge("container_net_rx_bytes", "Network RX bytes", ["name"]) + net_tx_gauge = Gauge("container_net_tx_bytes", "Network TX bytes", ["name"]) + + def calc_cpu(stats): + cd = stats["cpu_stats"]["cpu_usage"]["total_usage"] - stats["precpu_stats"]["cpu_usage"]["total_usage"] + sd = stats["cpu_stats"]["system_cpu_usage"] - stats["precpu_stats"]["system_cpu_usage"] + cpus = stats["cpu_stats"].get("online_cpus", 1) + return (cd / sd) * cpus * 100 if sd > 0 else 0 + + def collect(): + for c in client.containers.list(): + stats = c.stats(stream=False) + name = c.name + cpu_gauge.labels(name).set(calc_cpu(stats)) + mem_gauge.labels(name).set(stats["memory_stats"].get("usage", 0)) + net = stats.get("networks", {}) + rx = sum(v["rx_bytes"] for v in net.values()) + tx = sum(v["tx_bytes"] for v in net.values()) + net_rx_gauge.labels(name).set(rx) + net_tx_gauge.labels(name).set(tx) + + start_http_server(9338) + while True: + collect() + time.sleep(15) + \ No newline at end of file