Prometheus源码专题精讲——监控系统 Prometheus 2.x/3.x 源码阅读和分析_配置文件的加载与刷新-config.go
配置文件的加载与刷新——config/config.go
https://github.com/prometheus/prometheus/blob/v2.55.0/config/config.go
当前https://github.com/prometheus/prometheus/releases
稳定版本号是2.55.0 / 2024-10-22
, 并且v3.x
版还是https://github.com/prometheus/prometheus/releases/tag/v3.0.0-beta.1
, 就以最新的Latest v2.55.0
版讲。
Prometheus配置文件的加载过程主要可以分为以下两步:
1、初始化时加载
2、运行时重新加载
一、初始化时加载
1.1、启动时加载
https://github.com/prometheus/prometheus/blob/v2.55.0/cmd/prometheus/main.go
Prometheus
在启动时,会自动查找并加载其配置文件。默认情况下,它会寻找当前目录下的prometheus.yaml
文件。但用户也可以通过命令行参数--config.file
来自定义配置文件的名称或路径。
在Prometheus启动过程中
,配置文件的首先加载和查找发生在https://github.com/prometheus/prometheus/blob/v2.55.0/cmd/prometheus/main.go
的main
函数中进行。首先,
在第509-514行处,这里,a.Parse(os.Args[1:])
解析命令行参数,包括配置文件路径(通过--config.file
参数指定)。
Prometheus
找到加载的prometheus.yaml
路径后,开始进行配置文件加载。下面这段代码调用https://github.com/prometheus/prometheus/blob/v2.55.0/config/config.go
的LoadFile
函数来加载Prometheus
配置文件,这个函数负责从指定的的prometheus.yaml
文件中解析并加载配置。
这里解释下该函数签名:
func LoadFile(filename string, agentMode, expandExternalLabels bool, logger log.Logger) (*Config, error)
-
-
-
-
filename string
: 要加载的Prometheus.yaml
配置文件的路径。 -
agentMode bool
: 一个布尔值,指示Prometheus
是否以代理模式运行。代理模式和服务器模式在配置要求上有所不同。 -
expandExternalLabels bool
: 一个布尔值,指示是否应该扩展外部标签。 -
logger log.Logger
: 一个日志记录器,用于记录日志信息。 -
返回值:
*Config
是一个指向解析后的配置对象的指针,error
是一个错误对象,如果发生错误则返回。
-
-
-
该函数逻辑:
1、先读取文件内容
content, err := os.ReadFile(filename) if err != nil { return nil, err }
使用os.ReadFile
函数读取指定路径的文件内容。如果读取失败,则返回错误。
2、解析Prometheus.yaml内容
cfg, err := Load(string(content), expandExternalLabels, logger) if err != nil { return nil, fmt.Errorf("parsing YAML file %s: %w", filename, err) }
将文件内容转换为字符串,并调用Load
函数来解析Prometheus.yaml
内容。
Load
函数负责将Prometheus.yaml字符串解析为Config
对象。如果解析失败,则返回错误。
3、验证是否开启代理模式
if agentMode { if len(cfg.AlertingConfig.AlertmanagerConfigs) > 0 || len(cfg.AlertingConfig.AlertRelabelConfigs) > 0 { return nil, errors.New("field alerting is not allowed in agent mode") } if len(cfg.RuleFiles) > 0 { return nil, errors.New("field rule_files is not allowed in agent mode") } if len(cfg.RemoteReadConfigs) > 0 { return nil, errors.New("field remote_read is not allowed in agent mode") } }
如果agentMode
是true
, 则检查配置中是否包含来在代理模式下不允许的字段(比如cfg.AlertingConfig.AlertmanagerConfigs
、cfg.AlertingConfig.AlertRelabelConfigs
、cfg.RuleFiles
和cfg.RemoteReadConfigs
)。如果包含来这些字段,则返回错误。
4、设置配置目录
cfg.SetDirectory(filepath.Dir(filename))
这里的cfg
是解析后的配置对象,filename
是配置文件的路径,
filepath.Dir(filename)
返回了filename
的目录部分,就是配置文件所在的目录。调用SetDirectory
方法就能确保配置中所有相对路径都是配置文件中所在的目录。简单地将,就是将相对路径转成绝对路径。
5、函数返回配置的对象
return cfg, nil