fix: 修复Agent指标时区查询
- 统一Agent报告存储与查询的UTC时间边界 - 修复监控大屏、历史图表及离线判断取不到最新数据 - 增加UTC与UTC+8场景回归测试
This commit is contained in:
1 parent
d9106dde6e
commit
7bc416d22a
6 files changed
+83
-9
No files matched your search
@@ -2,9 +2,11 @@ package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"ezops/model"
|
||||
|
||||
@@ -76,3 +78,68 @@ func TestReceiveReportMatchesExistingAssetByIP(t *testing.T) {
|
||||
t.Fatalf("上报后产生重复资产: count=%d", serverCount)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetLatestReportsUsesUTCTimeBoundary(t *testing.T) {
|
||||
gin.SetMode(gin.TestMode)
|
||||
db, err := gorm.Open(sqlite.Open("file:agent_latest_utc?mode=memory&cache=shared"), &gorm.Config{
|
||||
Logger: gormlogger.Default.LogMode(gormlogger.Silent),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("打开测试数据库失败: %v", err)
|
||||
}
|
||||
if err := db.AutoMigrate(&model.Server{}, &model.AgentReport{}); err != nil {
|
||||
t.Fatalf("迁移测试表失败: %v", err)
|
||||
}
|
||||
if err := db.Exec("CREATE TABLE asset_regions (id INTEGER PRIMARY KEY, name TEXT)").Error; err != nil {
|
||||
t.Fatalf("创建区域测试表失败: %v", err)
|
||||
}
|
||||
|
||||
server := model.Server{
|
||||
Hostname: "c-redis-cluster-3",
|
||||
IP: "172.19.16.59",
|
||||
AgentVersion: "v2.1.0",
|
||||
AgentStatus: "online",
|
||||
DiskUsage: 5.56,
|
||||
}
|
||||
if err := db.Create(&server).Error; err != nil {
|
||||
t.Fatalf("创建测试资产失败: %v", err)
|
||||
}
|
||||
// 模拟 Agent 以 UTC 上报,同时应用运行在 UTC+8 时区。 // Logan.Li
|
||||
report := model.AgentReport{
|
||||
Hostname: server.Hostname,
|
||||
CPUUsage: 12.5,
|
||||
MemUsage: 39.7,
|
||||
CPUCores: 4,
|
||||
ReportTime: time.Now().UTC().Add(-time.Minute),
|
||||
}
|
||||
if err := db.Create(&report).Error; err != nil {
|
||||
t.Fatalf("创建 Agent 报告失败: %v", err)
|
||||
}
|
||||
|
||||
originalLocal := time.Local
|
||||
time.Local = time.FixedZone("UTC+8", 8*60*60)
|
||||
defer func() { time.Local = originalLocal }()
|
||||
|
||||
recorder := httptest.NewRecorder()
|
||||
c, _ := gin.CreateTestContext(recorder)
|
||||
c.Request = httptest.NewRequest(http.MethodGet, "/api/v1/agent/latest", nil)
|
||||
NewAgentHandler(db, nil, nil).GetLatestReports(c)
|
||||
if recorder.Code != http.StatusOK {
|
||||
t.Fatalf("查询返回码 = %d, body=%s", recorder.Code, recorder.Body.String())
|
||||
}
|
||||
|
||||
var response struct {
|
||||
Code int `json:"code"`
|
||||
Data []model.AgentLatestResponse `json:"data"`
|
||||
}
|
||||
if err := json.Unmarshal(recorder.Body.Bytes(), &response); err != nil {
|
||||
t.Fatalf("解析响应失败: %v", err)
|
||||
}
|
||||
if len(response.Data) != 1 {
|
||||
t.Fatalf("主机数量 = %d, body=%s", len(response.Data), recorder.Body.String())
|
||||
}
|
||||
got := response.Data[0]
|
||||
if got.AgentStatus != "online" || got.CPUUsage != 12.5 || got.MemUsage != 39.7 {
|
||||
t.Fatalf("最新指标未命中: status=%q cpu=%.1f mem=%.1f", got.AgentStatus, got.CPUUsage, got.MemUsage)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user