graph TD
A[主程序] -->|1. 创建| B[Discovery Manager]
A -->|2. 配置| C[Configs]
subgraph Discovery Manager
B -->|启动| D[Provider 1]
B -->|启动| E[Provider 2]
B -->|...| F[Provider N]
D -->|注册| G[Discoverer K8s]
E -->|注册| H[Discoverer Consul]
F -->|注册| I[Discoverer Static]
B -->|管理| J[Target Groups缓存]
B -->|同步| K[Sync Channel]
end
subgraph 服务发现实现
G -->|监听| L[Kubernetes API]
H -->|查询| M[Consul 服务目录]
I -->|加载| N[静态配置文件]
end
L -->|推送更新| D
M -->|推送更新| E
N -->|推送更新| F
D -->|3. 更新| J
E -->|3. 更新| J
F -->|3. 更新| J
J -->|4. 聚合| B
B -->|5. 分发| K
K -->|6. 消费| O[Scrape Manager]
// Manager maintains a set of discovery providers and sends each update to a map channel. // Targets are grouped by the target set name. // Manager 管理多个服务发现提供者,并将目标更新发送到同步通道 // 目标按目标集合名称分组 type Manager struct { logger *slog.Logger // 日志记录器,用于输出运行日志 name string// 管理器名称,用于标识和区分不同管理器实例 httpOpts []config.HTTPClientOption // HTTP客户端配置选项,传递给服务发现提供者
// 统计配置失败的次数 var failedCount int for name, scfg := range cfg { failedCount += m.registerProviders(scfg, name) } // 更新失败配置的指标 m.metrics.FailedConfigs.Set(float64(failedCount))
var ( wg sync.WaitGroup // 用于等待旧提供者完全停止 newProviders []*Provider // 保存更新后的提供者列表 )
// 保存参考目标组,用于初始化新订阅的目标 var refTargets map[string]*targetgroup.Group prov.mu.Lock()
// 更新目标组缓存 m.targetsMtx.Lock() for s := range prov.subs { refTargets = m.targets[poolKey{s, prov.name}] // 移除不再订阅的目标组 if _, ok := prov.newSubs[s]; !ok { delete(m.targets, poolKey{s, prov.name}) m.metrics.DiscoveredTargets.DeleteLabelValues(m.name, s) } } // 为新订阅初始化目标和指标 for s := range prov.newSubs { if _, ok := prov.subs[s]; !ok { m.metrics.DiscoveredTargets.WithLabelValues(s).Set(0) } if l := len(refTargets); l > 0 { m.targets[poolKey{s, prov.name}] = make(map[string]*targetgroup.Group, l) for k, v := range refTargets { m.targets[poolKey{s, prov.name}][k] = v } } } m.targetsMtx.Unlock()
graph TD
A[File SD Config] --> B[Discovery实例]
B --> C[文件监听和刷新]
subgraph "初始化阶段"
A
A1[SDConfig配置] --> A
A2[路径匹配规则] --> A
A3[刷新间隔设置] --> A
end
subgraph "核心组件"
B
B1[fsnotify.Watcher] --> B
B2[时间戳管理] --> B
B3[指标收集器] --> B
end
subgraph "文件监控流程"
C
C1[文件列表获取] --> C
C2[文件变化监听] --> C
C3[定期刷新机制] --> C
C4[目标组解析] --> C
C1 --> D[filepath.Glob匹配]
C2 --> E[fsnotify事件处理]
C3 --> F[定时器触发]
C4 --> G[JSON/YAML解析]
end
subgraph "事件处理"
E
E1[文件修改事件] --> E
E2[文件删除事件] --> E
E3[文件创建事件] --> E
E --> H[触发refresh]
end
subgraph "输出结果"
I[targetgroup.Group流] --> J[Prometheus服务发现]
G --> I
H --> I
end
style A fill:#e1f5fe
style B fill:#f3e5f5
style C fill:#e8f5e8
style I fill:#fff3e0