in contrib/utils/utils.go [324:369]
func FetchAPIServerCores(ctx context.Context, kubeCfgPath string) (map[string]int, error) {
logger := log.GetLogger(ctx)
logger.WithKeyValues("level", "info").LogKV("msg", "fetching apiserver's cores")
kr := NewKubectlRunner(kubeCfgPath, "")
fqdn, err := kr.FQDN(ctx, 0)
if err != nil {
return nil, fmt.Errorf("failed to get cluster fqdn: %w", err)
}
ips, nerr := NSLookup(fqdn)
if nerr != nil {
return nil, fmt.Errorf("failed get dns records of fqdn %s: %w", fqdn, nerr)
}
res := map[string]int{}
for _, ip := range ips {
cores, err := func() (int, error) {
data, err := kr.Metrics(ctx, 0, fqdn, ip)
if err != nil {
return 0, fmt.Errorf("failed to get metrics for ip %s: %w", ip, err)
}
lines := strings.Split(string(data), "\n")
for _, line := range lines {
if strings.HasPrefix(line, "go_sched_gomaxprocs_threads") {
vInStr := strings.Fields(line)[1]
v, err := strconv.Atoi(vInStr)
if err != nil {
return 0, fmt.Errorf("failed to parse go_sched_gomaxprocs_threads %s: %w", line, err)
}
return v, nil
}
}
return 0, fmt.Errorf("failed to get go_sched_gomaxprocs_threads")
}()
if err != nil {
logger.WithKeyValues("level", "warn").LogKV("msg", "failed to get cores", "ip", ip, "error", err)
continue
}
logger.LogKV(ip, cores)
res[ip] = cores
}
return res, nil
}