迁移cloudTower监控

develop
bayuzhen 2024-05-28 15:09:42 +08:00
parent 96fd593186
commit 30530394fc
9 changed files with 807 additions and 1 deletions

12
pom.xml
View File

@ -129,6 +129,18 @@
<artifactId>tea</artifactId>
<version>1.1.15</version>
</dependency>
<dependency>
<groupId>com.bocloud</groupId>
<artifactId>bocloud.public.provider</artifactId>
<version>5.6.0-HBCL-RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.bocloud</groupId>
<artifactId>bocloud.cloudtowner.provider</artifactId>
<version>5.6.0-HBCL-RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>

View File

@ -12,6 +12,6 @@ public enum CloudProvider {
OPENSTACK, VMWARE, ALIYUN, JDCLOUD, UNKNOWN, CEPH, SCP, H3C, HMC, FUSIONCLOUD, TENCENT, F5, HUAWEI, XEN, POWERVC,
CLOUDOS, SMIS_FABRIC, SMIS_STORAGE, AZURE, KINGCLOUD, KUBERNETES, AWS, QCLOUD, TCE, PQCLOUD, XSKY, MANAGEONE,
JUMPSERVER, HORIZON, TIANYI, HILLSTONE, CISCO, AGILE, NSX,SMARTX;
JUMPSERVER, HORIZON, TIANYI, HILLSTONE, CISCO, AGILE, NSX,SMARTX, CLOUDTOWER;
}

View File

@ -0,0 +1,112 @@
package com.bocloud.mcs.collector.cloudtower;
import com.alibaba.fastjson.JSONObject;
import com.bocloud.cmp.model.Butler;
import com.bocloud.cmp.provider.CloudTowerProvider;
import com.bocloud.common.encrypt.DESEncrptor;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.common.utils.Common;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.ims.enums.CloudProvider;
import com.bocloud.mcs.collector.BocloudCollector;
import com.bocloud.service.core.CurrentService;
import com.smartx.tower.api.MetricsApi;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.ssl.SSLContextBuilder;
import org.openstack4j.core.transport.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
@Slf4j
public abstract class CloudTowerCollector extends BocloudCollector {
protected static Config config;
static {
// 全部信任 不做身份鉴定
try {
SSLContextBuilder contextBuilder = SSLContextBuilder.create().loadTrustMaterial(null,
(x509Certificates, authType) -> true);
config = Config.newConfig().withSSLVerificationDisabled().withSSLContext(contextBuilder.build())
.withReadTimeout(20 * 1000 * 1000).withConnectionTimeout(20 * 1000 * 1000);
} catch (NoSuchAlgorithmException e) {
log.error("NoSuchAlgorithmException", e);
} catch (KeyStoreException e) {
log.error("KeyStoreException", e);
} catch (KeyManagementException e) {
log.error("KeyManagementException", e);
}
}
/**
* 30
*
* @return
*/
@Override
public int getExpire() {
return 1800000;
}
Map<String, Object> cache = new HashMap<>();
@Autowired
private CurrentService currentService;
@Scheduled(initialDelay = 5000L, fixedRate = 300000L)
@Async
@Override
public void scheduledCollect() {
if (!currentService.isLeader()) {
log.info(this.getClass().getName() + "当前节点是否是主节点:" + currentService.isLeader());
return;
}
Date now = new Date();
log.info(this.getClass().getName() + " metrics start...");
BocloudResult bocloudResult = cmpCloudVendorService.list(CloudProvider.CLOUDTOWER);
if (bocloudResult.isFailed()) {
log.error("get cloud vendor list failed , error:{}", bocloudResult.getMessage());
return;
}
JSONObject data = (JSONObject) bocloudResult.getData();
List<CloudVendor> listCloudVendor = data.getJSONArray(Common.ROWS).toJavaList(CloudVendor.class);
List<MetricFamilySamples> mfs = new ArrayList<>();
for (CloudVendor cloudVendor : listCloudVendor) {
try {
String address = JSONObject.parseObject(cloudVendor.getAuthentication()).getString("address");
String username = JSONObject.parseObject(cloudVendor.getAuthentication()).getString("account");
String passwordJson = JSONObject.parseObject(cloudVendor.getAuthentication()).getString("password");
String password = new DESEncrptor().decrypt(passwordJson.trim(), "BocloudCMP");
Butler butler = new Butler();
butler.setUrl(address);
butler.setUsername(username);
butler.setPassword(password);
CloudTowerProvider cloudTowerProvider = new CloudTowerProvider(butler);
boolean accessable = cloudTowerProvider.accessable();
if (accessable) {
MetricsApi metricsApi = new MetricsApi(cloudTowerProvider.getApiClient());
collectMfs(mfs, metricsApi, cloudVendor);
}
} catch (Exception e) {
log.error("同步监控指标报错", e);
}
}
cache.put(TIME, new Date());
cache.put(DATA, mfs);
log.info(this.getClass().getName() + " metrics end! use " + (System.currentTimeMillis() - now.getTime()) / 1000 + "s");
}
protected abstract void collectMfs(List<MetricFamilySamples> mfs, MetricsApi metricsApi, CloudVendor cloudVendor) throws Exception;
@Override
public Map<String, Object> getCache() {
return this.cache;
}
}

