From ce00b3862f81493f0a3fd3d63860d8967b6dfca7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Mon, 18 Jul 2022 17:15:02 +0300 Subject: [PATCH] lib/promscrape: reload all the scrape configs when the `global` section is changed inside `-promscrape.config` See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2884 --- docs/CHANGELOG.md | 1 + lib/promscrape/config.go | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9c5965e0d..65b027354 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -18,6 +18,7 @@ The following tip changes can be tested by building VictoriaMetrics components f * BUGFIX: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): fix potential panic in [multi-level cluster setup](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multi-level-cluster-setup) when top-level `vmselect` is configured with `-replicationFactor` bigger than 1. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2961). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly handle custom `endpoint` value in [ec2_sd_configs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#ec2_sd_config). It was ignored since [v1.77.0](https://docs.victoriametrics.com/CHANGELOG.html#v1770) because of a bug in the implementation of [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1287). * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): set `up` metric to `0` for partial scrapes in [stream parsing mode](https://docs.victoriametrics.com/vmagent.html#stream-parsing-mode). Previously the `up` metric was set to `1` when at least a single metric has been scraped before the error. This aligns the behaviour of `vmselect` with Prometheus. +* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): restart all the scrape jobs during [config reload](https://docs.victoriametrics.com/vmagent.html#configuration-update) after `global` section is changed inside `-promscrape.config`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2884). ## [v1.79.1](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.79.1) diff --git a/lib/promscrape/config.go b/lib/promscrape/config.go index 9d9e64e70..b6b54d276 100644 --- a/lib/promscrape/config.go +++ b/lib/promscrape/config.go @@ -130,6 +130,10 @@ func (cfg *Config) mustRestart(prevCfg *Config) { prevScrapeCfgByName[scPrev.JobName] = scPrev } + // Restart all the scrape jobs on Global config change. + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2884 + needGlobalRestart := !areEqualGlobalConfigs(&cfg.Global, &prevCfg.Global) + // Loop over the the new jobs, start new ones and restart updated ones. var started, stopped, restarted int currentJobNames := make(map[string]struct{}, len(cfg.ScrapeConfigs)) @@ -142,7 +146,7 @@ func (cfg *Config) mustRestart(prevCfg *Config) { started++ continue } - if areEqualScrapeConfigs(scPrev, sc) { + if !needGlobalRestart && areEqualScrapeConfigs(scPrev, sc) { // The scrape config didn't change, so no need to restart it. // Use the reference to the previous job, so it could be stopped properly later. cfg.ScrapeConfigs[i] = scPrev @@ -165,6 +169,12 @@ func (cfg *Config) mustRestart(prevCfg *Config) { logger.Infof("restarted service discovery routines in %.3f seconds, stopped=%d, started=%d, restarted=%d", time.Since(startTime).Seconds(), stopped, started, restarted) } +func areEqualGlobalConfigs(a, b *GlobalConfig) bool { + sa := a.marshalJSON() + sb := b.marshalJSON() + return string(sa) == string(sb) +} + func areEqualScrapeConfigs(a, b *ScrapeConfig) bool { sa := a.marshalJSON() sb := b.marshalJSON() @@ -183,6 +193,14 @@ func (sc *ScrapeConfig) marshalJSON() []byte { return data } +func (gc *GlobalConfig) marshalJSON() []byte { + data, err := json.Marshal(gc) + if err != nil { + logger.Panicf("BUG: cannot marshal GlobalConfig: %s", err) + } + return data +} + func (cfg *Config) mustStop() { startTime := time.Now() logger.Infof("stopping service discovery routines...")