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 }