View File

@ -0,0 +1,213 @@
package com.bocloud.mcs.collector.cloudtower;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.mcs.common.Constants;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.smartx.tower.api.MetricsApi;
import com.smartx.tower.model.GetHostMetricInput;
import com.smartx.tower.model.HostWhereInput;
import com.smartx.tower.model.Metric;
import com.smartx.tower.model.WithTaskMetric;
import io.prometheus.client.GaugeMetricFamily;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.*;
@Slf4j
@Component
public class CloudTowerHostCollector extends CloudTowerCollector {
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("cloudTower-host-%d").build();
private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors() + 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(), nameThreadFactory);
@Override
protected void collectMfs(List<MetricFamilySamples> mfs, MetricsApi metricsApi, CloudVendor cloudVendor) {
Date now = new Date();
List<String> labels = Arrays.asList("vendorId", "id", "name", "instanceId");
GaugeMetricFamily collectTimeUse = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "collect_time_use", "help",
Arrays.asList("type"));
try {
BocloudResult bocloudResult = cmpCloudVendorService.hostList(cloudVendor);
JSONObject data = (JSONObject) bocloudResult.getData();
if (data == null) {
log.info("查询cloudTower宿主机为null");
return;
}
JSONArray objects = JSONObject.parseArray(data.get("rows").toString());
List<String> instanceIds = new ArrayList<>();
for (Object object : objects) {
JSONObject server = JSONObject.parseObject(object.toString());
instanceIds.add(server.getString("uuid"));
}
String [] metrics = {
"host_cpu_overall_usage_percent",
"elf_host_vcpus_provisioned",
"host_hp_memory_usage_percent",
"elf_host_memory_provisioned_bytes",
// TODO
"zbs_chunk_data_capacity_bytes",
"zbs_chunk_used_data_space_bytes",
"zbs_chunk_read_iops",
"zbs_chunk_write_iops",
"zbs_chunk_avg_read_latency_ns",
"zbs_chunk_avg_write_latency_ns"
};
log.info("get {} cloudTowerHOST ", objects.size());
List<Future<List<MetricFamilySamples>>> futures = new ArrayList<>();
for (Object object : objects) {
Future<List<MetricFamilySamples>> future = executorService.submit(() -> {
List<MetricFamilySamples> mfsOne = new ArrayList<>();
// cpu使用率
GaugeMetricFamily cpusUsed = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "host_cpu_overall_usage_percent", "help",
labels);
// cpu已使用量
GaugeMetricFamily cpusUsedTotal = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "elf_host_vcpus_provisioned", "help",
labels);
// 内存使用率
GaugeMetricFamily memUsed = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "host_memory_usage_percent", "help",
labels);
// 内存已使用量
GaugeMetricFamily memUsedTotal = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "elf_host_memory_provisioned_bytes", "help",
labels);
// 存储使用率
GaugeMetricFamily storageUsed = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "host_storage_usage_percent", "help",
labels);
// 存储已使用量
GaugeMetricFamily storageUsedTotal = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "zbs_chunk_used_data_space_bytes", "help",
labels);
GaugeMetricFamily storeIOPSRead = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "zbs_chunk_read_iops", "help",
labels);
// 存储吞吐量(读)
GaugeMetricFamily storeIngestionRead = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "zbs_chunk_write_iops", "help",
labels);
// 主机I/O平均读延时
GaugeMetricFamily storeAwaitRead = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "zbs_chunk_avg_read_latency_ns", "help",
labels);
// 主机I/O平均写延时
GaugeMetricFamily storeIOPSWrite = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "zbs_chunk_avg_write_latency_ns", "help",
labels);
JSONObject server = JSONObject.parseObject(object.toString());
if (server.getString("uuid") == null) {
log.info("当前主机信息不完善{}" ,server.getString("name"));
} else {
GetHostMetricInput getHostMetricInput = new GetHostMetricInput();
getHostMetricInput.setMetrics(Arrays.asList(metrics));
getHostMetricInput.setRange("2h");
GetHostMetricInput monitors = getHostMetricInput.hosts(new HostWhereInput().id(server.getString("uuid")));
List<WithTaskMetric> hostMetrics = metricsApi.getHostMetrics(monitors);
double storeTotal = 0;
for (WithTaskMetric monitor : hostMetrics) {
if (monitor.getData() == null){
continue;
}
Metric metric = monitor.getData();
if (metric.getSampleStreams().get(0).getPoints() == null) {
continue;
}
// cpu使用率
if ("host_cpu_overall_usage_percent".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
cpusUsed.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
// cpu使用量
if ("elf_host_vcpus_provisioned".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
cpusUsedTotal.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
// 内存使用率
if ("host_hp_memory_usage_percent".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
memUsed.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
// 存储使用量
if ("zbs_chunk_used_data_space_bytes".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double storeUsedTotalValue = getV(metric);
// 存储使用率
storageUsed.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), (storeUsedTotalValue/storeTotal)*100);
// 存储使用量
storageUsedTotal.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), storeUsedTotalValue);
}
if ("elf_host_memory_provisioned_bytes".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
memUsedTotal.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
if ("zbs_chunk_read_iops".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
storeIOPSRead.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
if ("zbs_chunk_write_iops".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
storeIngestionRead.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
if ("zbs_chunk_avg_read_latency_ns".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
storeAwaitRead.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
if ("zbs_chunk_avg_write_latency_ns".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
storeIOPSWrite.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
}
mfsOne.add(cpusUsed);
mfsOne.add(cpusUsedTotal);
mfsOne.add(memUsed);
mfsOne.add(memUsedTotal);
mfsOne.add(storageUsed);
mfsOne.add(storageUsedTotal);
mfsOne.add(storeIOPSRead);
mfsOne.add(storeIngestionRead);
mfsOne.add(storeAwaitRead);
mfsOne.add(storeIOPSWrite);
}
return mfsOne;
});
futures.add(future);
}
Optional.ofNullable(futures).orElse(new ArrayList<>()).forEach(stringFuture -> {
try {
mfs.addAll(stringFuture.get());
} catch (Exception e) {
log.error("collect cloudTower host partition metrics error!" + e.getMessage(), e);
}
});
collectTimeUse.addMetric(Arrays.asList("cloudTower_host"), (System.currentTimeMillis() - now.getTime()));
mfs.add(collectTimeUse);
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("collect cloudTower host partition metrics end! use " + (System.currentTimeMillis() - now.getTime()) / 1000 + "s");
}
private static Double getV(Metric metric) {
return metric.getSampleStreams().get(metric.getSampleStreams().size() - 1)
.getPoints()
.get(metric.getSampleStreams().get(0).getPoints().size() - 1)
.getV();
}
}

