mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
lib/promscrape/discovery/gce: discover per-zone instances for gce_sd_config
in parallel. This should reduce discovery latency
This commit is contained in:
parent
8665c2edb1
commit
9f39e618ed
2 changed files with 32 additions and 19 deletions
|
@ -53,9 +53,6 @@ func GetLabels(sdc *SDConfig) ([]map[string]string, error) {
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("cannot get API config: %s", err)
|
||||
}
|
||||
ms, err := getInstancesLabels(cfg)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error when fetching instances data from GCE: %s", err)
|
||||
}
|
||||
ms := getInstancesLabels(cfg)
|
||||
return ms, nil
|
||||
}
|
||||
|
|
|
@ -6,32 +6,48 @@ import (
|
|||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
|
||||
)
|
||||
|
||||
// getInstancesLabels returns labels for gce instances obtained from the given cfg
|
||||
func getInstancesLabels(cfg *apiConfig) ([]map[string]string, error) {
|
||||
insts, err := getInstances(cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
func getInstancesLabels(cfg *apiConfig) []map[string]string {
|
||||
insts := getInstances(cfg)
|
||||
var ms []map[string]string
|
||||
for _, inst := range insts {
|
||||
ms = inst.appendTargetLabels(ms, cfg.project, cfg.tagSeparator, cfg.port)
|
||||
}
|
||||
return ms, nil
|
||||
return ms
|
||||
}
|
||||
|
||||
func getInstances(cfg *apiConfig) ([]Instance, error) {
|
||||
var insts []Instance
|
||||
func getInstances(cfg *apiConfig) []Instance {
|
||||
// Collect instances for each zone in parallel
|
||||
type result struct {
|
||||
zone string
|
||||
insts []Instance
|
||||
err error
|
||||
}
|
||||
ch := make(chan result, len(cfg.zones))
|
||||
for _, zone := range cfg.zones {
|
||||
zoneInsts, err := getInstancesForProjectAndZone(cfg.client, cfg.project, zone, cfg.filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
go func(zone string) {
|
||||
insts, err := getInstancesForProjectAndZone(cfg.client, cfg.project, zone, cfg.filter)
|
||||
ch <- result{
|
||||
zone: zone,
|
||||
insts: insts,
|
||||
err: err,
|
||||
}
|
||||
insts = append(insts, zoneInsts...)
|
||||
}(zone)
|
||||
}
|
||||
return insts, nil
|
||||
var insts []Instance
|
||||
for range cfg.zones {
|
||||
r := <-ch
|
||||
if r.err != nil {
|
||||
logger.Errorf("cannot collect instances from zone %q: %s", r.zone, r.err)
|
||||
continue
|
||||
}
|
||||
insts = append(insts, r.insts...)
|
||||
}
|
||||
return insts
|
||||
}
|
||||
|
||||
func getInstancesForProjectAndZone(client *http.Client, project, zone, filter string) ([]Instance, error) {
|
||||
|
|
Loading…
Reference in a new issue