From a69045e440ebb707ec40512f458ac4b9848e0940 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 25 Jun 2021 12:10:20 +0300 Subject: [PATCH] lib/promscrape: consistently sort service discovery routines This should simplify further maintenance of the code --- lib/promscrape/config.go | 310 +++++++++--------- .../discovery/digitalocean/digitalocean.go | 7 + lib/promscrape/discovery/dns/dns.go | 6 + lib/promscrape/discovery/docker/docker.go | 12 + lib/promscrape/discovery/ec2/ec2.go | 7 + lib/promscrape/discovery/eureka/eureka.go | 9 +- lib/promscrape/discovery/gce/gce.go | 7 + .../discovery/kubernetes/kubernetes.go | 7 + .../discovery/openstack/openstack.go | 7 + lib/promscrape/scraper.go | 66 ++-- 10 files changed, 239 insertions(+), 199 deletions(-) diff --git a/lib/promscrape/config.go b/lib/promscrape/config.go index 1f7e96d068..5611a4f95b 100644 --- a/lib/promscrape/config.go +++ b/lib/promscrape/config.go @@ -119,19 +119,19 @@ type ScrapeConfig struct { MetricRelabelConfigs []promrelabel.RelabelConfig `yaml:"metric_relabel_configs,omitempty"` SampleLimit int `yaml:"sample_limit,omitempty"` - StaticConfigs []StaticConfig `yaml:"static_configs,omitempty"` - FileSDConfigs []FileSDConfig `yaml:"file_sd_configs,omitempty"` - KubernetesSDConfigs []kubernetes.SDConfig `yaml:"kubernetes_sd_configs,omitempty"` - OpenStackSDConfigs []openstack.SDConfig `yaml:"openstack_sd_configs,omitempty"` ConsulSDConfigs []consul.SDConfig `yaml:"consul_sd_configs,omitempty"` - EurekaSDConfigs []eureka.SDConfig `yaml:"eureka_sd_configs,omitempty"` + DigitaloceanSDConfigs []digitalocean.SDConfig `yaml:"digitalocean_sd_configs,omitempty"` + DNSSDConfigs []dns.SDConfig `yaml:"dns_sd_configs,omitempty"` DockerSDConfigs []docker.DockerSDConfig `yaml:"docker_sd_configs,omitempty"` DockerSwarmSDConfigs []docker.DockerSwarmSDConfig `yaml:"dockerswarm_sd_configs,omitempty"` - DNSSDConfigs []dns.SDConfig `yaml:"dns_sd_configs,omitempty"` EC2SDConfigs []ec2.SDConfig `yaml:"ec2_sd_configs,omitempty"` + EurekaSDConfigs []eureka.SDConfig `yaml:"eureka_sd_configs,omitempty"` + FileSDConfigs []FileSDConfig `yaml:"file_sd_configs,omitempty"` GCESDConfigs []gce.SDConfig `yaml:"gce_sd_configs,omitempty"` - DigitaloceanSDConfigs []digitalocean.SDConfig `yaml:"digitalocean_sd_configs,omitempty"` HTTPSDConfigs []http.SDConfig `yaml:"http_sd_configs,omitempty"` + KubernetesSDConfigs []kubernetes.SDConfig `yaml:"kubernetes_sd_configs,omitempty"` + OpenStackSDConfigs []openstack.SDConfig `yaml:"openstack_sd_configs,omitempty"` + StaticConfigs []StaticConfig `yaml:"static_configs,omitempty"` // These options are supported only by lib/promscrape. RelabelDebug bool `yaml:"relabel_debug,omitempty"` @@ -163,17 +163,14 @@ func (sc *ScrapeConfig) mustStart(baseDir string) { } func (sc *ScrapeConfig) mustStop() { - for i := range sc.KubernetesSDConfigs { - sc.KubernetesSDConfigs[i].MustStop() - } - for i := range sc.OpenStackSDConfigs { - sc.OpenStackSDConfigs[i].MustStop() - } for i := range sc.ConsulSDConfigs { sc.ConsulSDConfigs[i].MustStop() } - for i := range sc.EurekaSDConfigs { - sc.EurekaSDConfigs[i].MustStop() + for i := range sc.DigitaloceanSDConfigs { + sc.DigitaloceanSDConfigs[i].MustStop() + } + for i := range sc.DNSSDConfigs { + sc.DNSSDConfigs[i].MustStop() } for i := range sc.DockerSDConfigs { sc.DockerSDConfigs[i].MustStop() @@ -181,21 +178,24 @@ func (sc *ScrapeConfig) mustStop() { for i := range sc.DockerSwarmSDConfigs { sc.DockerSwarmSDConfigs[i].MustStop() } - for i := range sc.DNSSDConfigs { - sc.DNSSDConfigs[i].MustStop() - } for i := range sc.EC2SDConfigs { sc.EC2SDConfigs[i].MustStop() } + for i := range sc.EurekaSDConfigs { + sc.EurekaSDConfigs[i].MustStop() + } for i := range sc.GCESDConfigs { sc.GCESDConfigs[i].MustStop() } - for i := range sc.DigitaloceanSDConfigs { - sc.DigitaloceanSDConfigs[i].MustStop() - } for i := range sc.HTTPSDConfigs { sc.HTTPSDConfigs[i].MustStop() } + for i := range sc.KubernetesSDConfigs { + sc.KubernetesSDConfigs[i].MustStop() + } + for i := range sc.OpenStackSDConfigs { + sc.OpenStackSDConfigs[i].MustStop() + } } // FileSDConfig represents file-based service discovery config. @@ -284,51 +284,18 @@ func getSWSByJob(sws []*ScrapeWork) map[string][]*ScrapeWork { return m } -// getKubernetesSDScrapeWork returns `kubernetes_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getKubernetesSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { +// getConsulSDScrapeWork returns `consul_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getConsulSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { swsPrevByJob := getSWSByJob(prev) dst := make([]*ScrapeWork, 0, len(prev)) for i := range cfg.ScrapeConfigs { sc := &cfg.ScrapeConfigs[i] dstLen := len(dst) ok := true - for j := range sc.KubernetesSDConfigs { - sdc := &sc.KubernetesSDConfigs[j] - swos, err := sdc.GetScrapeWorkObjects() - if err != nil { - logger.Errorf("skipping kubernetes_sd_config targets for job_name %q because of error: %s", sc.swc.jobName, err) - ok = false - break - } - for _, swo := range swos { - sw := swo.(*ScrapeWork) - dst = append(dst, sw) - } - } - if ok { - continue - } - swsPrev := swsPrevByJob[sc.swc.jobName] - if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering kubernetes_sd_config targets for job %q, so preserving the previous targets", sc.swc.jobName) - dst = append(dst[:dstLen], swsPrev...) - } - } - return dst -} - -// getOpenStackSDScrapeWork returns `openstack_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getOpenStackSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { - swsPrevByJob := getSWSByJob(prev) - dst := make([]*ScrapeWork, 0, len(prev)) - for i := range cfg.ScrapeConfigs { - sc := &cfg.ScrapeConfigs[i] - dstLen := len(dst) - ok := true - for j := range sc.OpenStackSDConfigs { - sdc := &sc.OpenStackSDConfigs[j] + for j := range sc.ConsulSDConfigs { + sdc := &sc.ConsulSDConfigs[j] var okLocal bool - dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "openstack_sd_config") + dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "consul_sd_config") if ok { ok = okLocal } @@ -338,7 +305,63 @@ func (cfg *Config) getOpenStackSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { } swsPrev := swsPrevByJob[sc.swc.jobName] if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering openstack targets for job %q, so preserving the previous targets", sc.swc.jobName) + logger.Errorf("there were errors when discovering consul targets for job %q, so preserving the previous targets", sc.swc.jobName) + dst = append(dst[:dstLen], swsPrev...) + } + } + return dst +} + +// getDigitalOceanDScrapeWork returns `digitalocean_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getDigitalOceanDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { + swsPrevByJob := getSWSByJob(prev) + dst := make([]*ScrapeWork, 0, len(prev)) + for i := range cfg.ScrapeConfigs { + sc := &cfg.ScrapeConfigs[i] + dstLen := len(dst) + ok := true + for j := range sc.DigitaloceanSDConfigs { + sdc := &sc.DigitaloceanSDConfigs[j] + var okLocal bool + dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "digitalocean_sd_config") + if ok { + ok = okLocal + } + } + if ok { + continue + } + swsPrev := swsPrevByJob[sc.swc.jobName] + if len(swsPrev) > 0 { + logger.Errorf("there were errors when discovering digitalocean targets for job %q, so preserving the previous targets", sc.swc.jobName) + dst = append(dst[:dstLen], swsPrev...) + } + } + return dst +} + +// getDNSSDScrapeWork returns `dns_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getDNSSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { + swsPrevByJob := getSWSByJob(prev) + dst := make([]*ScrapeWork, 0, len(prev)) + for i := range cfg.ScrapeConfigs { + sc := &cfg.ScrapeConfigs[i] + dstLen := len(dst) + ok := true + for j := range sc.DNSSDConfigs { + sdc := &sc.DNSSDConfigs[j] + var okLocal bool + dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "dns_sd_config") + if ok { + ok = okLocal + } + } + if ok { + continue + } + swsPrev := swsPrevByJob[sc.swc.jobName] + if len(swsPrev) > 0 { + logger.Errorf("there were errors when discovering dns targets for job %q, so preserving the previous targets", sc.swc.jobName) dst = append(dst[:dstLen], swsPrev...) } } @@ -401,18 +424,18 @@ func (cfg *Config) getDockerSwarmSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork return dst } -// getConsulSDScrapeWork returns `consul_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getConsulSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { +// getEC2SDScrapeWork returns `ec2_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getEC2SDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { swsPrevByJob := getSWSByJob(prev) dst := make([]*ScrapeWork, 0, len(prev)) for i := range cfg.ScrapeConfigs { sc := &cfg.ScrapeConfigs[i] dstLen := len(dst) ok := true - for j := range sc.ConsulSDConfigs { - sdc := &sc.ConsulSDConfigs[j] + for j := range sc.EC2SDConfigs { + sdc := &sc.EC2SDConfigs[j] var okLocal bool - dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "consul_sd_config") + dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "ec2_sd_config") if ok { ok = okLocal } @@ -422,7 +445,7 @@ func (cfg *Config) getConsulSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { } swsPrev := swsPrevByJob[sc.swc.jobName] if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering consul targets for job %q, so preserving the previous targets", sc.swc.jobName) + logger.Errorf("there were errors when discovering ec2 targets for job %q, so preserving the previous targets", sc.swc.jobName) dst = append(dst[:dstLen], swsPrev...) } } @@ -457,57 +480,24 @@ func (cfg *Config) getEurekaSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { return dst } -// getDNSSDScrapeWork returns `dns_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getDNSSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { - swsPrevByJob := getSWSByJob(prev) - dst := make([]*ScrapeWork, 0, len(prev)) - for i := range cfg.ScrapeConfigs { - sc := &cfg.ScrapeConfigs[i] - dstLen := len(dst) - ok := true - for j := range sc.DNSSDConfigs { - sdc := &sc.DNSSDConfigs[j] - var okLocal bool - dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "dns_sd_config") - if ok { - ok = okLocal - } - } - if ok { - continue - } - swsPrev := swsPrevByJob[sc.swc.jobName] - if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering dns targets for job %q, so preserving the previous targets", sc.swc.jobName) - dst = append(dst[:dstLen], swsPrev...) +// getFileSDScrapeWork returns `file_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getFileSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { + // Create a map for the previous scrape work. + swsMapPrev := make(map[string][]*ScrapeWork) + for _, sw := range prev { + filepath := promrelabel.GetLabelValueByName(sw.Labels, "__vm_filepath") + if len(filepath) == 0 { + logger.Panicf("BUG: missing `__vm_filepath` label") + } else { + swsMapPrev[filepath] = append(swsMapPrev[filepath], sw) } } - return dst -} - -// getEC2SDScrapeWork returns `ec2_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getEC2SDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { - swsPrevByJob := getSWSByJob(prev) dst := make([]*ScrapeWork, 0, len(prev)) for i := range cfg.ScrapeConfigs { sc := &cfg.ScrapeConfigs[i] - dstLen := len(dst) - ok := true - for j := range sc.EC2SDConfigs { - sdc := &sc.EC2SDConfigs[j] - var okLocal bool - dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "ec2_sd_config") - if ok { - ok = okLocal - } - } - if ok { - continue - } - swsPrev := swsPrevByJob[sc.swc.jobName] - if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering ec2 targets for job %q, so preserving the previous targets", sc.swc.jobName) - dst = append(dst[:dstLen], swsPrev...) + for j := range sc.FileSDConfigs { + sdc := &sc.FileSDConfigs[j] + dst = sdc.appendScrapeWork(dst, swsMapPrev, cfg.baseDir, sc.swc) } } return dst @@ -541,34 +531,6 @@ func (cfg *Config) getGCESDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { return dst } -// getDigitalOceanDScrapeWork returns `digitalocean_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getDigitalOceanDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { - swsPrevByJob := getSWSByJob(prev) - dst := make([]*ScrapeWork, 0, len(prev)) - for i := range cfg.ScrapeConfigs { - sc := &cfg.ScrapeConfigs[i] - dstLen := len(dst) - ok := true - for j := range sc.DigitaloceanSDConfigs { - sdc := &sc.DigitaloceanSDConfigs[j] - var okLocal bool - dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "digitalocean_sd_config") - if ok { - ok = okLocal - } - } - if ok { - continue - } - swsPrev := swsPrevByJob[sc.swc.jobName] - if len(swsPrev) > 0 { - logger.Errorf("there were errors when discovering digitalocean targets for job %q, so preserving the previous targets", sc.swc.jobName) - dst = append(dst[:dstLen], swsPrev...) - } - } - return dst -} - // getHTTPDScrapeWork returns `http_sd_configs` ScrapeWork from cfg. func (cfg *Config) getHTTPDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { swsPrevByJob := getSWSByJob(prev) @@ -597,24 +559,62 @@ func (cfg *Config) getHTTPDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { return dst } -// getFileSDScrapeWork returns `file_sd_configs` ScrapeWork from cfg. -func (cfg *Config) getFileSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { - // Create a map for the previous scrape work. - swsMapPrev := make(map[string][]*ScrapeWork) - for _, sw := range prev { - filepath := promrelabel.GetLabelValueByName(sw.Labels, "__vm_filepath") - if len(filepath) == 0 { - logger.Panicf("BUG: missing `__vm_filepath` label") - } else { - swsMapPrev[filepath] = append(swsMapPrev[filepath], sw) - } - } +// getKubernetesSDScrapeWork returns `kubernetes_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getKubernetesSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { + swsPrevByJob := getSWSByJob(prev) dst := make([]*ScrapeWork, 0, len(prev)) for i := range cfg.ScrapeConfigs { sc := &cfg.ScrapeConfigs[i] - for j := range sc.FileSDConfigs { - sdc := &sc.FileSDConfigs[j] - dst = sdc.appendScrapeWork(dst, swsMapPrev, cfg.baseDir, sc.swc) + dstLen := len(dst) + ok := true + for j := range sc.KubernetesSDConfigs { + sdc := &sc.KubernetesSDConfigs[j] + swos, err := sdc.GetScrapeWorkObjects() + if err != nil { + logger.Errorf("skipping kubernetes_sd_config targets for job_name %q because of error: %s", sc.swc.jobName, err) + ok = false + break + } + for _, swo := range swos { + sw := swo.(*ScrapeWork) + dst = append(dst, sw) + } + } + if ok { + continue + } + swsPrev := swsPrevByJob[sc.swc.jobName] + if len(swsPrev) > 0 { + logger.Errorf("there were errors when discovering kubernetes_sd_config targets for job %q, so preserving the previous targets", sc.swc.jobName) + dst = append(dst[:dstLen], swsPrev...) + } + } + return dst +} + +// getOpenStackSDScrapeWork returns `openstack_sd_configs` ScrapeWork from cfg. +func (cfg *Config) getOpenStackSDScrapeWork(prev []*ScrapeWork) []*ScrapeWork { + swsPrevByJob := getSWSByJob(prev) + dst := make([]*ScrapeWork, 0, len(prev)) + for i := range cfg.ScrapeConfigs { + sc := &cfg.ScrapeConfigs[i] + dstLen := len(dst) + ok := true + for j := range sc.OpenStackSDConfigs { + sdc := &sc.OpenStackSDConfigs[j] + var okLocal bool + dst, okLocal = appendSDScrapeWork(dst, sdc, cfg.baseDir, sc.swc, "openstack_sd_config") + if ok { + ok = okLocal + } + } + if ok { + continue + } + swsPrev := swsPrevByJob[sc.swc.jobName] + if len(swsPrev) > 0 { + logger.Errorf("there were errors when discovering openstack targets for job %q, so preserving the previous targets", sc.swc.jobName) + dst = append(dst[:dstLen], swsPrev...) } } return dst diff --git a/lib/promscrape/discovery/digitalocean/digitalocean.go b/lib/promscrape/discovery/digitalocean/digitalocean.go index d80c0abf46..1d9dd9bca2 100644 --- a/lib/promscrape/discovery/digitalocean/digitalocean.go +++ b/lib/promscrape/discovery/digitalocean/digitalocean.go @@ -1,9 +1,11 @@ package digitalocean import ( + "flag" "fmt" "net/url" "strings" + "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" @@ -11,6 +13,11 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/proxy" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.digitaloceanSDCheckInterval", time.Minute, "Interval for checking for changes in digital ocean. "+ + "This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details") + // SDConfig represents service discovery config for digital ocean. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config diff --git a/lib/promscrape/discovery/dns/dns.go b/lib/promscrape/discovery/dns/dns.go index 829daf700e..d6a791b1a6 100644 --- a/lib/promscrape/discovery/dns/dns.go +++ b/lib/promscrape/discovery/dns/dns.go @@ -2,6 +2,7 @@ package dns import ( "context" + "flag" "fmt" "net" "strconv" @@ -12,6 +13,11 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.dnsSDCheckInterval", 30*time.Second, "Interval for checking for changes in dns. "+ + "This works only if dns_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details") + // SDConfig represents service discovery config for DNS. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config diff --git a/lib/promscrape/discovery/docker/docker.go b/lib/promscrape/discovery/docker/docker.go index cb42feb46b..5763321a73 100644 --- a/lib/promscrape/discovery/docker/docker.go +++ b/lib/promscrape/discovery/docker/docker.go @@ -1,12 +1,24 @@ package docker import ( + "flag" "fmt" + "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" "github.com/VictoriaMetrics/VictoriaMetrics/lib/proxy" ) +// SDCheckInterval defines interval for docker targets refresh. +var SDCheckInterval = flag.Duration("promscrape.dockerSDCheckInterval", 30*time.Second, "Interval for checking for changes in docker. "+ + "This works only if docker_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details") + +// SwarmSDCheckInterval defines interval for dockerswarm targets refresh. +var SwarmSDCheckInterval = flag.Duration("promscrape.dockerswarmSDCheckInterval", 30*time.Second, "Interval for checking for changes in dockerswarm. "+ + "This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details") + // DockerSDConfig defines the `docker_sd` section for Docker based discovery // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config diff --git a/lib/promscrape/discovery/ec2/ec2.go b/lib/promscrape/discovery/ec2/ec2.go index 40f7062463..015909f404 100644 --- a/lib/promscrape/discovery/ec2/ec2.go +++ b/lib/promscrape/discovery/ec2/ec2.go @@ -1,9 +1,16 @@ package ec2 import ( + "flag" "fmt" + "time" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.ec2SDCheckInterval", time.Minute, "Interval for checking for changes in ec2. "+ + "This works only if ec2_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details") + // SDConfig represents service discovery config for ec2. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config diff --git a/lib/promscrape/discovery/eureka/eureka.go b/lib/promscrape/discovery/eureka/eureka.go index 1edb980cc1..492ae87526 100644 --- a/lib/promscrape/discovery/eureka/eureka.go +++ b/lib/promscrape/discovery/eureka/eureka.go @@ -2,15 +2,20 @@ package eureka import ( "encoding/xml" + "flag" "fmt" "strconv" + "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils" "github.com/VictoriaMetrics/VictoriaMetrics/lib/proxy" ) -const appsAPIPath = "/apps" +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.eurekaSDCheckInterval", 30*time.Second, "Interval for checking for changes in eureka. "+ + "This works only if eureka_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details") // SDConfig represents service discovery config for eureka. // @@ -82,7 +87,7 @@ func (sdc *SDConfig) GetLabels(baseDir string) ([]map[string]string, error) { if err != nil { return nil, fmt.Errorf("cannot get API config: %w", err) } - data, err := getAPIResponse(cfg, appsAPIPath) + data, err := getAPIResponse(cfg, "/apps") if err != nil { return nil, err } diff --git a/lib/promscrape/discovery/gce/gce.go b/lib/promscrape/discovery/gce/gce.go index baac5ab644..91b52b263b 100644 --- a/lib/promscrape/discovery/gce/gce.go +++ b/lib/promscrape/discovery/gce/gce.go @@ -1,9 +1,16 @@ package gce import ( + "flag" "fmt" + "time" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.gceSDCheckInterval", time.Minute, "Interval for checking for changes in gce. "+ + "This works only if gce_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details") + // SDConfig represents service discovery config for gce. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config diff --git a/lib/promscrape/discovery/kubernetes/kubernetes.go b/lib/promscrape/discovery/kubernetes/kubernetes.go index ea827b47a3..d3d446bc2b 100644 --- a/lib/promscrape/discovery/kubernetes/kubernetes.go +++ b/lib/promscrape/discovery/kubernetes/kubernetes.go @@ -1,12 +1,19 @@ package kubernetes import ( + "flag" "fmt" + "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" "github.com/VictoriaMetrics/VictoriaMetrics/lib/proxy" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.kubernetesSDCheckInterval", 30*time.Second, "Interval for checking for changes in Kubernetes API server. "+ + "This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details") + // SDConfig represents kubernetes-based service discovery config. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config diff --git a/lib/promscrape/discovery/openstack/openstack.go b/lib/promscrape/discovery/openstack/openstack.go index f7db68ab1e..5867afd2c6 100644 --- a/lib/promscrape/discovery/openstack/openstack.go +++ b/lib/promscrape/discovery/openstack/openstack.go @@ -1,11 +1,18 @@ package openstack import ( + "flag" "fmt" + "time" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth" ) +// SDCheckInterval defines interval for targets refresh. +var SDCheckInterval = flag.Duration("promscrape.openstackSDCheckInterval", 30*time.Second, "Interval for checking for changes in openstack API server. "+ + "This works only if openstack_sd_configs is configured in '-promscrape.config' file. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details") + // SDConfig is the configuration for OpenStack based service discovery. // // See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config diff --git a/lib/promscrape/scraper.go b/lib/promscrape/scraper.go index d9ddb9901b..4be1696c00 100644 --- a/lib/promscrape/scraper.go +++ b/lib/promscrape/scraper.go @@ -12,46 +12,28 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/procutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/consul" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/digitalocean" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/dns" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/docker" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/ec2" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/eureka" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/gce" "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/http" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/kubernetes" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discovery/openstack" "github.com/VictoriaMetrics/metrics" ) var ( configCheckInterval = flag.Duration("promscrape.configCheckInterval", 0, "Interval for checking for changes in '-promscrape.config' file. "+ "By default the checking is disabled. Send SIGHUP signal in order to force config check for changes") - fileSDCheckInterval = flag.Duration("promscrape.fileSDCheckInterval", 30*time.Second, "Interval for checking for changes in 'file_sd_config'. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details") - kubernetesSDCheckInterval = flag.Duration("promscrape.kubernetesSDCheckInterval", 30*time.Second, "Interval for checking for changes in Kubernetes API server. "+ - "This works only if kubernetes_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config for details") - openstackSDCheckInterval = flag.Duration("promscrape.openstackSDCheckInterval", 30*time.Second, "Interval for checking for changes in openstack API server. "+ - "This works only if openstack_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#openstack_sd_config for details") - eurekaSDCheckInterval = flag.Duration("promscrape.eurekaSDCheckInterval", 30*time.Second, "Interval for checking for changes in eureka. "+ - "This works only if eureka_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#eureka_sd_config for details") - dnsSDCheckInterval = flag.Duration("promscrape.dnsSDCheckInterval", 30*time.Second, "Interval for checking for changes in dns. "+ - "This works only if dns_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config for details") - ec2SDCheckInterval = flag.Duration("promscrape.ec2SDCheckInterval", time.Minute, "Interval for checking for changes in ec2. "+ - "This works only if ec2_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config for details") - gceSDCheckInterval = flag.Duration("promscrape.gceSDCheckInterval", time.Minute, "Interval for checking for changes in gce. "+ - "This works only if gce_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config for details") - dockerSDCheckInterval = flag.Duration("promscrape.dockerSDCheckInterval", 30*time.Second, "Interval for checking for changes in docker. "+ - "This works only if docker_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#docker_sd_config for details") - dockerswarmSDCheckInterval = flag.Duration("promscrape.dockerswarmSDCheckInterval", 30*time.Second, "Interval for checking for changes in dockerswarm. "+ - "This works only if dockerswarm_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dockerswarm_sd_config for details") - digitaloceanSDCheckInterval = flag.Duration("promscrape.digitaloceanSDCheckInterval", time.Minute, "Interval for checking for changes in digital ocean. "+ - "This works only if digitalocean_sd_configs is configured in '-promscrape.config' file. "+ - "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#digitalocean_sd_config for details") - promscrapeConfigFile = flag.String("promscrape.config", "", "Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. "+ - "See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details") suppressDuplicateScrapeTargetErrors = flag.Bool("promscrape.suppressDuplicateScrapeTargetErrors", false, "Whether to suppress 'duplicate scrape target' errors; "+ "see https://docs.victoriametrics.com/vmagent.html#troubleshooting for details") + promscrapeConfigFile = flag.String("promscrape.config", "", "Optional path to Prometheus config file with 'scrape_configs' section containing targets to scrape. "+ + "See https://docs.victoriametrics.com/#how-to-scrape-prometheus-exporters-such-as-node-exporter for details") + + fileSDCheckInterval = flag.Duration("promscrape.fileSDCheckInterval", 30*time.Second, "Interval for checking for changes in 'file_sd_config'. "+ + "See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#file_sd_config for details") ) // CheckConfig checks -promscrape.config for errors and unsupported options. @@ -108,19 +90,19 @@ func runScraper(configFile string, pushData func(wr *prompbmarshal.WriteRequest) cfg.mustStart() scs := newScrapeConfigs(pushData) - scs.add("static_configs", 0, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getStaticScrapeWork() }) - scs.add("file_sd_configs", *fileSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getFileSDScrapeWork(swsPrev) }) - scs.add("kubernetes_sd_configs", *kubernetesSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getKubernetesSDScrapeWork(swsPrev) }) - scs.add("openstack_sd_configs", *openstackSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getOpenStackSDScrapeWork(swsPrev) }) scs.add("consul_sd_configs", *consul.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getConsulSDScrapeWork(swsPrev) }) - scs.add("eureka_sd_configs", *eurekaSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getEurekaSDScrapeWork(swsPrev) }) - scs.add("dns_sd_configs", *dnsSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDNSSDScrapeWork(swsPrev) }) - scs.add("ec2_sd_configs", *ec2SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getEC2SDScrapeWork(swsPrev) }) - scs.add("gce_sd_configs", *gceSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getGCESDScrapeWork(swsPrev) }) - scs.add("docker_sd_configs", *dockerSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDockerSDScrapeWork(swsPrev) }) - scs.add("dockerswarm_sd_configs", *dockerswarmSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDockerSwarmSDScrapeWork(swsPrev) }) - scs.add("digitalocean_sd_configs", *digitaloceanSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDigitalOceanDScrapeWork(swsPrev) }) + scs.add("digitalocean_sd_configs", *digitalocean.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDigitalOceanDScrapeWork(swsPrev) }) + scs.add("dns_sd_configs", *dns.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDNSSDScrapeWork(swsPrev) }) + scs.add("docker_sd_configs", *docker.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDockerSDScrapeWork(swsPrev) }) + scs.add("dockerswarm_sd_configs", *docker.SwarmSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getDockerSwarmSDScrapeWork(swsPrev) }) + scs.add("ec2_sd_configs", *ec2.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getEC2SDScrapeWork(swsPrev) }) + scs.add("eureka_sd_configs", *eureka.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getEurekaSDScrapeWork(swsPrev) }) + scs.add("file_sd_configs", *fileSDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getFileSDScrapeWork(swsPrev) }) + scs.add("gce_sd_configs", *gce.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getGCESDScrapeWork(swsPrev) }) scs.add("http_sd_configs", *http.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getHTTPDScrapeWork(swsPrev) }) + scs.add("kubernetes_sd_configs", *kubernetes.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getKubernetesSDScrapeWork(swsPrev) }) + scs.add("openstack_sd_configs", *openstack.SDCheckInterval, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getOpenStackSDScrapeWork(swsPrev) }) + scs.add("static_configs", 0, func(cfg *Config, swsPrev []*ScrapeWork) []*ScrapeWork { return cfg.getStaticScrapeWork() }) var tickerCh <-chan time.Time if *configCheckInterval > 0 {