View File

@ -0,0 +1,122 @@
package com.bocloud.mcs.collector.cloudtower;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.mcs.common.Constants;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.smartx.tower.api.MetricsApi;
import com.smartx.tower.model.*;
import io.prometheus.client.GaugeMetricFamily;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
@Slf4j
@Component
public class CloudTowerHostNetCollector extends CloudTowerCollector {
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("cloudTower-hostNet-%d").build();
private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors() + 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(), nameThreadFactory);
@Override
protected void collectMfs(List<MetricFamilySamples> mfs, MetricsApi metricsApi, CloudVendor cloudVendor) {
Date now = new Date();
List<String> labels = Arrays.asList("vendorId", "id", "name", "instanceId");
// 网口数据接收速度
GaugeMetricFamily networkReceive = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "host_network_receive_speed_bitps", "help",labels);
// 网口数据发送速度
GaugeMetricFamily networkTransmit = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "host_network_transmit_speed_bitps", "help",labels);
GaugeMetricFamily collectTimeUse = new GaugeMetricFamily(Constants.CLOUDTOWERHOSTPREFIX + "collect_time_use", "help",
Arrays.asList("type"));
try {
BocloudResult bocloudResult = cmpCloudVendorService.hostList(cloudVendor);
JSONObject data = (JSONObject) bocloudResult.getData();
if (data == null) {
log.info("查询cloudTower宿主机为null");
return;
}
JSONArray objects = JSONObject.parseArray(data.get("rows").toString());
List<String> instanceIds = new ArrayList<>();
for (Object object : objects) {
JSONObject server = JSONObject.parseObject(object.toString());
instanceIds.add(server.getString("uuid"));
}
String [] netMetrics = {
// 网口数据接收速度
"host_network_receive_speed_bitps",
// 网口数据发送速度
"host_network_transmit_speed_bitps"
};
log.info("get {} cloudTowerHOST ", objects.size());
List<Future<List<MetricFamilySamples>>> futures = new ArrayList<>();
for (Object object : objects) {
Future<List<MetricFamilySamples>> future = executorService.submit(() -> {
List<MetricFamilySamples> mfsOne = new ArrayList<>();
JSONObject server = JSONObject.parseObject(object.toString());
if (server.getString("uuid") == null) {
log.info("当前主机信息不完善{}" ,server.getString("name"));
} else {
GetHostNetworkMetricInput getHostNetworkMetricInput = new GetHostNetworkMetricInput()
.hosts(new HostWhereInput().id(server.getString("uuid")))
.range("2h")
.metrics(Arrays.asList(netMetrics))
.nics(new NicWhereInput().id(server.getString("nicUuid")));
List<WithTaskMetric> networkMetrics = metricsApi.getHostNetworkMetrics(getHostNetworkMetricInput);
for (WithTaskMetric monitor : networkMetrics) {
if (monitor.getData() == null){
continue;
}
Metric metric = monitor.getData();
if (metric.getSampleStreams().get(0).getPoints() == null) {
continue;
}
// 网口数据接收速度
if ("host_network_receive_speed_bitps".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
networkReceive.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
// 网口数据发送速度
if ("host_network_transmit_speed_bitps".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
networkTransmit.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), server.get("id").toString(),
server.get("name").toString(), server.get("uuid").toString()), value);
}
}
mfsOne.add(networkReceive);
mfsOne.add(networkTransmit);
}
return mfsOne;
});
futures.add(future);
}
Optional.ofNullable(futures).orElse(new ArrayList<>()).forEach(stringFuture -> {
try {
mfs.addAll(stringFuture.get());
} catch (Exception e) {
log.error("collect cloudTower hostNet partition metrics error!" + e.getMessage(), e);
}
});
collectTimeUse.addMetric(Arrays.asList("cloudTower_host"), (System.currentTimeMillis() - now.getTime()));
mfs.add(collectTimeUse);
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("collect cloudTower hostNet partition metrics end! use " + (System.currentTimeMillis() - now.getTime()) / 1000 + "s");
}
private static Double getV(Metric metric) {
return metric.getSampleStreams().get(metric.getSampleStreams().size() - 1)
.getPoints()
.get(metric.getSampleStreams().get(0).getPoints().size() - 1)
.getV();
}
}

