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.gomain函数中进行。首先, 在第509-514行处,这里,a.Parse(os.Args[1:])解析命令行参数,包括配置文件路径(通过--config.file参数指定)。

  Prometheus找到加载的prometheus.yaml路径后,开始进行配置文件加载。下面这段代码调用https://github.com/prometheus/prometheus/blob/v2.55.0/config/config.goLoadFile函数来加载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")  
    }  
} 

如果agentModetrue, 则检查配置中是否包含来在代理模式下不允许的字段(比如cfg.AlertingConfig.AlertmanagerConfigscfg.AlertingConfig.AlertRelabelConfigscfg.RuleFilescfg.RemoteReadConfigs)。如果包含来这些字段,则返回错误。

4、设置配置目录 

cfg.SetDirectory(filepath.Dir(filename))

这里的cfg是解析后的配置对象,filename是配置文件的路径, filepath.Dir(filename)返回了filename的目录部分,就是配置文件所在的目录。调用SetDirectory方法就能确保配置中所有相对路径都是配置文件中所在的目录。简单地将,就是将相对路径转成绝对路径。

5、函数返回配置的对象

return cfg, nil

1.2、配置初始化

二、运行时加载

2.1、动态加载支持

2.2、重新加载触发方式

2.2.1、发送SIGHUP信号

2.2.2、HTTP POST请求

2.3、重新加载过程

posted @ 2024-10-27 16:05  左扬  阅读(23)  评论(0编辑  收藏  举报
levels of contents