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  }