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  }