fix(reliability): 采集器并发去重 + 备份恢复即时重载 + context 贯穿请求链

- CollectorService 安装/卸载按采集器互斥去重(重复触发不再并发 docker rm/run 互踩);删除后卸载失败留日志
- ApplyStagedBackup 替换文件后立即 Reload 内存态,消除「重启前旧内存落盘覆盖恢复文件」竞态;暂存文件名升级 lokistack.json(兼容旧名)
- GetUsage/Validate 全链路 context 贯穿:请求取消即中止 SSH/k8s 查询(异步调用点显式 Background)
This commit is contained in:
opsx committed 2026-10-29 13:29:25 +08:00
1 parent 9daaf7f403
commit 572efc89a4
9 files changed
+180 -29

No files matched your search

+10 -10
View File
@@ -69,18 +69,18 @@ type podMetricsResponse struct {
}
// GetUsage 采集某个 Loki 部署的资源用量(按部署模式分派)。
func (s *DeploymentService) GetUsage(id uint) (*ResourceUsage, error) {
func (s *DeploymentService) GetUsage(ctx context.Context, id uint) (*ResourceUsage, error) {
d, err := s.Get(id)
if err != nil {
return nil, err
}
switch d.Mode {
case "k8s-yaml":
return s.k8sUsage(d)
return s.k8sUsage(ctx, d)
case "host-docker":
return s.dockerUsage(d)
return s.dockerUsage(ctx, d)
case "host-binary":
return s.processUsage(d)
return s.processUsage(ctx, d)
default:
return nil, fmt.Errorf("不支持的部署模式:%s", d.Mode)
}
@@ -88,7 +88,7 @@ func (s *DeploymentService) GetUsage(id uint) (*ResourceUsage, error) {
// ---------- Kubernetes ----------
func (s *DeploymentService) k8sUsage(d *models.LokiDeployment) (*ResourceUsage, error) {
func (s *DeploymentService) k8sUsage(ctx context.Context, d *models.LokiDeployment) (*ResourceUsage, error) {
if d.Cluster == nil {
return nil, fmt.Errorf("部署未关联 Kubernetes 集群")
}
@@ -96,7 +96,7 @@ func (s *DeploymentService) k8sUsage(d *models.LokiDeployment) (*ResourceUsage,
if err != nil {
return nil, err
}
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
ctx, cancel := context.WithTimeout(ctx, 15*time.Second)
defer cancel()
ns := d.Namespace
@@ -192,7 +192,7 @@ func (s *DeploymentService) applyPrometheus(u *ResourceUsage) {
// ---------- host-docker ----------
func (s *DeploymentService) dockerUsage(d *models.LokiDeployment) (*ResourceUsage, error) {
func (s *DeploymentService) dockerUsage(ctx context.Context, d *models.LokiDeployment) (*ResourceUsage, error) {
if d.Host == nil {
return nil, fmt.Errorf("部署未关联主机")
}
@@ -202,7 +202,7 @@ func (s *DeploymentService) dockerUsage(d *models.LokiDeployment) (*ResourceUsag
}
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()
name := dockerContainerName(d.ID)
@@ -254,7 +254,7 @@ func (s *DeploymentService) dockerUsage(d *models.LokiDeployment) (*ResourceUsag
// ---------- host-binary ----------
func (s *DeploymentService) processUsage(d *models.LokiDeployment) (*ResourceUsage, error) {
func (s *DeploymentService) processUsage(ctx context.Context, d *models.LokiDeployment) (*ResourceUsage, error) {
if d.Host == nil {
return nil, fmt.Errorf("部署未关联主机")
}
@@ -264,7 +264,7 @@ func (s *DeploymentService) processUsage(d *models.LokiDeployment) (*ResourceUsa
}
defer client.Close()
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
ctx, cancel := context.WithTimeout(ctx, 15*time.Second)
defer cancel()
usage := &ResourceUsage{Mode: d.Mode, Source: "binary", Pod: "loki", Node: d.Host.HostIP}