Sobes.tech
Middle+

Unapredite rešenje za top-10 u svakom namespace-u uzimajući u obzir da servisi mogu biti u različitim klasterima, ali u istom namespace-u (potrebno je objediniti)

sobes.tech АИ

Одговор од АИ

Если сервисы могут быть в разных кластерах, но принадлежат одному namespace, то для топ-10 по каждому namespace нужно агрегировать данные по namespace, объединяя результаты из всех кластеров.

Подход:

  1. Собрать метрики или данные по сервисам из всех кластеров.
  2. Объединить данные по ключу namespace.
  3. Для каждого namespace объединить все сервисы из разных кластеров.
  4. Отсортировать сервисы по нужному критерию (например, по нагрузке) и выбрать топ-10.

Пример на Go (упрощённо):

type ServiceData struct {
    Namespace string
    Service   string
    Metric    int
}

// servicesFromClusters — срез данных из разных кластеров
func Top10ByNamespace(servicesFromClusters [][]ServiceData) map[string][]ServiceData {
    combined := make(map[string][]ServiceData)

    // Объединяем данные по namespace
    for _, clusterData := range servicesFromClusters {
        for _, svc := range clusterData {
            combined[svc.Namespace] = append(combined[svc.Namespace], svc)
        }
    }

    result := make(map[string][]ServiceData)
    for ns, svcs := range combined {
        // Сортируем по метрике по убыванию
        sort.Slice(svcs, func(i, j int) bool {
            return svcs[i].Metric > svcs[j].Metric
        })
        // Берём топ-10
        limit := 10
        if len(svcs) < 10 {
            limit = len(svcs)
        }
        result[ns] = svcs[:limit]
    }

    return result
}

Такой подход позволяет агрегировать и ранжировать сервисы по namespace, независимо от того, в каких кластерах они находятся.