c语言sscanf函数的用法是什么
257
2022-11-01
Prometheus监控学习笔记之Prometheus如何热加载更新配置
0x00 概述
当 Prometheus 有配置文件修改,我们可以采用 Prometheus 提供的热更新方法实现在不停服务的情况下实现配置文件的重新加载。
0x01 热更新
热更新加载方法有两种:
#1. kill -HUP pid#2. curl -X POST reload 成功的时候,将在 promtheus log 中看到如下信息:
如果因为配置信息填写不正确导致更新失败,将看到类似信息:
ERRO[0161] Error reloading config: couldn't load configuration (-config.file=prometheus.yml): unknown fields in scrape_config: job_nae source=main.go:146
提示:
我个人更倾向于采用 curl -X POST 的方式,因为每次 reload 过后, pid 会改变,使用 kill 方式需要找到当前进程号。从 2.0 开始,hot reload 功能是默认关闭的,如需开启,需要在启动 Prometheus 的时候,添加--web.enable-lifecycle 参数。
0x02 热更新源码对比
下面我们再来探讨下这两种方式内部实现原理。
第一种:通过 kill 命令的 HUP (hang up) 参数实现:
首先 Prometheus 在 cmd/promethteus/main.go 中实现了对进程系统调用监听,如果收到 syscall.SIGHUP 信号,将执行 reloadConfig 函数。
代码类似:
hup := make(chan os.Signal)signal.Notify(hup, syscall.SIGHUP)go func() { for { select { case <-hup: if err := reloadConfig(cfg.configFile, reloadables...); err != nil { log.Errorf("Error reloading config: %s", err) } } }}()
第二种:通过 web 模块的 /-/reload 请求实现:
首先 Prometheus 在 web(web/web.go) 模块中注册了一个 POST 的 请求/-/reload, 它的 handler 是web.reload 函数,该函数主要向web.reloadCh chan 里面发送一个error。在 Prometheus 的cmd/promethteus/main.go 中有个单独的 goroutine 来监听web.reloadCh,当接受到新值的时候会执行 reloadConfig 函数。
代码类似:
hupReady := make(chan bool)go func() { <-hupReady for { select { case rc := <-webHandler.Reload(): if err := reloadConfig(cfg.configFile, reloadables...); err != nil { log.Errorf("Error reloading config: %s", err) rc <- err } else { rc <- nil } } }}()
Prometheus 内部提供了成熟的 hot reload 方案,这大大方便配置文件的修改和重新加载,在 Prometheus 生态中,很多 Exporter 也采用类似约定的实现方式。
0x03 参考
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~