File: //usr/local/qcloud/monitor/barad/plugin/collector/vm/cloud_init.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import os, time
sys.path.append(os.getcwd() + '/../../../comm/')
import constant
from cutils import CommUtils
from plugin_base import VmBaseCollector
from utils.metric_handler import MetricHandler
class CloudinitCollect(object):
SR_0_PATH = "/dev/sr0"
CLOUD_CONFIG_PATH = "/etc/cloud/cloud.cfg"
@staticmethod
def get_system_manager():
cmd = "ps -p1 | grep \"init\|upstart\|systemd\" | awk '{print $4}'"
return CommUtils.ExecuteTimeoutCommand(cmd, 3).strip()
@staticmethod
def get_cloud_init_exec_path_from_system_ctl():
cmd = "systemctl show cloud-init-local.service -p ExecStart | grep cloud-init"
r = CommUtils.ExecuteTimeoutCommand(cmd, 3).strip()
try:
return r.split("path=")[1].split(";")[0].strip()
except Exception as e: # noqa
return ''
@staticmethod
def check_sr0():
return os.path.exists(CloudinitCollect.SR_0_PATH)
@staticmethod
def check_config_exists():
return os.path.exists(CloudinitCollect.CLOUD_CONFIG_PATH)
@staticmethod
def check_config_source():
with open(CloudinitCollect.CLOUD_CONFIG_PATH) as f:
for content in f.readlines():
tmp = content.split(":")
if tmp[0] == 'datasource_list' and 'ConfigDrive' in tmp[1]:
return True
return False
@staticmethod
def check_cloud_init():
system_manager = CloudinitCollect.get_system_manager()
if system_manager == 'systemd':
cloud_init_bin_path = CloudinitCollect.get_cloud_init_exec_path_from_system_ctl()
elif system_manager == 'init':
# use system path
cloud_init_bin_path = 'cloud-init'
else:
cloud_init_bin_path = ''
if not cloud_init_bin_path:
# not found cloud-init, maybe we don't konw this case yet, just
# treat it as works fine
return True
# Notes(eliqiao): cloud-init --version will print version to stderr
cmd = "%s -h" % cloud_init_bin_path
res = CommUtils.ExecuteTimeoutCommand(cmd, 3)
if not res:
return False
return True
def Cloudinit(self):
if not self.check_sr0():
return -1
if not self.check_config_exists():
return 1
if not self.check_config_source():
return 2
if not self.check_cloud_init():
return 3
return 100
class CloudinitCollector(VmBaseCollector):
def init(self):
self.set_frequency(86400)
self.collector = CloudinitCollect()
self.handler = MetricHandler()
self.handler.namespace = 'qce/cvm'
self.handler.dimensions = ['vm_uuid', 'vmip']
def do_collect(self):
now = int(time.time())
cld_available = self.collector.Cloudinit()
vm_uuid = self.get_vm_uuid()
vmip = self.get_vmip()
dimensions = {'vm_uuid': vm_uuid, 'vmip': vmip}
batch_metric = [
{'name': 'CloudinitAvailable', 'value': cld_available},
]
self.handler.add_batch_metric(
batch=batch_metric, dimensions=dimensions, timestamp=now)
if (len(self.handler.get_metrics()) > 0):
data = {'sender': 'nws_sender',
'datas': self.handler.pop_metrics()}
self.put_data(data)
def main():
collector = CloudinitCollector()
collector.init()
collector.collect()
collector.dump_data()
if __name__ == '__main__':
main()