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 }