def __init__(self, title, probe_id, interval, libvirt_type, connection_uri): super(InstanceCpuNodePuller, self).__init__( title=title, probe_id=probe_id, interval=interval, ) self.libvirt_type = libvirt_type self.connection_uri = connection_uri self.uri = self._get_uri() self.wrapper = InstanceCpuWrapper( libvirt_type=self.libvirt_type, libvirt_uri=self.uri, )
class InstanceCpuNodePuller(MetricPuller): def __init__(self, title, probe_id, interval, libvirt_type, connection_uri): super(InstanceCpuNodePuller, self).__init__( title=title, probe_id=probe_id, interval=interval, ) self.libvirt_type = libvirt_type self.connection_uri = connection_uri self.uri = self._get_uri() self.wrapper = InstanceCpuWrapper( libvirt_type=self.libvirt_type, libvirt_uri=self.uri, ) def _get_uri(self): if self.libvirt_type == 'uml': uri = self.connection_uri or 'uml:///system' elif self.libvirt_type == 'xen': uri = self.connection_uri or 'xen:///' elif self.libvirt_type == 'lxc': uri = self.connection_uri or 'lxc:///' elif self.libvirt_type == 'parallels': uri = self.connection_uri or 'parallels:///system' else: uri = self.connection_uri or 'qemu:///system' return uri @classmethod def get_config_opts(cls): # This could also be extrated from the Nova or Ceilometer configuration # See --> https://github.com/openstack/nova/blob/stable/liberty # /nova/virt/libvirt/driver.py#L132 # See --> https://github.com/openstack/ceilometer/blob/stable/liberty # /ceilometer/compute/virt/libvirt/inspector.py#L32 return cls.get_base_opts() + [ cfg.StrOpt('libvirt_type', default='kvm', choices=['kvm', 'lxc', 'qemu', 'uml', 'xen'], help='Libvirt domain type.'), cfg.StrOpt('connection_uri', default='', help='Override the default libvirt URI ' '(which is dependent on libvirt_type).'), ] def do_pull(self): LOG.info("[%s] Pulling measurements...", self.key) measurements = [] for instance in self.wrapper.get_instances(): value = self.wrapper.instance_cpu_percent(instance) resource_metadata = { "host": platform.node(), "title": self.title, "display_name": instance.name } measurement = Measurement( name=self.probe_id, unit=self.unit, type_="gauge", value=value, resource_id=instance.id, resource_metadata=resource_metadata, ) LOG.info("[%s] Measurements collected.", self.key) measurements.append(measurement) return measurements @classmethod def get_name(cls): return "instance_cpu_used" @classmethod def get_default_probe_id(cls): return "cpu_util" @classmethod def get_default_interval(cls): return 1 @property def unit(self): return "%"