0x00 概述

当 Prometheus 有配置文件修改,我们可以采用 Prometheus 提供的热更新方法实现在不停服务的情况下实现配置文件的重新加载。

0x01 热更新

热更新加载方法有两种:

#1.  kill -HUP pid
#2. curl -X POST http://IP/-/reload

当你采用以上任一方式执行 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

提示:

  1. 我个人更倾向于采用 curl -X POST 的方式,因为每次 reload 过后, pid 会改变,使用 kill 方式需要找到当前进程号。
  2. 从 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 请求实现:

  1. 首先 Prometheus 在 web(web/web.go) 模块中注册了一个 POST 的 http 请求 /-/reload, 它的 handler 是 web.reload 函数,该函数主要向 web.reloadCh chan 里面发送一个 error
  2. 在 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 参考

最新文章

  1. “ifstream” 未声明的标识符
  2. MVC ActionResult视图结果
  3. TM4C123GH6PM程序
  4. 华为过滤字符串(java)
  5. SQL Server 在生产环境中这样写存储过程的坑都避免了吗?
  6. 一个高性能异步socket封装库的实现思路 (c#)
  7. socket(TCP-粘包)通讯之Python实现
  8. 旅游类App的原型制作分享-Klook
  9. 生产者、消费者模型---Queue类
  10. Python之json使用
  11. Github + Hexo 搭建个人博客
  12. LINUX系统一一CentOS6.5之安装JDK
  13. 在debug模式下引入一些性能检测工具
  14. LeetCode--198--打家劫舍
  15. JavaScript中函数和构造函数的区别
  16. Qt:表格 tableWidget
  17. bzoj 2321 数学
  18. hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)
  19. 【贪心】【堆】bzoj2590 [Usaco2012 Feb]Cow Coupons
  20. golang slice 切片原理

热门文章

  1. C# 结构与类
  2. Python用python-docx读写word文档
  3. 计算机基础 python入门
  4. git commit 新修改的内容 添加到上次提交中 减少提交的日志
  5. STL顺序容器的基本操作
  6. 矩阵补全(Matrix Completion)和缺失值预处理
  7. input 控件常用属性
  8. [C12] 大规模机器学习(Large Scale Machine Learning)
  9. CentOs篇
  10. LG2996 「USACO10NOV」Visiting Cows