# OSMonitor **Repository Path**: accjiyun/OSMonitor ## Basic Information - **Project Name**: OSMonitor - **Description**: OpenStack监控接口开发。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2017-08-08 - **Last Updated**: 2021-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## OpenStack 监控接口开发 > JavaDoc : [http://accjiyun.oschina.io/osmonitor/doc](http://accjiyun.oschina.io/osmonitor/doc) 监控一般流程: 1.首先完成身份认证; 2.获取OpenStack计算节点列表即物理机(Hypervisor),并且获取VCPU、内存、磁盘等信息; 3.获取所有虚拟机实例(Instance)信息,或选择运行在某个计算节点物理机上的虚拟机实例信息; 4.从选定特定实例获取相关的监控指标(Meter),并获取指标对应的监控值(Sample),在表现层通过图表等信息展示。 ### 身份验证 所有的操作的前提都需要先完成身份认证。 身份验证有两种方式: - 配置文件认证 修改`auth.properties`修改验证信息 ```properties authURL=http://controller2:5000/v3/ domain=Default username=admin password=pass123456 projectName=admin ``` 使用认证工厂返回认证客户端实例,不为空则认证成功: ```java AuthService authService = new AuthFactory(); Assert.assertNotNull(authService.auth()); ``` - 认证信息Bean认证 ```java Authentication user = new Authentication(); user.setAuthURL("http://controller2:5000/v3/"); user.setDomain("Default"); user.setProjectName("admin"); user.setUserName("admin"); user.setPassword("pass123456"); AuthService authService = new AuthFactory(); Assert.assertNotNull(authService.auth(user)); ``` ### Hypervisor 计算节点物理机 - 获取所有计算节点物理机信息列表 ```java List hypervisors = service.getHypervisors(); LOGGER.info("所有计算节点信息如下:"); for (Hypervisor h : hypervisors) { LOGGER.info(h.getHypervisorHostname() + " " + h.toString()); } ``` - 获取所有计算节点物理机资源使用情况的集合 ```java HypervisorStatistics statistics = service.getTotalStatistics(); LOGGER.info(statistics.toString()); ``` ### Instance 虚拟机实例层,即在计算节点上创建的每一个Instance. - 获取所有的虚拟机实例 ```java for (Server s : service.getAllInstance()) { LOGGER.info(s.toString()); } ``` - 通过计算节点ID获取运行在该计算节点上的实例 ```java boolean isHost = true; for (Server s : service.getInstancesByHypervisorID("a816a5a04556df0382e8fc7da377a91a45ff480073f00f11f556a51f")) { if (!s.getHostId().equals("a816a5a04556df0382e8fc7da377a91a45ff480073f00f11f556a51f")) { isHost = false; } } Assert.assertTrue(isHost); ``` - 通过计算节点主机名获取运行在该计算节点上的实例 ```java boolean isHost = true; for (Server s : service.getInstancesByHypervisorHostname("compute1")) { if (!s.getHypervisorHostname().equals("compute1")) { isHost = false; } } Assert.assertTrue(isHost); ``` ### Resource 监控对象,可以是虚拟机实例、镜像、浮动IP等,其ID也对应相等。 - 获取所有的监控资源对象 ```java for (Resource r : service.getResourceList()) { LOGGER.info(r.toString()); } ``` - 通过监控资源ID获取资源对象实例 ```java boolean result = false; if (service.getResourceById("1eea344d-79c4-408e-8fac-c8801e0fd702").getId() .equals("1eea344d-79c4-408e-8fac-c8801e0fd702")) { result = true; } Assert.assertTrue(result); ``` ### Meter 监控指标,例如:内存占用,网络IO,磁盘IO等等。 - 获取所有的监控指标 ```java for (Meter m : service.getMeterList()) { LOGGER.info(m.toString()); } ``` - 通过监控指标名称获取监控指标 ```java boolean result = true; for (Meter m : service.getMeterListByName("memory")) { if (!m.getName().equals("memory")) { result = false; } } Assert.assertTrue(result); ``` - 资源ID(实例ID、镜像ID等)获取其所有监控指标 ```java boolean result = true; for (Meter m : service.getMeterListByResourceId("1eea344d-79c4-408e-8fac-c8801e0fd702")) { if (!m.getResourceId().equals("1eea344d-79c4-408e-8fac-c8801e0fd702")) { result = false; } } Assert.assertTrue(result); ``` ### Sample 监控值,是每个采集时间点上meter对应的值 - 获取所有的Sample数据 ```java for (Sample s : service.getSampleList()) { LOGGER.info(s.toString()); } ``` - 通过ID获取Sample实例 ```java boolean result = false; if (service.getSampleById("61e8d94a-8bf9-11e7-9325-984be16b6791").getId() .equals("61e8d94a-8bf9-11e7-9325-984be16b6791")) { result = true; } Assert.assertTrue(result); ``` - 查询条件Criteria获取符合条件的Sample ```java boolean result = true; List samples = service.querySamples(SampleCriteria.create().resource("1eea344d-79c4-408e-8fac-c8801e0fd702")); for (Sample s : samples) { if (!s.getResourceId().equals("1eea344d-79c4-408e-8fac-c8801e0fd702")) { result = false; } } Assert.assertTrue(result); ``` - 通过监控指标名称和查询条件Criteria获取符合条件的Sample ```java boolean result = true; List samples = service.querySamples("memory", SampleCriteria.create().resource("1eea344d-79c4-408e-8fac-c8801e0fd702")); for (MeterSample s : samples) { if (!s.getResourceId().equals("1eea344d-79c4-408e-8fac-c8801e0fd702")) { result = false; } } Assert.assertTrue(result); ``` - 查询条件`SampleCriteria`的使用 可以通过`resourceId`、`projectId`分别筛选特定Resource、Project下的监控值, 还可以通过采集的时间,通过`LT`、`GT`、`LTE`、`GTE`、`EQUALS`时间前后的对比来筛选。 ```java SampleCriteria sc = new SampleCriteria() .resource("1eea344d-79c4-408e-8fac-c8801e0fd702") .project("043b9d0dfbc44982b6eda7857975fce9") .timestamp(SampleCriteria.Oper.GT, System.currentTimeMillis() - (24 * 60 * 60 * 1000)) .timestamp(SampleCriteria.Oper.LT, System.currentTimeMillis()); boolean result = true; for (Sample s : service.querySamples(sc)) { if (!s.getResourceId().equals("1eea344d-79c4-408e-8fac-c8801e0fd702") || !s.getProjectId().equals("043b9d0dfbc44982b6eda7857975fce9") || !Timestamp.valueOf(s.getTimestamp()).after(new Timestamp(System.currentTimeMillis() - (24 * 60 * 60 * 1000))) || !Timestamp.valueOf(s.getTimestamp()).before(new Timestamp(System.currentTimeMillis()))) { result = false; } } Assert.assertTrue(result); ```