fix targetGroup that disappear totally
@@ -94,6 +94,7 @@ type discovery struct {
clientDatacenter string
tagSeparator string
logger log.Logger
+ oldSourceList map[string]bool
}
func (d *discovery) parseServiceNodes(resp *http.Response, name string) (*targetgroup.Group, error) {
@@ -180,6 +181,8 @@ func (d *discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
// list of targets simply because there may have been a timeout. If the service is actually
// gone as far as consul is concerned, that will be picked up during the next iteration of
// the outer loop.
+
+ newSourceList := make(map[string]bool)
for name := range srvs {
if name == "consul" {
continue
@@ -195,7 +198,17 @@ func (d *discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
break
}
tgs = append(tgs, tg)
+ newSourceList[tg.Source] = true
+ }
+ // when targetGroup disappear, send an update with empty targetList
+ for key := range d.oldSourceList {
+ if !newSourceList[key] {
+ tgs = append(tgs, &targetgroup.Group{
+ Source: key,
+ })
+ }
}
+ d.oldSourceList = newSourceList
if err == nil {
// We're returning all Consul services as a single targetgroup.
ch <- tgs
@@ -216,6 +229,7 @@ func newDiscovery(conf sdConfig) (*discovery, error) {
refreshInterval: conf.RefreshInterval,
tagSeparator: conf.TagSeparator,
logger: logger,
+ oldSourceList: make(map[string]bool),
}
return cd, nil
}
