Beszel API完全手册:从基础调用到高级监控数据整合

Beszel API完全手册:从基础调用到高级监控数据整合

【免费下载链接】beszel Lightweight server monitoring hub with historical data, docker stats, and alerts. 【免费下载链接】beszel 项目地址: https://gitcode.com/GitHub_Trending/be/beszel

引言:解决分布式服务器监控的痛点

你是否还在为跨平台服务器监控的复杂性而困扰?面对Docker容器与物理机混合架构,如何实现统一的数据采集与分析?当服务器数量超过10台,如何避免监控系统自身成为性能瓶颈?Beszel作为轻量级服务器监控中枢(Lightweight server monitoring hub),通过精心设计的API体系提供了完整解决方案。本文将系统讲解其API设计理念、核心端点调用方法、数据整合策略及高级应用场景,帮助你在30分钟内构建企业级监控系统。

读完本文后,你将能够:

  • 掌握基于JWT的认证机制与权限控制
  • 实现服务器性能指标的实时采集与历史分析
  • 配置智能告警规则并集成第三方通知系统
  • 利用WebSocket实现毫秒级数据推送
  • 构建自定义仪表盘与数据可视化方案

API架构总览

Beszel采用"中枢-代理"(Hub-Agent)架构,所有API交互通过Hub节点中转,Agent负责本地数据采集。这种设计带来三大优势:单点认证简化权限管理、批量操作提升效率、多级缓存优化性能。

技术架构图

mermaid

核心API特性

特性详细说明优势
双协议支持WebSocket实时推送 + RESTful批量拉取兼顾实时性与灵活性
数据分层存储1分钟/10分钟/20分钟三级聚合优化查询性能与存储
增量同步基于指纹(Fingerprint)的变化检测减少90%冗余传输
分布式认证通用令牌(Universal Token)机制支持跨域多系统管理
多语言适配Go SDK + TypeScript客户端前后端开发无缝衔接

快速上手:API调用准备

环境准备与依赖

最低系统要求

  • Go 1.21+(服务端)
  • Node.js 18+(前端SDK)
  • 网络带宽:单Agent节点最低100Kbps

安装Beszel Hub

# 通过源码安装
git clone https://gitcode.com/GitHub_Trending/be/beszel
cd beszel/beszel
make build
./beszel-hub serve --port 45876

# 或使用Docker快速启动
docker run -p 45876:45876 -v ./data:/data beszel/hub:latest

认证机制详解

Beszel采用JWT(JSON Web Token)认证,配合短期访问令牌与长期刷新令牌机制。认证流程分为三个步骤:

  1. 获取初始令牌
POST /api/beszel/auth/login
Content-Type: application/json

{
  "email": "admin@example.com",
  "password": "secure_password"
}

成功响应(200 OK):

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expiresAt": "2025-09-09T12:00:00Z"
}
  1. API请求格式: 所有需要认证的请求必须在HTTP头部包含:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
  1. 令牌刷新: 建议在令牌过期前30分钟调用刷新接口:
POST /api/beszel/auth/refresh
Content-Type: application/json

