diff --git a/agent/agent.json b/agent/agent.json index ce3330f..b6982e1 100644 --- a/agent/agent.json +++ b/agent/agent.json @@ -3,8 +3,8 @@ "id": "yunc", "name": "cloud", "device_id": "yunc", - "token": "0b1f00e76e28beaed3be71d13e25aceb", + "token": "bedb47554f06ebabc075b52d8320428f", "interval": "10s", "debug": true, - "api_port": 8082 + "api_port": 8081 } \ No newline at end of file diff --git a/backend/internal/handler/handler.go b/backend/internal/handler/handler.go index f997d8c..7e403f9 100644 --- a/backend/internal/handler/handler.go +++ b/backend/internal/handler/handler.go @@ -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), }) } diff --git a/backend/monitor-server b/backend/monitor-server index c69dddb..46c486e 100755 Binary files a/backend/monitor-server and b/backend/monitor-server differ