Skip to content

Commit

Permalink
pmdalibvirt: add support for metric labels
Browse files Browse the repository at this point in the history
First attempt to add labels support for pmdalibirt:

* metric_source is either host or guest depending on whether the
  metric is hypervisor or VM related
* guest_name is the VM name as specified in the domain XML

Relates: #1847
  • Loading branch information
myllynen committed Apr 11, 2024
1 parent bd08bc0 commit 342d0bd
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/pmdas/libvirt/pmdalibvirt.python
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ from ctypes import c_int
from pcp.pmapi import pmUnits
from pcp.pmapi import pmContext as PCP
from pcp.pmda import PMDA, pmdaIndom, pmdaMetric
from cpmapi import PM_INDOM_NULL
from cpmapi import PM_INDOM_NULL, PM_LABEL_ITEM
from cpmapi import PM_TYPE_U32, PM_TYPE_U64, PM_TYPE_STRING
from cpmapi import PM_SEM_COUNTER, PM_SEM_INSTANT, PM_SEM_DISCRETE
from cpmapi import PM_COUNT_ONE, PM_SPACE_BYTE, PM_SPACE_KBYTE, PM_TIME_SEC, PM_TIME_NSEC
Expand All @@ -68,6 +68,7 @@ class LibvirtPMDA(PMDA):
self.set_user(self.user)

self.doms = []
self.vm_names = {}
self.connect_pmcd()
self.conn = self.connect_libvirt()

Expand Down Expand Up @@ -367,6 +368,8 @@ class LibvirtPMDA(PMDA):

self.set_refresh(self.libvirt_refresh)
self.set_fetch_callback(self.libvirt_fetch_callback)
self.set_label(self.libvirt_label)
self.set_label_callback(self.libvirt_label_callback)

@atexit.register
def cleanup(): # pylint: disable=unused-variable
Expand Down Expand Up @@ -410,6 +413,8 @@ class LibvirtPMDA(PMDA):
try:
conn = libvirt.openReadOnly(self.uri)
self.doms = conn.listAllDomains(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE)
for dom in self.doms:
self.vm_names[dom.UUIDString()] = dom.name()
if not os.environ.get('PCP_PYTHON_DOMAIN') and not os.environ.get('PCP_PYTHON_PMNS'):
self.log("Connected as " + self.user + " to " + self.uri + ".")
except libvirt.libvirtError as error:
Expand Down Expand Up @@ -460,6 +465,7 @@ class LibvirtPMDA(PMDA):
self.conn = self.connect_libvirt()
if not self.conn:
self.doms = []
self.vm_names = {}
self.replace_indom(self.vm_indom, {"0":c_int(1)})
self.replace_indom(self.vm_vcpu_indom, {"0":c_int(1)})
self.replace_indom(self.vm_block_indom, {"0":c_int(1)})
Expand All @@ -472,10 +478,13 @@ class LibvirtPMDA(PMDA):
if cluster == self.vm_cluster:
try:
self.doms = self.conn.listAllDomains(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE)
for dom in self.doms:
self.vm_names[dom.UUIDString()] = dom.name()
except libvirt.libvirtError as error:
self.log("Failed to list domains: %s" % error)
self.conn = None
self.doms = []
self.vm_names = {}
return
insts = {}
for dom in self.doms:
Expand Down Expand Up @@ -770,5 +779,19 @@ class LibvirtPMDA(PMDA):

return [PM_ERR_PMID, 0]

def libvirt_label(self, ident, label_type):
"""Cluster and instance domain labels"""
if label_type == PM_LABEL_ITEM:
cluster = self.pmid_cluster(ident)
if cluster == self.hv_cluster:
return '{"metric_source":"host"}'
return '{"metric_source":"guest"}'
return '{}'

def libvirt_label_callback(self, indom, inst):
"""Instance labels"""
name = self.vm_names[self.inst_name_lookup(indom, inst).split('::')[0]]
return '{"guest_name":"' + name + '"}'

if __name__ == '__main__':
LibvirtPMDA('libvirt', 140).run()

0 comments on commit 342d0bd

Please sign in to comment.