View File

@ -0,0 +1,202 @@
package com.bocloud.mcs.collector.cloudtower;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.mcs.common.Constants;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.smartx.tower.api.MetricsApi;
import com.smartx.tower.model.GetVmMetricInput;
import com.smartx.tower.model.Metric;
import com.smartx.tower.model.VmWhereInput;
import com.smartx.tower.model.WithTaskMetric;
import io.prometheus.client.GaugeMetricFamily;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.*;
/**
* archeros
* @author byz
* @version 1.0
* @date 2023-06-30
* @version 5.6.0-SNAPSHOT
*/
@Slf4j
@Component
public class CloudTowerVmCollector extends CloudTowerCollector {
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("cloudTower-vm-%d").build();
private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors() + 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(), nameThreadFactory);
@Override
protected void collectMfs(List<MetricFamilySamples> mfs, MetricsApi metricsApi, CloudVendor cloudVendor) throws Exception {
Date now = new Date();
List<String> labels = Arrays.asList("vendorId", "id", "name", "instanceId");
GaugeMetricFamily collectTimeUse = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "collect_time_use", "help",
Arrays.asList("type"));
try {
BocloudResult bocloudResult = cmpCloudVendorService.vmtList(cloudVendor);
JSONObject data = (JSONObject) bocloudResult.getData();
if ( data == null) {
log.info("查询cloudTower虚拟机为null");
return;
}
JSONArray objects = JSONObject.parseArray(data.get("rows").toString());
log.info("get {} cloudTowerVM ", objects.size());
List<String> hostNames = new ArrayList<>();
JSONObject jsonObject = new JSONObject();
jsonObject.put("range","0");
List<String> instanceIds = new ArrayList<>();
List<Future<List<MetricFamilySamples>>> futures = new ArrayList<>();
for (Object object : objects) {
JSONObject server = JSONObject.parseObject(object.toString());
if (server.get("instanceId") == null) {
log.info("当前云主机信息不完善{}" ,server.getString("name"));
continue;
}
instanceIds.add(server.getString("instanceId"));
}
String [] metrics = {
"elf_vm_cpu_overall_usage_percent",
"elf_vm_cpu_overall_used_hz",
"elf_vm_memory_usage_percent",
"elf_vm_memory_used_bytes",
"elf_vm_network_receive_packets",
"elf_vm_network_transmit_packets",
"elf_vm_disk_overall_read_iops",
"elf_vm_disk_overall_write_iops",
};
for (Object object : objects) {
Future<List<MetricFamilySamples>> future = executorService.submit(() -> {
List<MetricFamilySamples> mfsOne = new ArrayList<>();
// cpu使用率
GaugeMetricFamily cpuUsed = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_cpu_overall_usage_percent", "help",
labels);
// 虚拟机CPU使用频率
GaugeMetricFamily cpuUsedTotal = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_cpu_overall_used_hz", "help",
labels);
// 内存使用率
GaugeMetricFamily memUsed = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_memory_usage_percent", "help",
labels);
// 虚拟机内存使用量
GaugeMetricFamily memUsedTotal = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_memory_used_bytes", "help",
labels);
// 网络吞吐量(流入)
GaugeMetricFamily netIngestionIn = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_network_receive_packets", "help",
labels);
// 网络吞吐量(流出)
GaugeMetricFamily netIngestionOut = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_network_transmit_packets", "help",
labels);
// 磁盘吞吐量(读)
GaugeMetricFamily diskIngestionRead = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_disk_overall_read_iops", "help",
labels);
// 磁盘吞吐量(写)
GaugeMetricFamily diskIngestionWrite = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_disk_overall_write_iops", "help",
labels);
JSONObject cloudServer = JSONObject.parseObject(object.toString());
if (cloudServer.get("instanceId") == null) {
log.info("当前云主机信息不完善{}" ,cloudServer.getString("name"));
} else {
GetVmMetricInput getVmMetricInput = new GetVmMetricInput();
getVmMetricInput.setMetrics(Arrays.asList(metrics));
getVmMetricInput.setRange("2h");
GetVmMetricInput monitors = getVmMetricInput.vms(new VmWhereInput().id(cloudServer.getString("instanceId")));
List<WithTaskMetric> vmMetrics = metricsApi.getVmMetrics(monitors);
for (WithTaskMetric monitor : vmMetrics) {
if (monitor.getData() == null){
continue;
}
Metric metric = monitor.getData();
if (metric.getSampleStreams().get(0).getPoints() == null) {
continue;
}
// cpu使用率
if ("elf_vm_cpu_overall_usage_percent".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
cpuUsed.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_cpu_overall_used_hz".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
cpuUsedTotal.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_memory_usage_percent".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
memUsed.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_memory_used_bytes".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
memUsedTotal.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_network_receive_packets".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
netIngestionIn.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_network_transmit_packets".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
netIngestionOut.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_disk_overall_read_iops".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
diskIngestionRead.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
if ("elf_vm_disk_overall_write_iops".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
diskIngestionWrite.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
}
mfsOne.add(cpuUsed);
mfsOne.add(cpuUsedTotal);
mfsOne.add(memUsed);
mfsOne.add(memUsedTotal);
mfsOne.add(diskIngestionRead);
mfsOne.add(diskIngestionWrite);
mfsOne.add(netIngestionIn);
mfsOne.add(netIngestionOut);
}
return mfsOne;
});
futures.add(future);
}
Optional.ofNullable(futures).orElse(new ArrayList<>()).forEach(stringFuture -> {
try {
mfs.addAll(stringFuture.get());
} catch (Exception e) {
}
});
collectTimeUse.addMetric(Arrays.asList("cloudTower_vm"), (System.currentTimeMillis() - now.getTime()));
mfs.add(collectTimeUse);
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("collect cloudTower vm partition metrics end! use " + (System.currentTimeMillis() - now.getTime()) / 1000 + "s");
}
private static Double getV(Metric metric) {
return metric.getSampleStreams().get(metric.getSampleStreams().size() - 1)
.getPoints()
.get(metric.getSampleStreams().get(0).getPoints().size() - 1)
.getV();
}
}

