从 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" };
我正在使用底层 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" };