Beszel API完全手册:从基础调用到高级监控数据整合
引言:解决分布式服务器监控的痛点
你是否还在为跨平台服务器监控的复杂性而困扰?面对Docker容器与物理机混合架构,如何实现统一的数据采集与分析?当服务器数量超过10台,如何避免监控系统自身成为性能瓶颈?Beszel作为轻量级服务器监控中枢(Lightweight server monitoring hub),通过精心设计的API体系提供了完整解决方案。本文将系统讲解其API设计理念、核心端点调用方法、数据整合策略及高级应用场景,帮助你在30分钟内构建企业级监控系统。
读完本文后,你将能够:
- 掌握基于JWT的认证机制与权限控制
- 实现服务器性能指标的实时采集与历史分析
- 配置智能告警规则并集成第三方通知系统
- 利用WebSocket实现毫秒级数据推送
- 构建自定义仪表盘与数据可视化方案
API架构总览
Beszel采用"中枢-代理"(Hub-Agent)架构,所有API交互通过Hub节点中转,Agent负责本地数据采集。这种设计带来三大优势:单点认证简化权限管理、批量操作提升效率、多级缓存优化性能。
技术架构图
核心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)认证,配合短期访问令牌与长期刷新令牌机制。认证流程分为三个步骤:
- 获取初始令牌:
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"
}
- API请求格式: 所有需要认证的请求必须在HTTP头部包含:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- 令牌刷新: 建议在令牌过期前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连接流程
- 获取认证密钥:
GET /api/beszel/getkey
Authorization: Bearer {token}
响应包含服务器公钥和版本信息:
{
"key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB3Q...",
"v": "0.12.0"
}
- 建立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);
}
};
- 数据推送格式: 服务器会定期推送系统状态(默认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自动对监控数据进行多级聚合,平衡实时性和存储效率:
| 聚合级别 | 数据间隔 | 保留周期 | 应用场景 |
|---|---|---|---|
| 1m | 60秒 | 24小时 | 问题排查 |
| 10m | 10分钟 | 7天 | 趋势分析 |
| 20m | 20分钟 | 30天 | 容量规划 |
| 120m | 2小时 | 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;
}
}
安全加固措施
- 传输安全:强制使用WSS/HTTPS,禁用明文传输
- 令牌管理:实现令牌轮换机制,定期自动更新Agent令牌
- 数据加密:敏感指标(如磁盘IO)可启用端到端加密
- 访问控制:基于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数据驱动决策的闭环。
立即行动:
- 部署Beszel Hub并注册首个Agent节点
- 调用
/api/beszel/systems验证基础监控 - 配置CPU和内存告警规则
- 集成WebSocket实现实时仪表盘
完整API文档和客户端SDK可通过官方代码仓库获取,持续关注版本更新以获取最新功能。
附录:API速查表
| 端点 | 方法 | 功能 | 认证要求 |
|---|---|---|---|
/api/beszel/systems | GET | 获取服务器列表 | 是 |
/api/beszel/systems | POST | 添加服务器 | 管理员 |
/api/beszel/getkey | GET | 获取WebSocket密钥 | 是 |
/api/beszel/agent-connect | WS | 实时数据推送 | 令牌认证 |
/api/beszel/history/* | GET | 查询历史数据 | 是 |
/api/beszel/user-alerts | POST | 创建告警规则 | 非只读用户 |
/api/beszel/user-alerts | DELETE | 删除告警规则 | 非只读用户 |
/api/beszel/config-yaml | GET | 获取配置文件 | 管理员 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



