7天打造企业级XMig监控系统:从API配置到实时告警全攻略

7天打造企业级XMig监控系统:从API配置到实时告警全攻略

【免费下载链接】xmrig RandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark 【免费下载链接】xmrig 项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

引言:告别命令行,构建可视化监控体系

你是否还在通过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响应,便于后续分析:

mermaid

三、实时数据采集服务开发(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分钟短信+邮件+企业微信

【免费下载链接】xmrig RandomX, KawPow, CryptoNight and GhostRider unified CPU/GPU miner and RandomX benchmark 【免费下载链接】xmrig 项目地址: https://gitcode.com/GitHub_Trending/xm/xmrig

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值