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")
}