View File

@ -0,0 +1,122 @@
package com.bocloud.mcs.collector.cloudtower;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.bocloud.common.model.BocloudResult;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.mcs.common.Constants;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.smartx.tower.api.MetricsApi;
import com.smartx.tower.model.*;
import io.prometheus.client.GaugeMetricFamily;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
@Slf4j
@Component
public class CloudTowerVmNetCollector extends CloudTowerCollector {
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat("cloudTower-vmNet-%d").build();
private ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors() + 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(), nameThreadFactory);
@Override
protected void collectMfs(List<MetricFamilySamples> mfs, MetricsApi metricsApi, CloudVendor cloudVendor) throws Exception {
Date now = new Date();
List<String> labels = Arrays.asList("vendorId", "id", "name", "instanceId");
GaugeMetricFamily collectTimeUse = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "collect_time_use", "help",
Arrays.asList("type"));
try {
BocloudResult bocloudResult = cmpCloudVendorService.vmtList(cloudVendor);
JSONObject data = (JSONObject) bocloudResult.getData();
if ( data == null) {
log.info("查询cloudTower虚拟机为null");
return;
}
JSONArray objects = JSONObject.parseArray(data.get("rows").toString());
log.info("get {} cloudTowerVM ", objects.size());
List<String> hostNames = new ArrayList<>();
JSONObject jsonObject = new JSONObject();
jsonObject.put("range","0");
List<String> instanceIds = new ArrayList<>();
String [] netMetrics = {
// 接收
"elf_vm_network_receive_speed_bps",
// 发送
"elf_vm_network_transmit_speed_bps"
};
List<Future<List<MetricFamilySamples>>> futures = new ArrayList<>();
for (Object object : objects) {
Future<List<MetricFamilySamples>> future = executorService.submit(() -> {
List<MetricFamilySamples> mfsOne = new ArrayList<>();
// 网口数据接收速度
GaugeMetricFamily vmNetReceived = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_network_receive_speed_bps", "help",
labels);
// 网口数据发送速度
GaugeMetricFamily vmNetTransmitted = new GaugeMetricFamily(Constants.CLOUDTOWERVMPREFIX + "elf_vm_network_transmit_speed_bps", "help",
labels);
JSONObject cloudServer = JSONObject.parseObject(object.toString());
if (cloudServer.get("instanceId") == null) {
log.info("当前云主机信息不完善{}" ,cloudServer.getString("name"));
} else {
GetVmNetWorkMetricInput getVmNetWorkMetricInput = new GetVmNetWorkMetricInput()
.range("2h")
.metrics(Arrays.asList(netMetrics))
.vms(new VmWhereInput().id(cloudServer.getString("instanceId")))
.nics(new VmNicWhereInput().id(Optional.ofNullable(cloudServer.getString("nicUuid")).orElse("")));
List<WithTaskMetric> vmNetMetrics = metricsApi.getVmNetWorkMetrics(getVmNetWorkMetricInput);
for (WithTaskMetric vmNetMetric : vmNetMetrics) {
if (vmNetMetric.getData() == null){
continue;
}
Metric metric = vmNetMetric.getData();
if (metric.getSampleStreams().get(0).getPoints() == null) {
continue;
}
// 网口数据接收速度
if ("elf_vm_network_receive_speed_bps".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
vmNetReceived.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
// 网口数据发送速度
if ("elf_vm_network_transmit_speed_bps".equals(metric.getSampleStreams().get(0).getLabels().getMetricName())) {
// 取时间最大值
double value = getV(metric);
vmNetTransmitted.addMetric(Arrays.asList(String.valueOf(cloudVendor.getId()), cloudServer.get("id").toString(),
cloudServer.get("name").toString(), cloudServer.get("instanceId").toString()), value);
}
}
mfsOne.add(vmNetReceived);
mfsOne.add(vmNetTransmitted);
}
return mfsOne;
});
futures.add(future);
}
Optional.ofNullable(futures).orElse(new ArrayList<>()).forEach(stringFuture -> {
try {
mfs.addAll(stringFuture.get());
} catch (Exception e) {
}
});
collectTimeUse.addMetric(Arrays.asList("cloudTower_vm"), (System.currentTimeMillis() - now.getTime()));
mfs.add(collectTimeUse);
} catch (Exception e) {
log.error(e.getMessage());
}
log.info("collect cloudTower vmNet partition metrics end! use " + (System.currentTimeMillis() - now.getTime()) / 1000 + "s");
}
private static Double getV(Metric metric) {
return metric.getSampleStreams().get(metric.getSampleStreams().size() - 1)
.getPoints()
.get(metric.getSampleStreams().get(0).getPoints().size() - 1)
.getV();
}
}

