apiVersion: v1 kind: ConfigMap metadata: name: xmrig-exporter-script namespace: miner data: exporter.py: | import json import urllib.request from http.server import BaseHTTPRequestHandler, HTTPServer TARGETS = { "xmrig-monero": "http://xmrig-monero-api.miner.svc.cluster.local:16000/2/summary", "xmrig-monero-solo": "http://xmrig-monero-solo-api.miner.svc.cluster.local:16000/2/summary", } def fetch_metrics(): lines = [ "# HELP xmrig_hashrate_10s Current hashrate over 10s window", "# TYPE xmrig_hashrate_10s gauge", "# HELP xmrig_shares_good Accepted shares", "# TYPE xmrig_shares_good counter", "# HELP xmrig_shares_total Total shares submitted", "# TYPE xmrig_shares_total counter", "# HELP xmrig_up Whether the xmrig HTTP API was reachable", "# TYPE xmrig_up gauge", ] for name, url in TARGETS.items(): try: with urllib.request.urlopen(url, timeout=5) as resp: data = json.loads(resp.read()) hashrate = data.get("hashrate", {}).get("total", [0]) or [0] hashrate_10s = hashrate[0] or 0 good = data.get("results", {}).get("shares_good", 0) total = data.get("results", {}).get("shares_total", 0) lines.append(f'xmrig_hashrate_10s{{miner="{name}"}} {hashrate_10s}') lines.append(f'xmrig_shares_good{{miner="{name}"}} {good}') lines.append(f'xmrig_shares_total{{miner="{name}"}} {total}') lines.append(f'xmrig_up{{miner="{name}"}} 1') except Exception: lines.append(f'xmrig_up{{miner="{name}"}} 0') return "\n".join(lines) + "\n" class Handler(BaseHTTPRequestHandler): def do_GET(self): if self.path == "/metrics": body = fetch_metrics().encode() self.send_response(200) self.send_header("Content-Type", "text/plain; version=0.0.4") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) else: self.send_response(404) self.end_headers() def log_message(self, format, *args): pass if __name__ == "__main__": HTTPServer(("0.0.0.0", 9200), Handler).serve_forever()