首次加载
cmd/prometheus/main.go
reloadables := []Reloadable{
remoteStorage,
targetManager,
ruleManager,
webHandler,
notifier,
}
reloadConfig(cfg.configFile, logger, reloadables...)
其中,reloadConfig函数的核心代码如下,主要是调用实现Reloadable的所有类型的ApplyConfig方法进行config的加载:
conf, err := config.LoadFile(filename)
for _, rl := range rls {
rl.ApplyConfig(conf);
}
更新
cmd/prometheus/main.go中有如下来监听更新的请求
- SIGHUP更新
- 调用api来更新
go func() {
<-hupReady
for {
select {
case <-hup:
reloadConfig(cfg.configFile, logger, reloadables...);
case rc := <-webHandler.Reload():
reloadConfig(cfg.configFile, logger, reloadables...);
}
}
}()
SIGHUP更新
通过向Prometheus进程发送SIGHUP信号进行配置重新加载。
hup := make(chan os.Signal)
signal.Notify(hup, syscall.SIGHUP)
api更新
如果有配置、target、alert等的变更,提供rest api:/-/reload进行配置重新加载。 api代码:
router.Post("/-/reload", h.reload)
func (h *Handler) reload(w http.ResponseWriter, r *http.Request) {
rc := make(chan error)
h.reloadCh <- rc
if err := <-rc; err != nil {
http.Error(w, fmt.Sprintf("failed to reload config: %s", err), http.StatusInternalServerError)
}
}
上述api能调用的前提是启动命令中得加入:--web.enable-lifecycle