用Java获取vSphere相关数据

1.到官网下载SDK,VMware-vSphere-SDK-6.0.0-2561048.zip解压下来会有5个目录,VMware-vSphere-SDK里面有几种类型的包,它们的功能在解压下来的vSphereManagementSDKReadme.html有说明,通常每个包里面都有依赖包,例子。
2.这边根据需求选取vsphere-ws包,导入vsphere-ws\java\JAXWS\lib下面的包到工程

不了解它的内部结构使用它的SDK还真没那么简单,先看它几个基本概念:

vSphere API
Managed Object(MO)   服务(services)和组件(components),服务包括 PropertyCollector, SearchIndex、PerformanceManager 和 ViewManager 等,组件包括 VirtualMachine、Datastore 和 Folder 等,他们都直接或间接继承自 ManagedEntity 抽象类,可以通过api看ManagedEntity 的子孙类,
Managed Object Reference(MOR) 客户端对象,可以理解为客户端通过mor对象调用服务端mo的方法,
Data Objects 封装了MO的数据,客户端发送数据到服务端。

vSphere Inventory 介绍
vSphere inventory 其实就是 一堆对象组成的结构。在 vSphere inventory 中包含了以下三种类型的对象:
    在 datacenter 中被管理的系统,比如 Host、VirtualMachine、VirtualApp 等。
    具有一定功能的组件,比如 ComputeResource、DataStore,、Network 等。
    负责组织归类的组件,它们负责把 datacenter 中的对象按照层级关系组织起来形成了一个树状结构,比如 Folder 和 DataCenter。
下面图出自 vSphere Web Servicess SDK Programming Guide,给出了 inventory 的结构。

使用 SDK 开发自己的 vSphere 客户端程序,首要的问题就是如何访问和遍历在 vSphere Inventory 中的对象。下面我们将介绍这方面的内容。

ServiceInstance 对象在 inventory 的结构树中处于根位置,因此遍历整个 inventory 或者要查找 inventory 中的某个对象,必须先从 ServiceInstance 开始。ServiceInstance 类中最重要的一个属性(property,可以理解为类的成员变量)是 content,它指向数据类型(Data Object)ServiceContent 的一个实例。
ServiceContent 类含有很多该 vSphere 服务实例的重要属性和服务的引用,比如整个 inventory 的 root folder,session manager,property collector(用于查找和遍历对象),以及 EventManager, TaskManager 等。下面的类图展示了 ServiceInstance 和 ServiceContent 的部分属性。

 

使用 PropertyCollector 查询对象
vSphere API 中,PropertyCollector 类是用来遍历、查询和监控 MO 的状态的。使用 PropertyCollector 时,要指定一或多个 filter 来限定查找的范围,而每个 filter 都含有一组对象来描述(XXXSpec):
    查询或遍历的起点,即从上文描述的 inventory 树的哪个节点开始遍历。
    查询的路径。
    要查询哪些对象及它们的哪些属性。
PropertyCollector 中的 filter 只对当前 session 有效,因此 PropertyCollector 不能在 session 中共享。vSphere server 会给当前 session 创建一个默认的 PropertyCollector 实例。当然也可以自己在多线程中创建多个 PropertyCollector 实例,以便进行互相独立的查询操作。
PropertyCollector 有两种方法来获取数据:
    调用 RetrievePropertiesEx/ContinueRetrievePropertiesEx 一次性的获取数据。
    如果想持续获得 inventory 中数据对象的状态变化,可以使用 WaitForUpdatesEx 方法。第一次调用这个方法会得到目标对象的初始数据,后续调用会得到相对上一次调用时的增量变化值。

 

使用API获取数据
第一步要做的就是到api文档根据inventory路径找到对应的对象,然后用该对象获取数据。
例如:找到最上层HostSystem,然后依次往下找自己想要的,根据每个层次下面的属性来获取数据

代码例子

官方例子:https://developercenter.vmware.com/samples?id=772&h=Java 这是获取集群的cpu核数,其例子VMwareConnection中封装了登录和获取MOR对象,所以我们只需要把它copy过来使用即可,

