修复服务器收到数据后提示400的错误

This commit is contained in:
Alex Yang
2025-12-02 23:52:53 +08:00
parent fdef8092b5
commit 8bad1544cd
3 changed files with 72 additions and 58 deletions

View File

@@ -3,8 +3,8 @@
"id": "yunc", "id": "yunc",
"name": "cloud", "name": "cloud",
"device_id": "yunc", "device_id": "yunc",
"token": "0b1f00e76e28beaed3be71d13e25aceb", "token": "bedb47554f06ebabc075b52d8320428f",
"interval": "10s", "interval": "10s",
"debug": true, "debug": true,
"api_port": 8082 "api_port": 8081
} }

View File

@@ -108,15 +108,6 @@ func HandleMetricsPost(c *gin.Context) {
agentName = device.Name agentName = device.Name
} }
// 解析请求体
var req MetricsRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "Invalid request body",
})
return
}
// 更新设备状态为active // 更新设备状态为active
if err := deviceStorage.UpdateDeviceStatus(deviceID, "active"); err != nil { if err := deviceStorage.UpdateDeviceStatus(deviceID, "active"); err != nil {
// 只记录警告,不影响指标处理 // 只记录警告,不影响指标处理
@@ -128,63 +119,86 @@ func HandleMetricsPost(c *gin.Context) {
"agent_name": agentName, "agent_name": agentName,
} }
// 写入CPU指标 // 处理请求体,支持单指标对象和指标数组
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "cpu", req.CPU, baseTags); err != nil { var metricsList []MetricsRequest
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write CPU metrics: %v", err)
}
// 写入内存指标 // 首先尝试解析为数组
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "memory", req.Memory, baseTags); err != nil { if err := c.ShouldBindJSON(&metricsList); err != nil {
// 只记录警告,不影响后续指标处理 // 如果解析数组失败,尝试解析为单个对象
log.Printf("Warning: Failed to write memory metrics: %v", err) var singleMetric MetricsRequest
} if err := c.ShouldBindJSON(&singleMetric); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
// 写入磁盘指标,支持多个挂载点 "error": "Invalid request body",
for mountpoint, usage := range req.Disk { })
// 为每个挂载点创建标签,包含基础标签和挂载点 return
tags := make(map[string]string)
// 复制基础标签
for k, v := range baseTags {
tags[k] = v
} }
// 添加挂载点标签 // 将单个对象添加到列表中
tags["mountpoint"] = mountpoint metricsList = append(metricsList, singleMetric)
}
// 写入磁盘指标 // 处理所有指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "disk", usage, tags); err != nil { for i, req := range metricsList {
// 写入CPU指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "cpu", req.CPU, baseTags); err != nil {
// 只记录警告,不影响后续指标处理 // 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write disk metrics for mountpoint %s: %v", mountpoint, err) log.Printf("Warning: Failed to write CPU metrics: %v", err)
}
// 写入内存指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "memory", req.Memory, baseTags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write memory metrics: %v", err)
}
// 写入磁盘指标,支持多个挂载点
for mountpoint, usage := range req.Disk {
// 为每个挂载点创建标签,包含基础标签和挂载点
tags := make(map[string]string)
// 复制基础标签
for k, v := range baseTags {
tags[k] = v
}
// 添加挂载点标签
tags["mountpoint"] = mountpoint
// 写入磁盘指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "disk", usage, tags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write disk metrics for mountpoint %s: %v", mountpoint, err)
}
}
// 写入网络发送指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "network_sent", float64(req.Network.BytesSent), baseTags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write network sent metrics: %v", err)
}
// 写入网络接收指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "network_received", float64(req.Network.BytesReceived), baseTags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write network received metrics: %v", err)
}
// 广播指标更新消息,只广播最后一个指标
if i == len(metricsList)-1 {
metrics := map[string]interface{}{
"cpu": req.CPU,
"memory": req.Memory,
"disk": req.Disk,
"network": map[string]uint64{
"bytes_sent": req.Network.BytesSent,
"bytes_received": req.Network.BytesReceived,
},
}
broadcastMetricsUpdate(deviceID, metrics)
} }
} }
// 写入网络发送指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "network_sent", float64(req.Network.BytesSent), baseTags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write network sent metrics: %v", err)
}
// 写入网络接收指标
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "network_received", float64(req.Network.BytesReceived), baseTags); err != nil {
// 只记录警告,不影响后续指标处理
log.Printf("Warning: Failed to write network received metrics: %v", err)
}
// 广播指标更新消息
metrics := map[string]interface{}{
"cpu": req.CPU,
"memory": req.Memory,
"disk": req.Disk,
"network": map[string]uint64{
"bytes_sent": req.Network.BytesSent,
"bytes_received": req.Network.BytesReceived,
},
}
broadcastMetricsUpdate(deviceID, metrics)
// 返回成功响应 // 返回成功响应
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"message": "Metrics received successfully", "message": "Metrics received successfully",
"count": len(metricsList),
}) })
} }

Binary file not shown.