Compare commits
1 Commits
Author | SHA1 | Date |
---|---|---|
bayuzhen | 30530394fc |
12
pom.xml
12
pom.xml
|
@ -129,6 +129,18 @@
|
||||||
<artifactId>tea</artifactId>
|
<artifactId>tea</artifactId>
|
||||||
<version>1.1.15</version>
|
<version>1.1.15</version>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|
|
@ -12,6 +12,6 @@ public enum CloudProvider {
|
||||||
|
|
||||||
OPENSTACK, VMWARE, ALIYUN, JDCLOUD, UNKNOWN, CEPH, SCP, H3C, HMC, FUSIONCLOUD, TENCENT, F5, HUAWEI, XEN, POWERVC,
|
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,
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,4 +15,10 @@ public class Constants {
|
||||||
|
|
||||||
public static final String BOCLOUD_SMIS = "bocloud_smis_";
|
public static final String BOCLOUD_SMIS = "bocloud_smis_";
|
||||||
|
|
||||||
|
public static final String CLOUDTOWERVMPREFIX = "bocloud_cloudtower_vm_";
|
||||||
|
|
||||||
|
public static final String CLOUDTOWERHOSTPREFIX = "bocloud_cloudtower_host_";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.bocloud.common.enums.BoCloudMethod;
|
||||||
import com.bocloud.common.enums.BoCloudService;
|
import com.bocloud.common.enums.BoCloudService;
|
||||||
import com.bocloud.common.model.*;
|
import com.bocloud.common.model.*;
|
||||||
import com.bocloud.common.utils.MapTools;
|
import com.bocloud.common.utils.MapTools;
|
||||||
|
import com.bocloud.ims.entity.CloudVendor;
|
||||||
import com.bocloud.ims.enums.CloudProvider;
|
import com.bocloud.ims.enums.CloudProvider;
|
||||||
import com.bocloud.service.core.CurrentService;
|
import com.bocloud.service.core.CurrentService;
|
||||||
import com.bocloud.service.core.Service;
|
import com.bocloud.service.core.Service;
|
||||||
|
@ -53,6 +54,22 @@ public class CmpCloudVendorService implements InitializingBean {
|
||||||
return remoteService.invoke();
|
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
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
this.headers.put(BocloudToken.INTERNAL_TOKEN, currentService.getToken());
|
this.headers.put(BocloudToken.INTERNAL_TOKEN, currentService.getToken());
|
||||||
|
|
Loading…
Reference in New Issue