View File

@ -15,4 +15,10 @@ public class Constants {
public static final String BOCLOUD_SMIS = "bocloud_smis_";
public static final String CLOUDTOWERVMPREFIX = "bocloud_cloudtower_vm_";
public static final String CLOUDTOWERHOSTPREFIX = "bocloud_cloudtower_host_";
}

View File

@ -5,6 +5,7 @@ import com.bocloud.common.enums.BoCloudMethod;
import com.bocloud.common.enums.BoCloudService;
import com.bocloud.common.model.*;
import com.bocloud.common.utils.MapTools;
import com.bocloud.ims.entity.CloudVendor;
import com.bocloud.ims.enums.CloudProvider;
import com.bocloud.service.core.CurrentService;
import com.bocloud.service.core.Service;
@ -53,6 +54,22 @@ public class CmpCloudVendorService implements InitializingBean {
return remoteService.invoke();
}
public BocloudResult vmtList(CloudVendor cloudVendor) {
List<Param> paramList = new ArrayList<>();
paramList.add(new Param(MapTools.simpleMap("vendor_id", cloudVendor.getId()), Sign.EQ));
RemoteService remoteService = serviceFactory.build(service, "/v1/vms", BoCloudMethod.GET, headers,
new Pager(1, Integer.MAX_VALUE, paramList, null).toMap(false));
return remoteService.invoke();
}
public BocloudResult hostList(CloudVendor cloudVendor) {
List<Param> paramList = new ArrayList<>();
paramList.add(new Param(MapTools.simpleMap("vendor_id", cloudVendor.getId()), Sign.EQ));
RemoteService remoteService = serviceFactory.build(service, "/v1/hosts", BoCloudMethod.GET, headers,
new Pager(1, Integer.MAX_VALUE, paramList, null).toMap(false));
return remoteService.invoke();
}
@Override
public void afterPropertiesSet() throws Exception {
this.headers.put(BocloudToken.INTERNAL_TOKEN, currentService.getToken());