7天打造企业级XMig监控系统:从API配置到实时告警全攻略
引言:告别命令行,构建可视化监控体系
你是否还在通过SSH反复执行top命令查看系统状态?是否因无法实时感知性能波动导致效率损失?本文将带你从零开始,基于xmrig API构建一套功能完备的自定义监控系统,实现性能监控、异常告警、历史数据分析三大核心功能。读完本文,你将掌握:
- xmrig API全方位配置指南(含安全认证与跨域设置)
- 5个核心API端点的深度解析与数据建模
- 基于Python的实时数据采集服务开发
- 高可用前端监控面板实现(附国内CDN资源)
- 智能告警系统搭建与阈值优化
一、XMig API基础配置与安全加固
1.1 启用API服务(3种配置方式)
xmrig提供三种API启用方式,可根据部署环境选择:
配置文件法(推荐生产环境)
{
"api": {
"id": "miner-01-shanghai", // 节点唯一标识
"worker-id": "rack-03-gpu-01" // 可选 Worker 名称
},
"http": {
"enabled": true,
"host": "0.0.0.0", // 允许外部访问
"port": 4444, // 固定端口便于防火墙配置
"access-token": "YOUR_SECURE_TOKEN", // 至少32位随机字符串
"restricted": false // 允许远程配置(生产环境建议true)
}
}
命令行参数法(适合临时调试)
./xmrig --http-enabled --http-port 4444 --http-access-token YOUR_SECURE_TOKEN --http-no-restricted
环境变量法(容器部署首选)
export XMRIG_HTTP_ENABLED=true
export XMRIG_HTTP_PORT=4444
export XMRIG_HTTP_ACCESS_TOKEN=YOUR_SECURE_TOKEN
./xmrig
1.2 安全加固最佳实践
| 安全措施 | 配置方法 | 风险等级 |
|---|---|---|
| IP白名单 | 结合防火墙限制来源IP | 高 |
| HTTPS加密 | 配合Nginx反向代理实现 | 高 |
| 令牌轮换 | 定期更新access-token | 中 |
| 端口隐藏 | 使用非标准端口(如23456) | 低 |
| restricted模式 | 设置"restricted": true | 高 |
Nginx反向代理配置示例(实现HTTPS与IP限制):
server {
listen 443 ssl;
server_name miner-api.example.com;
ssl_certificate /etc/ssl/certs/miner.crt;
ssl_certificate_key /etc/ssl/private/miner.key;
allow 192.168.1.0/24; # 允许内网访问
deny all; # 拒绝其他IP
location / {
proxy_pass http://127.0.0.1:4444;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
二、核心API端点深度解析与数据建模
2.1 五大必用API端点全解析
xmrig提供两类API端点:公开只读端点(无需认证)和受限操作端点(需Bearer令牌)。
2.1.1 节点状态总览:GET /1/summary
响应数据结构(关键字段说明):
{
"id": "92f3104f9a2ee78c", // 节点唯一ID
"worker_id": "Ubuntu-1604-node", // Worker名称
"version": "2.6.0-beta3", // 软件版本
"algo": "cryptonight", // 当前算法
"hashrate": {
"total": [296.24, 296.23, 295.97], // 1m/5m/15m哈希率(Hashes/秒)
"highest": 296.5, // 历史最高哈希率
"threads": [/* 每个线程详细数据 */]
},
"results": {
"shares_good": 30, // 有效共享数
"shares_total": 30, // 总共享数
"error_log": [] // 错误日志
},
"connection": {
"pool": "pool.monero.hashvault.pro:3333", // 当前连接池
"uptime": 953, // 连接时长(秒)
"ping": 35 // 连接延迟(毫秒)
}
}
数据应用场景:
- 仪表盘总览展示
- 性能波动检测(15m均值低于阈值告警)
- 连接状态监控
2.1.2 线程详情监控:GET /1/threads
响应示例:
{
"hugepages": [4, 4], // 大页内存使用情况
"memory": 8388608, // 总内存占用(字节)
"threads": [
{
"type": "cpu", // 线程类型(cpu/gpu)
"algo": "cryptonight", // 线程算法
"affine_to_cpu": 0, // CPU亲和性
"hashrate": [73.39, 73.4, 73.28] // 线程性能指标
},
// 更多线程...
]
}
关键指标:
affine_to_cpu:CPU核心绑定情况,可用于负载均衡优化hashrate数组:单线程性能分析,识别异常线程
2.1.3 配置管理:GET/PUT /1/config
获取当前配置:
curl -H "Authorization: Bearer YOUR_SECURE_TOKEN" http://127.0.0.1:4444/1/config
更新配置(动态调整线程数示例):
curl -X PUT -H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_SECURE_TOKEN" \
-d '{"cpu":{"enabled":true,"max-threads-hint":50}}' \
http://127.0.0.1:4444/1/config
⚠️ 安全警告:生产环境建议保持
"restricted": true,禁用远程配置修改功能
2.2 API响应数据建模(面向监控系统)
推荐采用以下数据模型存储API响应,便于后续分析:
三、实时数据采集服务开发(Python实现)
3.1 高可用API客户端
import requests
import time
import json
from dataclasses import dataclass
from typing import List, Dict, Optional
@dataclass
class MinerConfig:
host: str
port: int
token: str
timeout: int = 5
class XMRigApiClient:
def __init__(self, config: MinerConfig):
self.config = config
self.base_url = f"http://{config.host}:{config.port}"
self.headers = {
"Authorization": f"Bearer {config.token}"
}
def _request(self, endpoint: str) -> Optional[Dict]:
try:
response = requests.get(
f"{self.base_url}/{endpoint}",
headers=self.headers,
timeout=self.config.timeout
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"API请求失败: {str(e)}")
return None
def get_summary(self) -> Optional[Dict]:
return self._request("1/summary")
def get_threads(self) -> Optional[Dict]:
return self._request("1/threads")
def get_config(self) -> Optional[Dict]:
return self._request("1/config")
# 使用示例
if __name__ == "__main__":
config = MinerConfig(
host="127.0.0.1",
port=4444,
token="YOUR_SECURE_TOKEN"
)
client = XMRigApiClient(config)
while True:
summary = client.get_summary()
if summary:
# 此处可添加数据存储逻辑
print(f"当前性能指标: {summary['hashrate']['total'][0]} H/s")
time.sleep(10) # 10秒采集一次
3.2 数据持久化方案
推荐使用InfluxDB存储时序数据,适合性能指标等高频采集指标:
from influxdb import InfluxDBClient
def save_to_influxdb(summary_data):
client = InfluxDBClient('localhost', 8086, 'user', 'password', 'mining_monitor')
json_body = [
{
"measurement": "hashrate",
"tags": {
"miner_id": summary_data["id"],
"worker_id": summary_data["worker_id"],
"algo": summary_data["algo"]
},
"time": time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
"fields": {
"hashrate_1m": summary_data["hashrate"]["total"][0],
"hashrate_5m": summary_data["hashrate"]["total"][1],
"hashrate_15m": summary_data["hashrate"]["total"][2],
"shares_good": summary_data["results"]["shares_good"],
"shares_total": summary_data["results"]["shares_total"],
"pool_ping": summary_data["connection"]["ping"]
}
}
]
client.write_points(json_body)
四、监控面板实现(前端篇)
4.1 技术选型与资源配置
采用轻量化技术栈,确保在低配置服务器上流畅运行:
- 前端框架:原生JavaScript(无需构建工具)
- 图表库:Chart.js(国内CDN加速)
- UI组件:Element UI(精简版)
- 数据传输:WebSocket(实时推送)/HTTP轮询(降级方案)
国内CDN资源配置:
<!-- 引入Chart.js -->
<script src="https://cdn.bootcdn.net/ajax/libs/Chart.js/3.7.1/chart.min.js"></script>
<!-- 引入Element UI -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.15.6/lib/theme-chalk/index.css">
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.15.6/lib/index.js"></script>
4.2 核心仪表盘实现
HTML结构:
<div id="app">
<el-container>
<el-header>XMig监控系统</el-header>
<el-main>
<el-row>
<!-- 性能指标卡片 -->
<el-col :span="8">
<el-card>
<div slot="header">
<h3>当前性能指标 (H/s)</h3>
</div>
<div class="hashrate-display">
<span class="hashrate-value">{{ currentHashrate }}</span>
<div class="hashrate-trend">
<canvas id="hashrateChart"></canvas>
</div>
</div>
</el-card>
</el-col>
<!-- 共享率卡片 -->
<el-col :span="8">
<el-card>
<div slot="header">
<h3>共享率</h3>
</div>
<div class="shares-display">
<el-progress type="circle" :percentage="sharesPercentage"></el-progress>
<div class="shares-info">
<p>有效共享: {{ sharesGood }}</p>
<p>总共享: {{ sharesTotal }}</p>
</div>
</div>
</el-card>
</el-col>
<!-- 连接状态卡片 -->
<el-col :span="8">
<el-card>
<div slot="header">
<h3>连接状态</h3>
</div>
<div class="pool-status">
<p>当前连接: {{ poolAddress }}</p>
<p> uptime: {{ uptime | formatUptime }}</p>
<p>延迟: {{ ping }} ms</p>
</div>
</el-card>
</el-col>
</el-row>
<!-- 线程状态表格 -->
<el-row>
<el-col :span="24">
<el-card>
<div slot="header">
<h3>线程状态</h3>
</div>
<el-table :data="threads">
<el-table-column prop="id" label="线程ID"></el-table-column>
<el-table-column prop="type" label="类型"></el-table-column>
<el-table-column prop="algo" label="算法"></el-table-column>
<el-table-column prop="hashrate" label="性能指标 (H/s)"></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
<el-tag :type="scope.row.status === 'normal' ? 'success' : 'danger'">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</el-main>
</el-container>
</div>
Vue.js逻辑:
new Vue({
el: '#app',
data() {
return {
currentHashrate: 0,
sharesGood: 0,
sharesTotal: 0,
sharesPercentage: 0,
poolAddress: '',
uptime: 0,
ping: 0,
threads: [],
hashrateHistory: []
};
},
mounted() {
// 初始化性能指标图表
this.initHashrateChart();
// 启动轮询
this.startPolling();
},
methods: {
initHashrateChart() {
this.hashrateChart = new Chart(
document.getElementById('hashrateChart'),
{
type: 'line',
data: {
labels: [],
datasets: [{
label: '性能指标 (H/s)',
data: [],
borderColor: '#409EFF',
tension: 0.1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
display: false
}
}
}
}
);
},
startPolling() {
// 每10秒更新一次数据
setInterval(() => {
this.fetchData();
}, 10000);
// 立即获取一次数据
this.fetchData();
},
fetchData() {
// 获取摘要数据
fetch('/api/summary')
.then(response => response.json())
.then(data => {
this.currentHashrate = data.hashrate.total[0].toFixed(2);
this.sharesGood = data.results.shares_good;
this.sharesTotal = data.results.shares_total;
this.sharesPercentage = (this.sharesGood / this.sharesTotal * 100).toFixed(1);
this.poolAddress = data.connection.pool;
this.uptime = data.connection.uptime;
this.ping = data.connection.ping;
// 更新性能指标历史
this.updateHashrateHistory(data.hashrate.total[0]);
});
// 获取线程数据
fetch('/api/threads')
.then(response => response.json())
.then(data => {
this.threads = data.threads.map((thread, index) => ({
id: index,
type: thread.type,
algo: thread.algo,
hashrate: thread.hashrate[0].toFixed(2),
status: thread.hashrate[0] > 0 ? 'normal' : 'error'
}));
});
},
updateHashrateHistory(value) {
// 保留最近30个数据点
if (this.hashrateHistory.length > 30) {
this.hashrateHistory.shift();
}
this.hashrateHistory.push(value);
// 更新图表
this.hashrateChart.data.labels = Array(this.hashrateHistory.length).fill('');
this.hashrateChart.data.datasets[0].data = this.hashrateHistory;
this.hashrateChart.update();
}
},
filters: {
formatUptime(seconds) {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
return `${hours}h ${minutes}m ${secs}s`;
}
}
});
五、告警系统搭建与智能阈值优化
5.1 多级别告警策略
| 告警级别 | 触发条件 | 通知方式 | 恢复条件 |
|---|---|---|---|
| 紧急 | 性能指标下降>50%持续3分钟 | 短信+邮件+企业微信 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



