func()

in systemtest/apmservertest/server.go [395:458]


func (s *Server) waitUntilListening(tls bool, logs *LogEntryIterator) error {
	// First wait for the Beat UUID and server version to be logged.
	for entry := range logs.C() {
		if entry.Level != zapcore.InfoLevel || (entry.Message != "Beat info" && entry.Message != "Build info") {
			continue
		}
		systemInfo, ok := entry.Fields["system_info"].(map[string]interface{})
		if !ok {
			continue
		}
		for k, info := range systemInfo {
			switch k {
			case "beat":
				beatInfo := info.(map[string]interface{})
				s.BeatUUID = beatInfo["uuid"].(string)
			case "build":
				buildInfo := info.(map[string]interface{})
				s.Version = buildInfo["version"].(string)
			}
		}
		if s.BeatUUID != "" && s.Version != "" {
			break
		}
	}

	var elasticHTTPListeningAddr string
	for entry := range logs.C() {
		if entry.Level != zapcore.InfoLevel {
			continue
		}
		sep := strings.LastIndex(entry.Message, ": ")
		if sep == -1 {
			continue
		}
		prefix, addr := entry.Message[:sep], strings.TrimSpace(entry.Message[sep+1:])
		if prefix != "Listening on" {
			continue
		}
		if _, _, err := net.SplitHostPort(addr); err != nil {
			return fmt.Errorf("invalid listening address %q: %w", addr, err)
		}
		elasticHTTPListeningAddr = addr
		break
	}

	if elasticHTTPListeningAddr != "" {
		urlScheme := "http"
		if tls {
			urlScheme = "https"
		}
		s.URL = (&url.URL{Scheme: urlScheme, Host: elasticHTTPListeningAddr}).String()
		return nil
	}

	// Didn't find message, server probably exited...
	if err := s.Close(); err != nil {
		if err, ok := err.(*exec.ExitError); ok && err != nil {
			stderr, _ := io.ReadAll(s.Stderr)
			err.Stderr = stderr
		}
		return err
	}
	return errors.New("server exited cleanly without logging expected startup message")
}