github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/p2p/info.go (about) 1 package p2p 2 3 import ( 4 "bytes" 5 "fmt" 6 "net/http" 7 "strings" 8 9 "github.com/libp2p/go-libp2p-core/host" 10 "github.com/libp2p/go-libp2p-core/peer" 11 ma "github.com/multiformats/go-multiaddr" 12 ) 13 14 // InfoHandler is a handler to serve /p2p page in metrics. 15 func (s *Service) InfoHandler(w http.ResponseWriter, _ *http.Request) { 16 buf := new(bytes.Buffer) 17 if _, err := fmt.Fprintf(buf, `bootnode=%s 18 self=%s 19 20 %d peers 21 %v 22 `, 23 s.cfg.BootstrapNodeAddr, 24 s.selfAddresses(), 25 len(s.host.Network().Peers()), 26 formatPeers(s.host), // Must be last. Writes one entry per row. 27 ); err != nil { 28 log.WithError(err).Error("Failed to render p2p info page") 29 return 30 } 31 32 w.WriteHeader(http.StatusOK) 33 if _, err := w.Write(buf.Bytes()); err != nil { 34 log.WithError(err).Error("Failed to render p2p info page") 35 } 36 } 37 38 // selfAddresses formats the host data into dialable strings, comma separated. 39 func (s *Service) selfAddresses() string { 40 var addresses []string 41 if s.dv5Listener != nil { 42 addresses = append(addresses, s.dv5Listener.Self().String()) 43 } 44 for _, addr := range s.host.Addrs() { 45 addresses = append(addresses, addr.String()+"/p2p/"+s.host.ID().Pretty()) 46 } 47 return strings.Join(addresses, ",") 48 } 49 50 // Format peer list to dialable addresses, separated by new line. 51 func formatPeers(h host.Host) string { 52 var addresses []string 53 54 for _, pid := range h.Network().Peers() { 55 addresses = append(addresses, formatPeer(pid, h.Peerstore().PeerInfo(pid).Addrs)) 56 } 57 return strings.Join(addresses, "\n") 58 } 59 60 // Format single peer info to dialable addresses, comma separated. 61 func formatPeer(pid peer.ID, ma []ma.Multiaddr) string { 62 var addresses []string 63 for _, a := range ma { 64 addresses = append(addresses, a.String()+"/p2p/"+pid.Pretty()) 65 } 66 return strings.Join(addresses, ",") 67 }