package services import ( "strings" "testing" "gopkg.in/yaml.v3" ) // 主机模式(PromtailConfig)生成的 YAML 必须能被解析, // 且系统日志任务不能用 cri 阶段(否则 syslog 格式解析失败丢行)。 func TestHostPromtailConfigValid(t *testing.T) { cfg := PromtailConfig("http://loki.log.svc:3100", "/var/log/myapp/*.log", "pre", `{"env":"pre"}`) var out map[string]interface{} if err := yaml.Unmarshal([]byte(cfg), &out); err != nil { t.Fatalf("生成的 promtail 配置不是合法 YAML: %v\n%s", err, cfg) } if _, ok := out["scrape_configs"]; !ok { t.Fatal("缺少 scrape_configs") } // 必须包含系统日志任务 if !strings.Contains(cfg, "job_name: system") { t.Fatal("缺少 system 日志采集任务") } if !strings.Contains(cfg, "/var/log/{messages,secure,cron,maillog,syslog,dmesg}") { t.Fatal("system 任务没有采集系统日志路径") } // 系统任务段内不能出现 cri 阶段 sysIdx := strings.Index(cfg, "job_name: system") if sysIdx < 0 { t.Fatal("找不到 system 任务") } if strings.Contains(cfg[sysIdx:], "- cri: {}") { t.Fatal("system 任务里错误地使用了 cri 阶段") } } // 容器/Cri 路径仍应保留 cri 解析与时间戳提取 func TestHostPromtailCRIPathKeepsCRIStage(t *testing.T) { cfg := PromtailConfig("http://loki:3100", "/var/log/pods/*/*/*.log", "pre", "") if !strings.Contains(cfg, "- cri: {}") { t.Fatal("CRI 路径应保留 cri 阶段") } var out map[string]interface{} if err := yaml.Unmarshal([]byte(cfg), &out); err != nil { t.Fatalf("YAML 非法: %v", err) } } // 普通应用文件不应套 cri,否则非 CRI 行会被丢弃 func TestHostPromtailPlainFileHasNoCRIStage(t *testing.T) { cfg := PromtailConfig("http://loki:3100", "/data/app/logs/*.log", "pre", "") if strings.Contains(cfg, "- cri: {}") { t.Fatal("普通应用日志不应使用 cri 阶段") } }