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的配置詳解》:python
獲取配置文件的來源有,
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,不啓用控制檯的時候,將啓動守護進程。spa
4,agent.run方法
run方法的主要做用是啓動collectd,不斷循環調用。.net
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()方法採集數據一次。繼承