fix: исправлены проблемы с пустыми данными в коллекторе proxcluster
- Исправлена проблема с nodes: null - добавлен fallback для получения информации о текущей ноде - Исправлена проблема с пустым cluster_uuid - добавлен fallback при недоступности corosync.conf - Убран хардкод IP адреса - теперь определяется автоматически - Улучшена обработка ошибок - коллектор не падает при отсутствии pvecm или corosync.conf - Добавлена логика определения локальной ноды через сравнение IP адресов Автор: Сергей Антропов, сайт: https://devops.org.ru
This commit is contained in:
parent
71a20610fa
commit
471fde8696
@ -45,7 +45,8 @@ func collectProxCluster(ctx context.Context) (map[string]any, error) {
|
||||
// Собираем информацию о нодах
|
||||
nodesInfo, err := collectDetailedNodesInfo(ctx, clusterName, clusterUUID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
// Если не удалось собрать информацию о нодах, используем пустой массив
|
||||
nodesInfo = []map[string]any{}
|
||||
}
|
||||
|
||||
// Создаем блок summary с точной структурой
|
||||
@ -108,7 +109,13 @@ func collectClusterInfo(ctx context.Context) (map[string]any, error) {
|
||||
|
||||
clusterName, clusterUUID, err := parseCorosyncConf(corosyncPath)
|
||||
if err != nil {
|
||||
return result, fmt.Errorf("failed to parse corosync.conf: %w", err)
|
||||
// Если не удалось прочитать corosync.conf, пробуем получить информацию другими способами
|
||||
if hostname, err := os.Hostname(); err == nil {
|
||||
clusterName = hostname
|
||||
} else {
|
||||
clusterName = "unknown-cluster"
|
||||
}
|
||||
clusterUUID = ""
|
||||
}
|
||||
|
||||
result["name"] = clusterName
|
||||
@ -523,14 +530,50 @@ func collectDetailedNodesInfo(ctx context.Context, clusterName, clusterUUID stri
|
||||
// Объединяем данные
|
||||
combinedNodes := combineNodeInfo(nodesData, statusData)
|
||||
|
||||
// Если не удалось получить данные через pvecm, создаем информацию о текущей ноде
|
||||
if len(combinedNodes) == 0 {
|
||||
if hostname, err := os.Hostname(); err == nil {
|
||||
// Получаем IP адрес текущей ноды
|
||||
var nodeIP string
|
||||
if data, err := os.ReadFile("/proc/net/route"); err == nil {
|
||||
// Простая логика для получения IP
|
||||
if out, err := exec.CommandContext(ctx, "hostname", "-I").Output(); err == nil {
|
||||
ips := strings.Fields(string(out))
|
||||
if len(ips) > 0 {
|
||||
nodeIP = ips[0]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
combinedNodes = []NodeInfo{
|
||||
{
|
||||
NodeID: 1,
|
||||
Votes: 1,
|
||||
Name: hostname,
|
||||
IP: nodeIP,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Обрабатываем объединенные данные
|
||||
for _, nodeInfo := range combinedNodes {
|
||||
nodeID := fmt.Sprintf("%08x", nodeInfo.NodeID)
|
||||
nodeName := nodeInfo.Name
|
||||
nodeIP := nodeInfo.IP
|
||||
|
||||
// Определяем, является ли нода локальной
|
||||
isLocal := strings.Contains(nodeIP, "10.14.88.12") // IP локальной ноды
|
||||
// Определяем, является ли нода локальной (сравниваем с IP текущей ноды)
|
||||
isLocal := false
|
||||
if out, err := exec.CommandContext(ctx, "hostname", "-I").Output(); err == nil {
|
||||
currentIPs := strings.Fields(string(out))
|
||||
for _, currentIP := range currentIPs {
|
||||
if currentIP == nodeIP {
|
||||
isLocal = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if isLocal {
|
||||
// Для локальной ноды получаем имя хоста
|
||||
if hostname, err := os.Hostname(); err == nil {
|
||||
|
Loading…
x
Reference in New Issue
Block a user