feat(logs): 数据源连接方式自动探测
部署完成及启动时实测 cluster-svc(API proxy) 与 url 直连, 选择可用方式并落库,兼容平台/Loki 分别在主机或集群内的组合。
This commit is contained in:
1 parent
b433b5f9dd
commit
7624baa564
3 files changed
+61
No files matched your search
@@ -84,6 +84,8 @@ func main() {
|
||||
|
||||
// 清理旧版本删除部署后残留的托管数据源(幂等)
|
||||
services.CleanupOrphanManagedLogSources()
|
||||
// 异步重新探测运行中部署的数据源连接方式(平台/Loki 可能在主机或集群内)
|
||||
go services.EnsureLogSourcesForRunningDeployments()
|
||||
// 补齐/升级内置告警规则(幂等):启动即执行,存量环境也能拿到「默认启用+绑默认通道」
|
||||
seed.SeedAlertRules()
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
@@ -485,6 +486,32 @@ func CleanupOrphanManagedLogSources() {
|
||||
db.Unlock()
|
||||
}
|
||||
|
||||
// AutoDetectLogSource 探测数据源的可用连接方式,返回最终选择(cluster-svc / url)。
|
||||
//
|
||||
// 交付环境组合很多:平台可能在主机或集群内,Loki 也可能在主机或集群内。
|
||||
// cluster-svc 走 kube-apiserver 的 service proxy,不依赖集群 DNS;url 直连
|
||||
// 则需要平台能访问到该地址。这里按「代理优先、URL 兜底」实测,避免按部署
|
||||
// 模式硬编码导致某种组合连不上。
|
||||
func AutoDetectLogSource(ctx context.Context, src *models.LogSource) string {
|
||||
if src.ClusterID != nil {
|
||||
probe := *src
|
||||
probe.TargetType = "cluster-svc"
|
||||
if _, status, err := lokiProxyGET(ctx, &probe, "/ready", nil); err == nil && status == 200 {
|
||||
src.TargetType = "cluster-svc"
|
||||
return "cluster-svc"
|
||||
}
|
||||
}
|
||||
if src.URL != "" {
|
||||
probe := *src
|
||||
probe.TargetType = "url"
|
||||
if _, status, err := lokiProxyGET(ctx, &probe, "/ready", nil); err == nil && status == 200 {
|
||||
src.TargetType = "url"
|
||||
return "url"
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// EnsureLogSourceForDeployment 部署成功后自动注册查询数据源(host→url;k8s→cluster-svc)。
|
||||
// 已存在同名数据源时:平台托管的自动刷新连接信息,用户手填的不覆盖。
|
||||
func EnsureLogSourceForDeployment(d *models.LokiDeployment) {
|
||||
@@ -506,8 +533,18 @@ func EnsureLogSourceForDeployment(d *models.LokiDeployment) {
|
||||
// 这里换成主机真实 IP,平台才能连上。
|
||||
target.URL = reachableEndpoint(d)
|
||||
target.ClusterID = nil
|
||||
} else {
|
||||
// k8s 部署:集群内 Service 地址也记下来,作为 URL 直连候选
|
||||
target.URL = d.Endpoint
|
||||
}
|
||||
|
||||
// 实测可用性后决定连接方式:主机/集群内平台、主机/集群内 Loki 都兼容
|
||||
detectCtx, cancel := context.WithTimeout(context.Background(), 6*time.Second)
|
||||
if method := AutoDetectLogSource(detectCtx, target); method != "" {
|
||||
log.Printf("[log-source] %q 自动选择连接方式: %s", target.Name, method)
|
||||
}
|
||||
cancel()
|
||||
|
||||
db := repository.GetDB()
|
||||
db.Lock()
|
||||
for i := range db.LogSources {
|
||||
|
||||
Reference in new issue
Block a user