github.com/grafana/pyroscope@v1.18.0/pkg/metastore/discovery/parse.go (about) 1 package discovery 2 3 import ( 4 "net" 5 "strings" 6 7 "github.com/go-kit/log" 8 "github.com/grafana/dskit/dns" 9 "github.com/hashicorp/raft" 10 "github.com/prometheus/client_golang/prometheus" 11 12 "github.com/grafana/pyroscope/pkg/metastore/discovery/kuberesolver" 13 ) 14 15 func NewDiscovery(l log.Logger, address string, reg prometheus.Registerer) (Discovery, error) { 16 if strings.HasPrefix(address, "dnssrvnoa+") { 17 p := dns.NewProvider(l, 18 prometheus.WrapRegistererWithPrefix( 19 "pyroscope_metastore_client_", 20 reg, 21 ), 22 dns.MiekgdnsResolverType) 23 return NewDNSDiscovery(l, address, p), nil 24 } 25 if strings.HasPrefix(address, "kubernetes:///") { 26 kubeClient, err := kuberesolver.NewInClusterK8sClient() 27 if err != nil { 28 return nil, err 29 } 30 return NewKubeResolverDiscovery(l, address, kubeClient) 31 } 32 peers := ParsePeers(address) 33 srvs := make([]Server, 0, len(peers)) 34 for _, peer := range peers { 35 srvs = append(srvs, Server{ 36 Raft: peer, 37 ResolvedAddress: string(peer.Address), 38 }) 39 } 40 return NewStaticDiscovery(srvs), nil 41 } 42 43 func ParsePeers(raw string) []raft.Server { 44 rpeers := strings.Split(raw, ",") 45 peers := make([]raft.Server, 0, len(rpeers)) 46 for _, rpeer := range rpeers { 47 peers = append(peers, ParsePeer(rpeer)) 48 } 49 return peers 50 } 51 52 func ParsePeer(raw string) raft.Server { 53 // The string may be "{addr}" or "{addr}/{node_id}". 54 parts := strings.SplitN(raw, "/", 2) 55 var addr string 56 var node string 57 if len(parts) == 2 { 58 addr = parts[0] 59 node = parts[1] 60 } else { 61 addr = raw 62 } 63 host, _, err := net.SplitHostPort(addr) 64 if err != nil { 65 // No port specified. 66 host = addr 67 } 68 if node == "" { 69 // No node_id specified. 70 node = host 71 } 72 return raft.Server{ 73 Suffrage: raft.Voter, 74 ID: raft.ServerID(node), 75 Address: raft.ServerAddress(addr), 76 } 77 }