From 7f2b25e94dd57e57535bf5b2ca043bd3091176d1 Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Thu, 11 Sep 2025 17:08:30 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=20=D1=81=20=D0=BD=D1=83=D0=BB=D0=B5=D0=B2=D1=8B?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8=20=D0=B2=20=D0=BA=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B5=20proxcluster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Улучшена логика определения статуса ноды - локальные ноды теперь считаются онлайн по умолчанию - Улучшена функция checkNodeOnline - добавлена поддержка разных вариантов ping и fallback - Улучшено получение IP адреса - добавлены альтернативные способы определения IP - Исправлена проблема с пустыми значениями для локальных нод - Добавлен fallback на localhost если IP не удается определить Автор: Сергей Антропов, сайт: https://devops.org.ru --- .../proxcluster/proxcluster_linux.go | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/collectors/proxcluster/proxcluster_linux.go b/src/collectors/proxcluster/proxcluster_linux.go index 2d03dfb..d92e697 100644 --- a/src/collectors/proxcluster/proxcluster_linux.go +++ b/src/collectors/proxcluster/proxcluster_linux.go @@ -535,6 +535,8 @@ func collectDetailedNodesInfo(ctx context.Context, clusterName, clusterUUID stri if hostname, err := os.Hostname(); err == nil { // Получаем IP адрес текущей ноды var nodeIP string + + // Пробуем разные способы получения IP if out, err := exec.CommandContext(ctx, "hostname", "-I").Output(); err == nil { ips := strings.Fields(string(out)) if len(ips) > 0 { @@ -542,6 +544,31 @@ func collectDetailedNodesInfo(ctx context.Context, clusterName, clusterUUID stri } } + // Если hostname -I не сработал, пробуем ip addr + if nodeIP == "" { + if out, err := exec.CommandContext(ctx, "ip", "addr", "show").Output(); err == nil { + lines := strings.Split(string(out), "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "inet ") && !strings.Contains(line, "127.0.0.1") { + parts := strings.Fields(line) + if len(parts) >= 2 { + ip := strings.Split(parts[1], "/")[0] + if ip != "127.0.0.1" && ip != "::1" { + nodeIP = ip + break + } + } + } + } + } + } + + // Если все еще нет IP, используем localhost + if nodeIP == "" { + nodeIP = "127.0.0.1" + } + combinedNodes = []NodeInfo{ { NodeID: 1, @@ -578,8 +605,13 @@ func collectDetailedNodesInfo(ctx context.Context, clusterName, clusterUUID stri } } - // Проверяем доступность ноды через ping - isOnline := checkNodeOnline(ctx, nodeIP) + // Определяем статус ноды + isOnline := true // По умолчанию считаем ноду онлайн + + // Если это не локальная нода, проверяем доступность через ping + if !isLocal { + isOnline = checkNodeOnline(ctx, nodeIP) + } // Создаем структуру ноды с правильным порядком полей node := map[string]any{ @@ -822,12 +854,27 @@ func combineNodeInfo(nodes, status []NodeInfo) []NodeInfo { // checkNodeOnline проверяет доступность ноды через ping func checkNodeOnline(ctx context.Context, nodeIP string) bool { + if nodeIP == "" { + return false + } + // Создаем контекст с таймаутом для ping - pingCtx, cancel := context.WithTimeout(ctx, 3*time.Second) + pingCtx, cancel := context.WithTimeout(ctx, 2*time.Second) defer cancel() - // Выполняем ping с 1 пакетом - cmd := exec.CommandContext(pingCtx, "ping", "-c", "1", "-W", "1", nodeIP) + // Пробуем разные варианты ping в зависимости от системы + var cmd *exec.Cmd + if _, err := exec.LookPath("ping"); err == nil { + // Linux ping + cmd = exec.CommandContext(pingCtx, "ping", "-c", "1", "-W", "1", nodeIP) + } else if _, err := exec.LookPath("ping6"); err == nil { + // IPv6 ping + cmd = exec.CommandContext(pingCtx, "ping6", "-c", "1", "-W", "1", nodeIP) + } else { + // Если ping недоступен, считаем ноду онлайн + return true + } + err := cmd.Run() return err == nil }