{
  "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

安全最佳实践:生产环境必须启用HTTPS,敏感操作建议开启IP白名单。令牌存储应使用HttpOnly Cookie或安全存储方案。

核心API端点详解

系统管理API

获取服务器列表

请求

GET /api/beszel/systems
Accept: application/json
Authorization: Bearer {token}

响应(200 OK):

{
  "systems": [
    {
      "id": "sys_123456",
      "name": "web-server-01",
      "host": "192.168.1.10",
      "port": "45876",
      "status": "up",
      "lastSeen": "2025-09-08T10:23:45Z",
      "agentVersion": "0.12.0"
    },
    {
      "id": "sys_789012",
      "name": "db-server-01",
      "host": "192.168.1.11",
      "port": "45876",
      "status": "degraded",
      "lastSeen": "2025-09-08T10:22:18Z",
      "agentVersion": "0.11.5"
    }
  ],
  "total": 2,
  "page": 1,
  "perPage": 20
}
添加新服务器

请求

POST /api/beszel/systems
Content-Type: application/json
Authorization: Bearer {token}

{
  "name": "cache-server-01",
  "host": "192.168.1.12",
  "port": "45876",
  "tags": ["redis", "cluster"],
  "checkInterval": 10000
}

响应(201 Created):

{
  "id": "sys_345678",
  "name": "cache-server-01",
  "token": "utm_abcdef123456",
  "fingerprint": "",
  "created": "2025-09-08T10:30:15Z"
}

关键提示:返回的token需妥善保存,用于Agent节点注册。每个令牌仅可绑定一个服务器指纹,增强安全性。

实时监控API

Beszel通过WebSocket提供毫秒级数据推送,适用于实时仪表盘和告警场景。建立连接前需完成认证握手:

WebSocket连接流程
  1. 获取认证密钥
GET /api/beszel/getkey
Authorization: Bearer {token}

响应包含服务器公钥和版本信息:

{
  "key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB3Q...",
  "v": "0.12.0"
}
  1. 建立WebSocket连接
const ws = new WebSocket(`wss://hub.example.com/api/beszel/agent-connect?token=${agentToken}`);

ws.binaryType = 'arraybuffer';

ws.onopen = () => {
  console.log('WebSocket连接已建立');
  // 发送CBOR编码的认证请求
  const authFrame = cbor.encode({
    action: "auth",
    timestamp: Date.now(),
    signature: signChallenge(publicKey, challenge)
  });
  ws.send(authFrame);
};

ws.onmessage = (event) => {
  const data = cbor.decode(new Uint8Array(event.data));
  if (data.type === "system_stats") {
    updateDashboard(data.payload);
  }
};
  1. 数据推送格式: 服务器会定期推送系统状态(默认5秒间隔),采用CBOR二进制编码优化传输效率:
{
  "type": "system_stats",
  "systemId": "sys_123456",
  "timestamp": 1694159023456,
  "payload": {
    "stats": {
      "cpu": 12.5,
      "mem": 32.8,
      "memUsed": 8192,
      "diskReadPs": 45.2,
      "diskWritePs": 12.8,
      "networkSent": 2.4,
      "networkRecv": 5.1,
      "temperatures": {
        "cpu": 45.3,
        "gpu": 58.7
      }
    },
    "containers": [
      {
        "name": "nginx-proxy",
        "cpu": 3.2,
        "mem": 8.5,
        "networkSent": 1.2,
        "networkRecv": 3.7
      }
    ]
  }
}

性能优化:CBOR相比JSON减少40%传输量,配合增量更新机制,在100节点场景下可将带宽占用控制在5Mbps以内。

历史数据API

Beszel自动对监控数据进行多级聚合,平衡实时性和存储效率:

聚合级别数据间隔保留周期应用场景
1m60秒24小时问题排查
10m10分钟7天趋势分析
20m20分钟30天容量规划
120m2小时90天季度报告
查询历史数据

请求

GET /api/beszel/history/system/sys_123456?metric=cpu,mem&start=1694072400&end=1694158800&interval=10m
Authorization: Bearer {token}

响应

{
  "systemId": "sys_123456",
  "interval": "10m",
  "metrics": ["cpu", "mem"],
  "data": [
    {
      "timestamp": 1694072400,
      "cpu": 15.2,
      "mem": 32.5
    },
    {
      "timestamp": 1694073000,
      "cpu": 18.7,
      "mem": 34.2
    },
    // ... 更多数据点
  ]
}

高级参数:使用agg=max可获取指定时间段内的峰值数据,fill=previous可处理数据缺失问题。

告警管理API

Beszel提供细粒度的告警配置,支持CPU、内存、磁盘、网络等多维度指标监控:

创建告警规则

请求

POST /api/beszel/user-alerts
Content-Type: application/json
Authorization: Bearer {token}

{
  "name": "high_cpu",
  "value": 85.0,
  "min": 5,
  "systems": ["sys_123456", "sys_789012"],
  "overwrite": false
}

参数说明:

  • name: 告警名称,对应指标类型(cpu/mem/disk等)
  • value: 阈值,超过此值触发告警
  • min: 持续时间(分钟),避免瞬时波动误报
  • systems: 应用此规则的服务器ID列表
  • overwrite: 是否覆盖已有同名规则

响应(200 OK):

{
  "success": true,
  "created": 2,
  "updated": 0
}
查询告警历史

请求

GET /api/beszel/alerts/history?systemId=sys_123456&start=1694072400&end=1694158800
Authorization: Bearer {token}

响应

{
  "alerts": [
    {
      "id": "alert_987654",
      "name": "high_cpu",
      "systemId": "sys_123456",
      "triggeredAt": 1694102400,
      "resolvedAt": 1694103600,
      "severity": "warning",
      "details": {
        "maxValue": 92.3,
        "avgValue": 87.6,
        "threshold": 85.0
      }
    }
  ],
  "total": 1
}

数据模型详解

深入理解Beszel数据结构是实现高级整合的基础。系统核心指标采用扁平化设计,兼顾查询效率和扩展性:

系统性能指标模型

type Stats struct {
    Cpu            float64             `json:"cpu" cbor:"0,keyasint"`
    Mem            float64             `json:"m" cbor:"2,keyasint"`         // 内存使用率(%)
    MemUsed        float64             `json:"mu" cbor:"3,keyasint"`        // 使用内存(MB)
    MemPct         float64             `json:"mp" cbor:"4,keyasint"`        // 内存占比(%)
    DiskTotal      float64             `json:"d" cbor:"9,keyasint"`         // 磁盘总量(GB)
    DiskUsed       float64             `json:"du" cbor:"10,keyasint"`       // 使用磁盘(GB)
    DiskReadPs     float64             `json:"dr" cbor:"12,keyasint"`       // 磁盘读(MB/s)
    DiskWritePs    float64             `json:"dw" cbor:"13,keyasint"`       // 磁盘写(MB/s)
    NetworkSent    float64             `json:"ns" cbor:"16,keyasint"`       // 网络发送(MB/s)
    NetworkRecv    float64             `json:"nr" cbor:"17,keyasint"`       // 网络接收(MB/s)
    Temperatures   map[string]float64  `json:"t,omitempty" cbor:"20,keyasint,omitempty"`
    LoadAvg        [3]float64          `json:"la,omitempty" cbor:"28,keyasint"` // 负载均值(1/5/15分钟)
    Battery        [2]uint8            `json:"bat,omitzero" cbor:"29,keyasint,omitzero"` // 电池状态
}

Docker容器指标模型

type ContainerStats struct {
    Name        string  `json:"n" cbor:"0,keyasint"`
    Cpu         float64 `json:"c" cbor:"1,keyasint"`         // CPU使用率(%)
    Mem         float64 `json:"m" cbor:"2,keyasint"`         // 内存使用率(%)
    NetworkSent float64 `json:"ns" cbor:"3,keyasint"`        // 网络发送(MB/s)
    NetworkRecv float64 `json:"nr" cbor:"4,keyasint"`        // 网络接收(MB/s)
}

设计亮点:采用CBOR整数键(keyasint)进一步压缩数据体积,在大规模部署中可显著降低带宽成本。

高级应用场景

自定义数据聚合

利用历史数据API和聚合函数,可实现业务相关的复合指标计算。例如,计算Web服务器集群的请求响应时间与CPU使用率的相关性:

// 获取Web服务器组的CPU和响应时间数据
async function getCorrelationData() {
  const cpuData = await fetchHistoryData({
    systemIds: webServerGroup,
    metric: 'cpu',
    interval: '10m',
    start: dayjs().subtract(1, 'day').unix()
  });
  
  const rtData = await fetchCustomMetric({
    query: 'avg(rate(http_request_duration_seconds_sum[5m]))',
    start: dayjs().subtract(1, 'day').unix()
  });
  
  // 计算皮尔逊相关系数
  const correlation = pearsonCorrelation(
    cpuData.series.map(p => p.value),
    rtData.series.map(p => p.value)
  );
  
  return { correlation, cpuData, rtData };
}

分布式追踪整合

通过注入自定义标签,可将监控数据与分布式追踪系统关联:

// Agent端自定义指标注入
func injectTracingMetrics(stats *system.Stats, span trace.Span) {
    stats.Extra = map[string]interface{}{
        "traceId": span.SpanContext().TraceID().String(),
        "spanId": span.SpanContext().SpanID().String(),
        "service": "payment-api",
    }
}

// Hub端数据关联存储
func storeWithTrace(ctx context.Context, stats *system.Stats) error {
    traceId := stats.Extra["traceId"].(string)
    spanId := stats.Extra["spanId"].(string)
    
    // 关联存储性能指标与追踪数据
    return db.Exec(ctx, `
        INSERT INTO traced_metrics (trace_id, span_id, service, cpu, mem)
        VALUES ($1, $2, $3, $4, $5)
    `, traceId, spanId, stats.Extra["service"], stats.Cpu, stats.Mem)
}

最佳实践与性能优化

API调用频率控制

  • 实时数据:WebSocket连接保持长连接,避免频繁重连开销
  • 批量操作:使用systems批量参数,减少请求次数
  • 缓存策略:对静态配置(如服务器列表)设置5分钟本地缓存
  • 增量同步:通过If-Modified-Since头减少冗余传输

错误处理与重试机制

推荐实现指数退避重试算法处理临时故障:

async function fetchWithRetry(url, options, retries = 3, backoff = 1000) {
  try {
    const response = await fetch(url, options);
    if (!response.ok && response.status >= 500 && retries > 0) {
      // 服务器错误,进行重试
      await new Promise(resolve => setTimeout(resolve, backoff));
      return fetchWithRetry(url, options, retries - 1, backoff * 2);
    }
    return response;
  } catch (error) {
    if (retries > 0 && isNetworkError(error)) {
      await new Promise(resolve => setTimeout(resolve, backoff));
      return fetchWithRetry(url, options, retries - 1, backoff * 2);
    }
    throw error;
  }
}

安全加固措施

  1. 传输安全:强制使用WSS/HTTPS,禁用明文传输
  2. 令牌管理:实现令牌轮换机制,定期自动更新Agent令牌
  3. 数据加密:敏感指标(如磁盘IO)可启用端到端加密
  4. 访问控制:基于RBAC模型限制API访问范围,示例策略:
{
  "roles": {
    "viewer": {
      "permissions": [
        "GET /api/beszel/systems",
        "GET /api/beszel/history/*"
      ]
    },
    "operator": {
      "permissions": [
        "GET /api/beszel/*",
        "POST /api/beszel/user-alerts",
        "DELETE /api/beszel/user-alerts"
      ]
    },
    "admin": {
      "permissions": ["*"]
    }
  }
}

总结与未来展望

Beszel API通过精心设计的端点结构、高效的数据编码和灵活的集成能力,为构建企业级监控系统提供了坚实基础。从单节点部署到跨数据中心架构,其可扩展性设计确保系统能够随业务增长平滑扩展。

即将发布的功能预告

  • gRPC接口支持,进一步提升跨语言调用体验
  • Prometheus原生协议兼容,简化现有监控系统迁移
  • 机器学习异常检测API,自动识别性能瓶颈

通过本文介绍的API能力,你已经掌握了从基础监控到高级数据整合的全流程技能。建议先从服务器资源监控入手,逐步扩展到业务指标关联,最终实现DevOps数据驱动决策的闭环。

立即行动

  1. 部署Beszel Hub并注册首个Agent节点
  2. 调用/api/beszel/systems验证基础监控
  3. 配置CPU和内存告警规则
  4. 集成WebSocket实现实时仪表盘

完整API文档和客户端SDK可通过官方代码仓库获取,持续关注版本更新以获取最新功能。


附录:API速查表

端点方法功能认证要求
/api/beszel/systemsGET获取服务器列表
/api/beszel/systemsPOST添加服务器管理员
/api/beszel/getkeyGET获取WebSocket密钥
/api/beszel/agent-connectWS实时数据推送令牌认证
/api/beszel/history/*GET查询历史数据
/api/beszel/user-alertsPOST创建告警规则非只读用户
/api/beszel/user-alertsDELETE删除告警规则非只读用户
/api/beszel/config-yamlGET获取配置文件管理员

【免费下载链接】beszel Lightweight server monitoring hub with historical data, docker stats, and alerts. 【免费下载链接】beszel 项目地址: https://gitcode.com/GitHub_Trending/be/beszel

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

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

抵扣说明:

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

余额充值