从 vmware.vim.vimclient 获取网络使用情况

Get network usage from vmware.vim.vimclient

我正在使用底层 PowerCLI dll 来获取一些 C# 功能,但我似乎找不到有关如何获取统计信息的文档。

这是我试图在 C# 中重新创建的 PowerCLI。

$vm | Get-Stat -stat 'net.usage.average'

我可以通过 VMware.Vim.VimClientImpl#connect 方法登录,并且可以通过 VMware.Vim.VimClient#FindEntityViews 方法获取虚拟机,但是我不知道如何提取网络使用信息,我也无法通过 google 找到有关它的文档。

如果有这些 API 的文档,我很想拥有它们,但与此同时,有人知道如何提取这些信息吗?

我通过查看 SOAP 请求并进行一些直观的跳跃找到了答案。

我相信 VMWare API 是基于状态的,类似于 X11 API 是基于状态的方式(您拥有服务器内存中的各种对象的句柄)。

具体来说,您首先将会话连接到服务器,然后使用该会话登录。当您连接到会话 vmware returns 时,会出现 'manager objects' 及其后续 MoRef 的列表。所以正确查询这些信息的方式是:

VimClient vimClient = new VMware.Vim.VimClientImpl();
var serviceContent = vimClient.Connect(hostname, VMware.Vim.CommunicationProtocol.Https, null);
var userSession = vimClient.Login(un, pwd);

NameValueCollection filter = new NameValueCollection();
filter.Add("Name", vmName2LookFor);

String[] viewProperties = null;

var VMs = vimClient.FindEntityViews(typeof(VMware.Vim.VirtualMachine), null, filter, viewProperties);
              .Cast<VMware.Vim.VirtualMachine>()
              .ToList();
var vm = VMs.FirstOrDefault(); // blindly grab for example purposes

var pm = new VMware.Vim.PerformanceManager(vimClient, serviceContent.PerfManager);
pm.QueryAvailablePerfMetric(vm.MoRef, DateTime.Now.AddDays(-1), DateTime.Now, null)

请注意,在创建 PerformanceManager 对象时,我们将来自 ServiceContent 对象的 MoRef 传递给它,该对象最初是在连接到 VMWare API.[=12= 时创建的]

我相信这样做是为了启用内部管理器的版本控制,但具体点是猜测。

另请注意,我使用 vimClient.FindEntityViews 用于说明目的,还有一个单数 vimClient.FindEntityView 我本可以使用。

第三个注意事项:MoRef代表"Managed Object Reference"。

第四条注意事项:vimClient.FindEntityViews 中的 viewProperties 告诉 vmware 出于性能原因仅发送指定的属性。例如,通过 IP 查找 VM 涉及获取所有 VM 并在所有 VM 中搜索具有您要查找的 IP 的 VM。您不关心任何其他属性,因此您告诉 vmware 不要发送其他属性。如果你有很多基础设施,这是一个非常大的性能加速。在上面我对 IP 地址感兴趣的情况下,我会做

String[] viewProperties = new[]{ "Guest.Net" };