Obtenha o uso de RAM da VirtualBox VM através do vboxapi

0

Então, estou trabalhando em um aplicativo python que relata informações sobre um host executando o VirtualBox em um servidor da web. Portanto, estou usando o vboxapi . Eu posso enviar informações sobre o host com o seguinte código:

from vboxapi import VirtualBoxManager
mgr = VirtualBoxManager(None, None)
vbox = mgr.vbox
host = vbox.host
log['host'] = {
    'processorCount': host.processorCount,
    'processorCoreCount': host.processorCoreCount,
    'processorOnlineCount': host.processorOnlineCount,
    'processorOnlineCoreCount': host.processorOnlineCoreCount,
    'memorySize': host.memorySize,
    'memoryAvailable': host.memoryAvailable,
}
send_to_webserver(log)

O que eu gostaria de fazer é enviar informações sobre os convidados em execução, como RAM e uso da CPU. Eu posso recuperar a quantidade máxima disponível de RAM com machine.memorySize , mas não o uso atual. Ao passar pela documentação do vboxapi, isso deve ser possível com o PerformanceCollector, mas posso fazer com que isso funcione, nem posso encontrar um exemplo de trabalho. Alguém pode me ajudar com isso?

Os passos necessários estão na página 274 da documentação.

meu host é uma máquina Windows, meus convidados são o Ubuntu 16.04.

    
por Joren Inghelbrecht 29.03.2017 / 10:29

1 resposta

0

Eu percebi isso depois de tudo. Apenas no caso de alguém mais estar investigando isso:

mgr = VirtualBoxManager(None, None)
vbox = mgr.vbox
# Enabling performance collection
perfomance_collector = self.vbox.performanceCollector
# Enable metrics (None = all metrics, None = all machines)
perfomance_collector.enableMetrics(None, None)
# Setup metrics (None = all metrics, None = all machines, 1 sample every second, keep up to 15 samples)
perfomance_collector.setupMetrics(None, None, 1, 15)

while True:
    # get metrics
    (values, names_out, objects_out, units, scales, sequence_numbers, indices, lengths) = perfomance_collector.queryMetricsData(None, None)
    out = []
    # process results
    for i in range(0, len(names_out)):
        scale = int(scales[i])
        if scale != 1:
            fmt = '%.2f%s'
        else:
            fmt = '%d %s'
        out.append({
            'name': str(names_out[i]),
            'object': str(objects_out[i]),
            'unit': str(units[i]),
            'scale': scale,
            'values': [int(values[j]) for j in range(int(indices[i]), int(indices[i]) + int(lengths[i]))],
            'values_as_string': '[' + ', '.join([fmt % (int(values[j]) / scale, units[i]) for j in range(int(indices[i]), int(indices[i]) + int(lengths[i]))]) + ']'
        })
    # print something useful
    for metric in out:
        print(metric['name'], metric['values_as_string'])
    time.sleep(5)
    
por 29.03.2017 / 13:59