github.com/grafana/pyroscope@v1.18.0/pkg/metastore/discovery/dns.go (about)

     1  package discovery
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sync"
     7  
     8  	"github.com/go-kit/log"
     9  	"github.com/go-kit/log/level"
    10  	"github.com/grafana/dskit/dns"
    11  	"github.com/hashicorp/raft"
    12  )
    13  
    14  type DNSDiscovery struct {
    15  	logger   log.Logger
    16  	addr     string
    17  	provider *dns.Provider
    18  	m        sync.Mutex
    19  	upd      Updates
    20  	resolved []Server
    21  }
    22  
    23  func NewDNSDiscovery(l log.Logger, addr string, p *dns.Provider) *DNSDiscovery {
    24  	d := &DNSDiscovery{
    25  		logger:   log.With(l, "addr", addr, "component", "dns-discovery"),
    26  		addr:     addr,
    27  		provider: p,
    28  	}
    29  
    30  	return d
    31  }
    32  
    33  func (d *DNSDiscovery) Subscribe(updates Updates) {
    34  	d.m.Lock()
    35  	d.upd = updates
    36  	d.m.Unlock()
    37  	d.resolve()
    38  }
    39  
    40  func (d *DNSDiscovery) Rediscover() {
    41  	d.resolve()
    42  }
    43  
    44  func (d *DNSDiscovery) Close() {
    45  
    46  }
    47  
    48  func (d *DNSDiscovery) resolve() {
    49  	err := d.provider.Resolve(context.Background(), []string{d.addr})
    50  	if err != nil {
    51  		level.Error(d.logger).Log("msg", "failed to resolve DNS", "addr", d.addr, "err", err)
    52  		return
    53  	}
    54  	addrs := d.provider.Addresses()
    55  	if len(addrs) == 0 {
    56  		level.Error(d.logger).Log("msg", "failed to resolve DNS", "addr", d.addr, "err", "no addresses")
    57  		return
    58  	}
    59  	level.Debug(d.logger).Log("msg", "resolved DNS", "addr", d.addr, "addrs", fmt.Sprintf("%+v", addrs))
    60  
    61  	servers := make([]Server, 0, len(addrs))
    62  	for _, peer := range addrs {
    63  		servers = append(servers, Server{
    64  			Raft: raft.Server{
    65  				Suffrage: raft.Voter,
    66  				ID:       raft.ServerID(peer),
    67  				Address:  raft.ServerAddress(peer),
    68  			},
    69  		})
    70  	}
    71  	d.m.Lock()
    72  	defer d.m.Unlock()
    73  	d.resolved = servers
    74  	if d.upd != nil {
    75  		d.upd.Servers(servers)
    76  	}
    77  }