This commit is contained in:
HDW
2026-07-26 12:33:09 +02:00
parent 11336eaf4b
commit 93cf8574ac
6 changed files with 254 additions and 0 deletions

View File

@@ -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"
}
]
}
]
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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