code: func (k *Kademlia) GetHealthInfo(pp *PeerPot) *Health {
  	k.lock.RLock()
  	defer k.lock.RUnlock()
  	if len(pp.NNSet) < k.NeighbourhoodSize {
  		log.Warn("peerpot NNSet < NeighbourhoodSize")
  	}
  	gotnn, countgotnn, culpritsgotnn := k.connectedNeighbours(pp.NNSet)
  	knownn, countknownn, culpritsknownn := k.knowNeighbours(pp.NNSet)
  	depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base)
  
  	// check saturation
  	saturated := k.isSaturated(pp.PeersPerBin, depth)
  
  	log.Trace(fmt.Sprintf("%08x: healthy: knowNNs: %v, gotNNs: %v, saturated: %v\n", k.base, knownn, gotnn, saturated))
  	return &Health{
  		KnowNN:           knownn,
  		CountKnowNN:      countknownn,
  		MissingKnowNN:    culpritsknownn,
  		ConnectNN:        gotnn,
  		CountConnectNN:   countgotnn,
  		MissingConnectNN: culpritsgotnn,
  		Saturated:        saturated,
  		Hive:             k.string(),
  	}
  }
docs: // GetHealthInfo reports the health state of the kademlia connectivity
  //
  // The PeerPot argument provides an all-knowing view of the network
  // The resulting Health object is a result of comparisons between
  // what is the actual composition of the kademlia in question (the receiver), and
  // what SHOULD it have been when we take all we know about the network into consideration.
  //
  // used for testing only