1,agent类,继承daemon守护进程类的入口类,daemond控制进程的stop,start,Info,和读写pid文件。Agent类主要功能是重写daemond的run方法。
其中daemond主要两个方法要注意,第一个是实现了双fork将进程转化为脱离终端的守护进程(成熟技术,网上可查)。第二个是使用读写pid文件,实现进程的类单例模式。具体的实现思路是如下:
start过程需要处理的问题:
1.1.1 确保系统中没有该daemon的进程。如果有,则不能启动程序。
1.1.2 在daemon化之后,创建pidfile,写入pid。
1.1.3 注册atexit(),确保在程序退出时清除pidfile文件。
stop过程做的处理:
1.2.1 如果pidfile不存在,无需其它动作。
1.2.2 如果pidfile存在,kill原有进程,并确认进程不存在。在旧进程异常退出时,比如直接用_exit(2)退出程序时,可能pidfile不会被删除,所以在kill进程之后还要确认pidfile文件已被删除。
2,get_config函数会读取所有的配置信息。
Get_config会返回一个如下数据格式的通用字典,读取到可选配置时候,会自动加到此字典中:
```
agentConfig = {
'check_freq': DEFAULT_CHECK_FREQUENCY,
'dogstatsd_port': 8125,
'dogstatsd_target': 'http://localhost:17123',
'graphite_listen_port': None,
'hostname': None,
'listen_port': None,
'tags': None,
'use_ec2_instance_id': False, # DEPRECATED
'version': get_version(),
'watchdog': True,
'additional_checksd': '/etc/dd-agent/checks.d/',
'bind_host': get_default_bind_host(),
'statsd_metric_namespace': None,
'utf8_decoding': False
}
```
参数详细解释见《agent的配置详解》:
获取配置文件的来源有,
2.1,读取启动附加参数,通过config.OptionParser()方法可以管理启动附带参数,将输入参数转化后返回
2.2,读取主目录下的datadog.conf文件,python用的是自带的一个模块ConfigParser.ConfigParser()。通过这个模块可以以字典格式获取.conf中对应key的value值。
2.3,读取系统参数。
2.4,读取yaml文件,使用的方法使用的是yaml.load(),导入的结果是一个字典。
3,start函数,
agent.start函数将会主要作用是继承的daemond的start方法,作用是判断是否启动foreground,不启用控制台的时候,将启动守护进程。
4,agent.run方法
run方法的主要作用是启动collectd,不断循环调用。
5,信号处理模块
处理四种信号,hup,int,term,usr1,
term:关闭agent,stop collect
int:关闭agent,stop collect
hup:重新导入配置文件
usr1:重启
6,模块初始化
重要的初始化:
初始化HTTP发射器,emitters
初始化collect,
初始化watchdog,作用,给定内存占用阀值和
初始化check服务。这条非常重要,check服务导入过程,详见《check服务流程图及重点模块分析》,初始化check服务后返回的数据是self._checksd 。这是一个字典,有两个key,分别是initialized_checks和init_failed_checks两个list,前者是checkd目录下实例化后的AgentCheck对象。结构是:
{init_failed_checks:【AgentCheck1,AgentCheck2,】,
initialized_checks:【】
}
7,主循环
主循环首先判断是否开发模式(判断是否更小的时间粒度),然后判断是否接受到重新导入配置文件的信号,重新导入配置文件标记符是否被重置。然后运行collect.run()方法采集数据一次。