查询所有主机的名称及其cpu和内存,根据api文档定位到对应的属性,代码如下:

public static void findAllHosts() {
	try {
		//查询所有物理机
		List<ObjectContent> contents = conn.findAllObjects("HostSystem", "name",
				"summary.hardware.memorySize","summary.hardware.numCpuCores");
		for (com.vmware.vim25.ObjectContent content : contents) {
			//下面获取属性
            List<DynamicProperty> propSet = content.getPropSet();
            for (DynamicProperty dynamicProperty : propSet) {
                String propertyName = dynamicProperty.getName();
                Object val = dynamicProperty.getVal();
                if("name".equals(propertyName)) {
                	System.out.print(val + " ");
                } else if("summary.hardware.memorySize".equals(propertyName)) {
                	System.out.print(val + " ");
                } else if("summary.hardware.numCpuCores".equals(propertyName)) {
                	System.out.print(val + " ");
                }
            }
            System.out.println();
        }
	} catch (Exception e) {
		logger.error("", e);
	}
}

 

转载于:https://my.oschina.net/chengxiaoyuan/blog/674026

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 vSphere SDK for Java获取 VMware 主机和虚拟机的监控数据。下面是一个示例代码,可以获取 CPU 和内存使用率的指标数据: ```java import com.vmware.vim25.*; import com.vmware.vim25.mo.*; import java.net.URL; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.List; public class VmwareMonitor { public static void main(String[] args) { try { // 连接 vSphere ServiceInstance si = new ServiceInstance(new URL("https://<vcenter>/sdk"), "<username>", "<password>", true); // 获取主机和虚拟机的监控数据 PerformanceManager perfMgr = si.getPerformanceManager(); List<PerfMetricId> perfMetricIds = new ArrayList<>(); perfMetricIds.add(new PerfMetricId(new PerfCounterInfo().setKey(6), null)); // CPU usage perfMetricIds.add(new PerfMetricId(new PerfCounterInfo().setKey(24), null)); // Memory usage PerfQuerySpec perfQuerySpec = new PerfQuerySpec(); perfQuerySpec.setEntity(new ManagedObjectReference()); perfQuerySpec.getEntity().setType("HostSystem"); perfQuerySpec.getEntity().setValue("<host-moid>"); perfQuerySpec.setMetricId(perfMetricIds.toArray(new PerfMetricId[0])); perfQuerySpec.setIntervalId(20); // 20 seconds perfQuerySpec.setFormat("normal"); List<PerfQuerySpec> perfQuerySpecs = new ArrayList<>(); perfQuerySpecs.add(perfQuerySpec); PerfEntityMetricBase[] perfEntityMetricBases = perfMgr.queryPerf(perfQuerySpecs.toArray(new PerfQuerySpec[0])); for (PerfEntityMetricBase perfEntityMetricBase : perfEntityMetricBases) { PerfEntityMetric perfEntityMetric = (PerfEntityMetric) perfEntityMetricBase; ManagedObjectReference entity = perfEntityMetric.getEntity(); for (PerfMetricSeries perfMetricSeries : perfEntityMetric.getValue()) { PerfMetricId perfMetricId = perfMetricSeries.getId(); String instance = perfMetricSeries.getInstance().length > 0 ? perfMetricSeries.getInstance()[0].getValue() : ""; double value = perfMetricSeries.getValue()[0]; if (perfMetricId.getCounterId() == 6) { System.out.printf("Entity: %s, Instance: %s, CPU usage: %.2f%%\n", entity.getValue(), instance, value); } else if (perfMetricId.getCounterId() == 24) { System.out.printf("Entity: %s, Instance: %s, Memory usage: %.2f%%\n", entity.getValue(), instance, value); } } } // 关闭连接 si.getServerConnection().logout(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,需要替换 `<vcenter>`、`<username>`、`<password>` 和 `<host-moid>` 分别为 vCenter Server 的地址、用户名、密码和主机的 Managed Object ID。你还可以修改 `perfMetricIds` 来获取其他指标数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值