From 93cf8574ac14c233eba7b49d8cf2a271e8e51736 Mon Sep 17 00:00:00 2001 From: HDW Date: Sun, 26 Jul 2026 12:33:09 +0200 Subject: [PATCH] monero --- apps/miner/grafana-dashboard-configmap.yaml | 85 +++++++++++++++++++++ apps/miner/servicemonitor.yaml | 18 +++++ apps/miner/xmrig-exporter-configmap.yaml | 61 +++++++++++++++ apps/miner/xmrig-exporter.yaml | 52 +++++++++++++ apps/miner/xmrig-monero-solo.yaml | 19 +++++ apps/miner/xmrig-monero.yaml | 19 +++++ 6 files changed, 254 insertions(+) create mode 100644 apps/miner/grafana-dashboard-configmap.yaml create mode 100644 apps/miner/servicemonitor.yaml create mode 100644 apps/miner/xmrig-exporter-configmap.yaml create mode 100644 apps/miner/xmrig-exporter.yaml diff --git a/apps/miner/grafana-dashboard-configmap.yaml b/apps/miner/grafana-dashboard-configmap.yaml new file mode 100644 index 0000000..4b02bf1 --- /dev/null +++ b/apps/miner/grafana-dashboard-configmap.yaml @@ -0,0 +1,85 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: xmrig-grafana-dashboard + namespace: miner + labels: + grafana_dashboard: "1" +data: + xmrig-mining.json: | + { + "title": "XMRig Mining", + "uid": "xmrig-mining", + "schemaVersion": 39, + "time": { "from": "now-6h", "to": "now" }, + "refresh": "30s", + "templating": { + "list": [ + { + "name": "datasource", + "type": "datasource", + "query": "prometheus", + "current": {} + } + ] + }, + "panels": [ + { + "id": 1, + "title": "Hashrate (10s avg)", + "type": "timeseries", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 8, "w": 24, "x": 0, "y": 0 }, + "fieldConfig": { "defaults": { "unit": "Hz" }, "overrides": [] }, + "targets": [ + { + "expr": "xmrig_hashrate_10s", + "legendFormat": "{{miner}}", + "refId": "A" + } + ] + }, + { + "id": 2, + "title": "Shares Good", + "type": "stat", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 6, "w": 8, "x": 0, "y": 8 }, + "targets": [ + { + "expr": "xmrig_shares_good", + "legendFormat": "{{miner}}", + "refId": "A" + } + ] + }, + { + "id": 3, + "title": "Shares Total", + "type": "stat", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 6, "w": 8, "x": 8, "y": 8 }, + "targets": [ + { + "expr": "xmrig_shares_total", + "legendFormat": "{{miner}}", + "refId": "A" + } + ] + }, + { + "id": 4, + "title": "Miner Up", + "type": "stat", + "datasource": { "type": "prometheus", "uid": "${datasource}" }, + "gridPos": { "h": 6, "w": 8, "x": 16, "y": 8 }, + "targets": [ + { + "expr": "xmrig_up", + "legendFormat": "{{miner}}", + "refId": "A" + } + ] + } + ] + } diff --git a/apps/miner/servicemonitor.yaml b/apps/miner/servicemonitor.yaml new file mode 100644 index 0000000..8c4188b --- /dev/null +++ b/apps/miner/servicemonitor.yaml @@ -0,0 +1,18 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: xmrig-exporter + namespace: miner + labels: + release: prometheus-stack +spec: + selector: + matchLabels: + app: xmrig-exporter + namespaceSelector: + matchNames: + - miner + endpoints: + - port: metrics + path: /metrics + interval: 30s diff --git a/apps/miner/xmrig-exporter-configmap.yaml b/apps/miner/xmrig-exporter-configmap.yaml new file mode 100644 index 0000000..cb7fd84 --- /dev/null +++ b/apps/miner/xmrig-exporter-configmap.yaml @@ -0,0 +1,61 @@ +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() diff --git a/apps/miner/xmrig-exporter.yaml b/apps/miner/xmrig-exporter.yaml new file mode 100644 index 0000000..998d191 --- /dev/null +++ b/apps/miner/xmrig-exporter.yaml @@ -0,0 +1,52 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: xmrig-exporter + namespace: miner +spec: + replicas: 1 + selector: + matchLabels: + app: xmrig-exporter + template: + metadata: + labels: + app: xmrig-exporter + spec: + priorityClassName: low-priority + containers: + - name: exporter + image: python:3-alpine + command: ["python3", "/app/exporter.py"] + ports: + - containerPort: 9200 + name: metrics + volumeMounts: + - name: script + mountPath: /app + resources: + requests: + cpu: "50m" + memory: "32Mi" + limits: + cpu: "200m" + memory: "64Mi" + volumes: + - name: script + configMap: + name: xmrig-exporter-script +--- +apiVersion: v1 +kind: Service +metadata: + name: xmrig-exporter + namespace: miner + labels: + app: xmrig-exporter +spec: + selector: + app: xmrig-exporter + ports: + - name: metrics + port: 9200 + targetPort: 9200 diff --git a/apps/miner/xmrig-monero-solo.yaml b/apps/miner/xmrig-monero-solo.yaml index 67fef89..df57f25 100644 --- a/apps/miner/xmrig-monero-solo.yaml +++ b/apps/miner/xmrig-monero-solo.yaml @@ -44,6 +44,12 @@ spec: - "k8s-solo-lottery" - "--daemon-poll-interval=1000" - "--randomx-mode=light" + - "--http-enabled" + - "--http-host=0.0.0.0" + - "--http-port=16000" + ports: + - containerPort: 16000 + name: http-api volumeMounts: - name: shared mountPath: /shared @@ -57,3 +63,16 @@ spec: volumes: - name: shared emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: xmrig-monero-solo-api + namespace: miner +spec: + selector: + app: xmrig-monero-solo + ports: + - name: http-api + port: 16000 + targetPort: 16000 diff --git a/apps/miner/xmrig-monero.yaml b/apps/miner/xmrig-monero.yaml index 6cb8aa7..36b28ba 100644 --- a/apps/miner/xmrig-monero.yaml +++ b/apps/miner/xmrig-monero.yaml @@ -44,6 +44,12 @@ spec: - "k8s-lottery" - "--tls" - "--randomx-mode=light" + - "--http-enabled" + - "--http-host=0.0.0.0" + - "--http-port=16000" + ports: + - containerPort: 16000 + name: http-api volumeMounts: - name: shared mountPath: /shared @@ -57,3 +63,16 @@ spec: volumes: - name: shared emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: xmrig-monero-api + namespace: miner +spec: + selector: + app: xmrig-monero + ports: + - name: http-api + port: 16000 + targetPort: 16000