修复服务器收到数据后提示400的错误
This commit is contained in:
@@ -108,15 +108,6 @@ func HandleMetricsPost(c *gin.Context) {
|
||||
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
|
||||
if err := deviceStorage.UpdateDeviceStatus(deviceID, "active"); err != nil {
|
||||
// 只记录警告,不影响指标处理
|
||||
@@ -128,63 +119,86 @@ func HandleMetricsPost(c *gin.Context) {
|
||||
"agent_name": agentName,
|
||||
}
|
||||
|
||||
// 写入CPU指标
|
||||
if err := globalStorage.WriteMetric(c.Request.Context(), deviceID, "cpu", req.CPU, baseTags); err != nil {
|
||||
// 只记录警告,不影响后续指标处理
|
||||
log.Printf("Warning: Failed to write CPU metrics: %v", err)
|
||||
}
|
||||
// 处理请求体,支持单指标对象和指标数组
|
||||
var metricsList []MetricsRequest
|
||||
|
||||
// 写入内存指标
|
||||
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
|
||||
// 首先尝试解析为数组
|
||||
if err := c.ShouldBindJSON(&metricsList); err != nil {
|
||||
// 如果解析数组失败,尝试解析为单个对象
|
||||
var singleMetric MetricsRequest
|
||||
if err := c.ShouldBindJSON(&singleMetric); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Invalid request body",
|
||||
})
|
||||
return
|
||||
}
|
||||
// 添加挂载点标签
|
||||
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{
|
||||
"message": "Metrics received successfully",
|
||||
"count": len(metricsList),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user