github.com/grafana/pyroscope@v1.18.0/pkg/metastore/raftnode/node_info.go (about)

     1  package raftnode
     2  
     3  import (
     4  	"sort"
     5  
     6  	"github.com/grafana/pyroscope/pkg/metastore/raftnode/raftnodepb"
     7  	"github.com/grafana/pyroscope/pkg/util/build"
     8  )
     9  
    10  func (n *Node) NodeInfo() (*raftnodepb.NodeInfo, error) {
    11  	configFuture := n.raft.GetConfiguration()
    12  	err := configFuture.Error()
    13  	if err != nil {
    14  		return nil, err
    15  	}
    16  
    17  	config := configFuture.Configuration()
    18  	_, leaderID := n.raft.LeaderWithID()
    19  
    20  	info := &raftnodepb.NodeInfo{
    21  		ServerId:           n.config.ServerID,
    22  		AdvertisedAddress:  n.config.AdvertiseAddress,
    23  		State:              n.raft.State().String(),
    24  		LeaderId:           string(leaderID),
    25  		CommitIndex:        n.raft.CommitIndex(),
    26  		AppliedIndex:       n.raft.AppliedIndex(),
    27  		LastIndex:          n.raft.LastIndex(),
    28  		Stats:              statsProto(n.raft.Stats()),
    29  		Peers:              make([]*raftnodepb.NodeInfo_Peer, len(config.Servers)),
    30  		ConfigurationIndex: configFuture.Index(),
    31  		CurrentTerm:        n.raft.CurrentTerm(),
    32  		BuildVersion:       build.Version,
    33  		BuildRevision:      build.Revision,
    34  	}
    35  
    36  	for i, server := range config.Servers {
    37  		info.Peers[i] = &raftnodepb.NodeInfo_Peer{
    38  			ServerId:      string(server.ID),
    39  			ServerAddress: string(server.Address),
    40  			Suffrage:      server.Suffrage.String(),
    41  		}
    42  	}
    43  
    44  	return info, nil
    45  }
    46  
    47  func statsProto(m map[string]string) *raftnodepb.NodeInfo_Stats {
    48  	stats := &raftnodepb.NodeInfo_Stats{
    49  		Name:  make([]string, len(m)),
    50  		Value: make([]string, len(m)),
    51  	}
    52  	var i int
    53  	for name := range m {
    54  		stats.Name[i] = name
    55  		i++
    56  	}
    57  	sort.Strings(stats.Name)
    58  	for j, name := range stats.Name {
    59  		stats.Value[j] = m[name]
    60  	}
    61  	return stats
    62  }