1224 lines
80 KiB
Java
1224 lines
80 KiB
Java
package com.bocloud.cms.service;
|
||
|
||
import com.alibaba.fastjson.JSONArray;
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.bocloud.cms.common.utils.PrometheusUtils;
|
||
import com.bocloud.cms.entity.AnalysisSnapshot;
|
||
import com.bocloud.cms.intf.AnalysisService;
|
||
import com.bocloud.cms.intf.PrometheusService;
|
||
import com.bocloud.cms.model.PrometheusResult;
|
||
import com.bocloud.cms.repository.AnalysisRuleRepository;
|
||
import com.bocloud.cms.repository.AnalysisSnapshotRepository;
|
||
import com.bocloud.cms.service.core.AnalysisHandleRunable;
|
||
import com.bocloud.cms.service.internal.ImsCloudServerService;
|
||
import com.bocloud.cms.service.internal.ImsCloudVendorService;
|
||
import com.bocloud.cms.service.internal.ImsServerService;
|
||
import com.bocloud.common.model.*;
|
||
import com.bocloud.common.utils.Common;
|
||
import com.bocloud.common.utils.ListTool;
|
||
import com.bocloud.common.utils.MapTools;
|
||
import com.bocloud.ims.entity.CloudServer;
|
||
import com.bocloud.ims.entity.Server;
|
||
import com.bocloud.ims.enums.CloudProvider;
|
||
import com.bocloud.rpc.interfaces.ims.ImsRpcService;
|
||
import com.google.common.collect.Lists;
|
||
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||
import org.apache.commons.lang3.StringUtils;
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
import org.springframework.amqp.core.AmqpTemplate;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
import org.springframework.util.Assert;
|
||
|
||
import java.text.MessageFormat;
|
||
import java.util.*;
|
||
import java.util.concurrent.*;
|
||
|
||
import static com.bocloud.ims.enums.CloudProvider.*;
|
||
|
||
/**
|
||
* 监控分析Service接口
|
||
* @author zhangyf
|
||
* @version 1.0
|
||
* @date 2022/2/21 18:01
|
||
* @version 5.5.0-SNAPSHOT
|
||
*/
|
||
@Service
|
||
public class AnalysisServiceImpl implements AnalysisService {
|
||
|
||
private static final Logger logger = LoggerFactory.getLogger(AnalysisServiceImpl.class);
|
||
|
||
ThreadFactory generateRuleFactory = new ThreadFactoryBuilder().setNameFormat("analysis-service-pool-%d").build();
|
||
private ExecutorService executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors() + 1, Runtime.getRuntime().availableProcessors() + 1, 0L, TimeUnit.MILLISECONDS,
|
||
new LinkedBlockingQueue<>(), generateRuleFactory);
|
||
|
||
/**
|
||
* CPU利用率(%)
|
||
*/
|
||
private static final String CPU_USAGE_AVERAGE = "cpuUsageAverage";
|
||
/**
|
||
* 内存利用率(%)
|
||
*/
|
||
private static final String MEM_USAGE_AVERAGE = "memUsageAverage";
|
||
/**
|
||
* 磁盘利用率(%),容量
|
||
*/
|
||
private static final String DISK_USED_PERCENT = "diskUsedPercent";
|
||
/**
|
||
* CPU就绪时间(毫秒)
|
||
*/
|
||
private static final String CPU_READY_SUMMATION = "cpuReadySummation";
|
||
/**
|
||
* 磁盘使用情况(KBps)
|
||
*/
|
||
private static final String DISK_USAGE_AVERAGE = "diskUsageAverage";
|
||
/**
|
||
* 网络使用情况(KBps)
|
||
*/
|
||
private static final String NET_USAGE_AVERAGE = "netUsageAverage";
|
||
|
||
private static final String VALUE_TYPE = "valueType";
|
||
private static final String METRIC = "metric";
|
||
private static final String OPERATOR = "operator";
|
||
|
||
@Autowired
|
||
private PrometheusService prometheusService;
|
||
@Autowired
|
||
private ImsCloudServerService imsCloudServerService;
|
||
@Autowired
|
||
private ImsServerService imsServerService;
|
||
@Autowired
|
||
private ImsCloudVendorService imsCloudVendorService;
|
||
@Autowired
|
||
private AnalysisSnapshotRepository analysisSnapshotRepository;
|
||
@Autowired
|
||
private AnalysisRuleRepository analysisRuleRepository;
|
||
@Autowired
|
||
private AmqpTemplate amqpTemplate;
|
||
@Autowired
|
||
private ImsRpcService imsRpcService;
|
||
|
||
private static Map<String, String> vmVcenterMetricMap = new HashMap<>(8);
|
||
private static Map<String, String> hostVcenterMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> vmOpenStackMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> hostOpenStackMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> vmManageOneMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> hostManageOneMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> vmTianyiMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> vmCloudTowerMetricMap = new HashMap<>(4);
|
||
private static Map<String, String> hostCLoudTowerMetricMap = new HashMap<>(4);
|
||
|
||
|
||
|
||
static {
|
||
vmVcenterMetricMap.put(CPU_USAGE_AVERAGE, "vsphere_vm_cpu_usage_average");
|
||
vmVcenterMetricMap.put(MEM_USAGE_AVERAGE, "vsphere_vm_mem_usage_average");
|
||
vmVcenterMetricMap.put(CPU_READY_SUMMATION, "vsphere_vm_cpu_ready_summation{cpu='instance-total'}");
|
||
vmVcenterMetricMap.put(DISK_USAGE_AVERAGE, "vsphere_vm_disk_usage_average{disk='instance-total'}");
|
||
vmVcenterMetricMap.put(NET_USAGE_AVERAGE, "vsphere_vm_net_usage_average{interface='instance-total'}");
|
||
vmVcenterMetricMap.put(DISK_USED_PERCENT, "vsphere_partition_disk_usedPercent{path=''}");
|
||
hostVcenterMetricMap.put(CPU_USAGE_AVERAGE, "vsphere_host_cpu_usage_average{cpu='instance-total'}");
|
||
hostVcenterMetricMap.put(MEM_USAGE_AVERAGE, "vsphere_host_mem_usage_average");
|
||
hostVcenterMetricMap.put(CPU_READY_SUMMATION, "vsphere_host_cpu_ready_summation{cpu='instance-total'}");
|
||
vmOpenStackMetricMap.put(CPU_USAGE_AVERAGE, "((avg(irate(libvirt_domain_info_cpu_time_seconds_total{}[5m])) by (instanceId))*100/avg(libvirt_domain_info_virtual_cpus)by (instanceId))");
|
||
vmOpenStackMetricMap.put(MEM_USAGE_AVERAGE, "((1-libvirt_domain_memory_stat_unused/libvirt_domain_memory_stat_available{})*100)");
|
||
hostOpenStackMetricMap.put(CPU_USAGE_AVERAGE, "((1 - avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (host_id))*100)");
|
||
hostOpenStackMetricMap.put(MEM_USAGE_AVERAGE, "(100 - ((node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)/node_memory_MemTotal_bytes{}) * 100)");
|
||
vmManageOneMetricMap.put(CPU_USAGE_AVERAGE, "bocloud_fusioncloud_vm_cpuUsage");
|
||
vmManageOneMetricMap.put(MEM_USAGE_AVERAGE, "bocloud_fusioncloud_vm_memoryUsage");
|
||
hostManageOneMetricMap.put(CPU_USAGE_AVERAGE, "bocloud_fusioncloud_host_cpuUsage");
|
||
hostManageOneMetricMap.put(MEM_USAGE_AVERAGE, "bocloud_fusioncloud_host_memoryUsage");
|
||
vmTianyiMetricMap.put(CPU_USAGE_AVERAGE, "round(tianyi_agt_ecs_cpu_usage{} or tianyi_sys_ecs_cpu_util{},0.01)");
|
||
vmTianyiMetricMap.put(MEM_USAGE_AVERAGE, "round(tianyi_agt_ecs_mem_usedPercent{} or tianyi_sys_ecs_mem_util{},0.01)");
|
||
vmTianyiMetricMap.put(DISK_USED_PERCENT, "round(tianyi_agt_ecs_disk_usedPercent{},0.01)");
|
||
vmCloudTowerMetricMap.put(CPU_USAGE_AVERAGE, "bocloud_cloudtower_vm_elf_vm_cpu_overall_usage_percent");
|
||
vmCloudTowerMetricMap.put(MEM_USAGE_AVERAGE, "bocloud_cloudtower_vm_elf_vm_memory_usage_percent");
|
||
hostCLoudTowerMetricMap.put(CPU_USAGE_AVERAGE, "bocloud_cloudtower_host_host_cpu_overall_usage_percent");
|
||
hostCLoudTowerMetricMap.put(MEM_USAGE_AVERAGE, "bocloud_cloudtower_host_host_memory_usage_percent");
|
||
}
|
||
|
||
@Override
|
||
public BocloudResult handle(Long id, Long vendorId, String startTime, String endTime, RequestContext context, String token) {
|
||
try {
|
||
executor.execute(new AnalysisHandleRunable(id, vendorId, startTime, endTime, this, amqpTemplate, context, token));
|
||
return new BocloudResult(true, "请求已提交,请耐心等待分析结果。");
|
||
} catch (Exception e) {
|
||
logger.error(e.getMessage(), e);
|
||
return new BocloudResult(false, e.getMessage());
|
||
}
|
||
}
|
||
|
||
public AnalysisSnapshot vmAnalysis(JSONArray params, String type, Date start, Date end, String flag, String vendorType, String token) {
|
||
AnalysisSnapshot snapshot = new AnalysisSnapshot();
|
||
// 从prometheus里查询出所有的符合条件的云主机uuid
|
||
long t = System.currentTimeMillis();
|
||
Set<String> tags = this.queryVmTagsFromPrometheus(start, end, flag, vendorType, params);
|
||
logger.info("analysis cost prom:" + (System.currentTimeMillis() - t));
|
||
//列表数据
|
||
Map<String, JSONObject> paramMap = convertParamMap(params);
|
||
List<JSONObject> list = vmAnalysisList(paramMap, start, end, tags, vendorType, token);
|
||
JSONObject result = new JSONObject();
|
||
result.put("list", list);
|
||
List<JSONObject> charts = tops(paramMap, type, start, end, tags, null, vendorType);
|
||
result.put("charts", charts);
|
||
snapshot.setResult(result.toJSONString());
|
||
return snapshot;
|
||
}
|
||
|
||
public AnalysisSnapshot hostAnalysis(JSONArray params, String type, Date start, Date end, String flag, String vendorType, Long vendorId) {
|
||
AnalysisSnapshot snapshot = new AnalysisSnapshot();
|
||
List<String> tags = this.queryHostTagsFromPrometheus(start, end, flag, vendorType, params);
|
||
Map<String, JSONObject> paramMap = convertParamMap(params);
|
||
//列表数据
|
||
List<JSONObject> list = hostAnalysisList(paramMap, start, end, tags, vendorType, vendorId);
|
||
JSONObject result = new JSONObject();
|
||
result.put("list", list);
|
||
List<JSONObject> charts = tops(paramMap, type, start, end, new HashSet<>(), tags, vendorType);
|
||
result.put("charts", charts);
|
||
snapshot.setResult(result.toJSONString());
|
||
return snapshot;
|
||
}
|
||
|
||
/**
|
||
* tops,云主机使用uuid配置,宿主机使用esxhostname匹配
|
||
*
|
||
* @param paramMap
|
||
* @param type
|
||
* @param start
|
||
* @param end
|
||
* @param vmTags
|
||
* @param hostTags
|
||
* @return
|
||
*/
|
||
private List<JSONObject> tops(Map<String, JSONObject> paramMap, String type, Date start, Date end, Set<String> vmTags, List<String> hostTags, String vendorType) {
|
||
List<JSONObject> charts = new ArrayList<>();
|
||
Boolean result = vmTags == null || vmTags.isEmpty();
|
||
if ((result) && ListTool.isEmpty(hostTags)) {
|
||
return charts;
|
||
}
|
||
String time = String.valueOf(end.getTime() / 1000);
|
||
String vmText = "";
|
||
if (vmTags != null && !vmTags.isEmpty()) {
|
||
vmText = StringUtils.join(vmTags.toArray(), '|');
|
||
}
|
||
|
||
|
||
|
||
String hostText = "";
|
||
if (!ListTool.isEmpty(hostTags)) {
|
||
hostText = StringUtils.join(hostTags.toArray(), '|');
|
||
}
|
||
String duration = (end.getTime() - start.getTime()) / 1000L + "s:";
|
||
String template = "{0}_over_time({1}[{2}]) {3} {4}";
|
||
if ("cloudServerRecycle".equals(type)) {
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
String expr = "sort_desc(bottomk(10,round(sum by (instanceId,instanceName) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"((avg(irate(libvirt_domain_info_cpu_time_seconds_total{instanceId=~'" + vmText + "'}[5m])) by (instanceId,instanceName))*100/avg(libvirt_domain_info_virtual_cpus)by (instanceId,instanceName))", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr2 = "sort_desc(bottomk(10,round(sum by (instanceId,instanceName) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"((1-libvirt_domain_memory_stat_unused/libvirt_domain_memory_stat_available{instanceId=~'" + vmText + "'})*100)", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Bottom", expr, "%", OPENSTACK.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Bottom", expr2, "%", OPENSTACK.name()));
|
||
break;
|
||
case VMWARE:
|
||
String expr3 = "sort_desc(bottomk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_cpu_usage_average{cpu='instance-total',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr4 = "sort_desc(bottomk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_mem_usage_average{uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr41 = "sort_desc(bottomk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(DISK_USED_PERCENT).getString(VALUE_TYPE),
|
||
"vsphere_partition_disk_usedPercent{path='',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(DISK_USED_PERCENT).getString(OPERATOR),
|
||
paramMap.get(DISK_USED_PERCENT).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Bottom", expr3, "%", VMWARE.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Bottom", expr4, "%", VMWARE.name()));
|
||
charts.add(vmLineChart(time, "云主机磁盘利用率Bottom", expr41, "%", VMWARE.name()));
|
||
break;
|
||
case MANAGEONE:
|
||
String expr5 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_cpuUsage{id=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr6 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_memoryUsage{id=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Bottom", expr5, "%", MANAGEONE.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Bottom", expr6, "%", MANAGEONE.name()));
|
||
break;
|
||
case TIANYI:
|
||
String expr7 = "sort_desc(bottomk(10,round(sum by (instance_id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_cpu_usage{instance_id=~'" + vmText + "'} or tianyi_sys_ecs_cpu_util{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr8 = "sort_desc(bottomk(10,round(sum by (instance_id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_mem_usedPercent{instance_id=~'" + vmText + "'} or tianyi_sys_ecs_mem_util{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr81 = "sort_desc(bottomk(10,round(sum by (instance_id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(DISK_USED_PERCENT).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_disk_usedPercent{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(DISK_USED_PERCENT).getString(OPERATOR),
|
||
paramMap.get(DISK_USED_PERCENT).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Bottom", expr7, "%", TIANYI.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Bottom", expr8, "%", TIANYI.name()));
|
||
charts.add(vmLineChart(time, "云主机磁盘利用率Bottom", expr81, "%", TIANYI.name()));
|
||
break;
|
||
case CLOUDTOWER:
|
||
String expr12 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_cpu_overall_usage_percent{instanceId=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr13 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_memory_usage_percent{instanceId=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Bottom", expr12, "%", CLOUDTOWER.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Bottom", expr13, "%", CLOUDTOWER.name()));
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
} else if ("wholeMachineRecycle".equals(type)) {
|
||
String expr = "sort_desc(bottomk(10,round(sum by (vmname,esxhostname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(DISK_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_disk_usage_average{disk='instance-total',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(DISK_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(DISK_USAGE_AVERAGE).getString(Common.VALUE)) + "),1)))";
|
||
String expr2 = "sort_desc(bottomk(10,round(sum by (vmname,esxhostname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(NET_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_net_usage_average{interface='instance-total',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(NET_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(NET_USAGE_AVERAGE).getString(Common.VALUE)) + "),1)))";
|
||
charts.add(vmLineChart(time, "磁盘使用情况Bottom", expr, "KBps", VMWARE.name()));
|
||
charts.add(vmLineChart(time, "网络使用情况Bottom", expr2, "KBps", VMWARE.name()));
|
||
} else if ("cloudServerCapacityExpansion".equals(type)) {
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
String expr = "sort(topk(10,round(sum by (instanceId,instanceName) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"((avg(irate(libvirt_domain_info_cpu_time_seconds_total{instanceId=~'" + vmText + "'}[5m])) by (instanceId,instanceName))*100/avg(libvirt_domain_info_virtual_cpus)by (instanceId,instanceName))", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr2 = "sort(topk(10,round(sum by (instanceId,instanceName) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"((1-libvirt_domain_memory_stat_unused/libvirt_domain_memory_stat_available{instanceId=~'" + vmText + "'})*100)", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Top", expr, "%", OPENSTACK.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Top", expr2, "%", OPENSTACK.name()));
|
||
break;
|
||
case VMWARE:
|
||
String expr3 = "sort(topk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_cpu_usage_average{cpu='instance-total',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr4 = "sort(topk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_vm_mem_usage_average{uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr41 = "sort(topk(10,round(sum by (vmname,uuid) (" + MessageFormat.format(template,
|
||
paramMap.get(DISK_USED_PERCENT).getString(VALUE_TYPE),
|
||
"vsphere_partition_disk_usedPercent{path='',uuid=~'" + vmText + "'}", duration,
|
||
paramMap.get(DISK_USED_PERCENT).getString(OPERATOR),
|
||
paramMap.get(DISK_USED_PERCENT).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Top", expr3, "%", VMWARE.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Top", expr4, "%", VMWARE.name()));
|
||
charts.add(vmLineChart(time, "云主机磁盘利用率Top", expr41, "%", VMWARE.name()));
|
||
break;
|
||
case MANAGEONE:
|
||
String expr6 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_cpuUsage{id=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr7 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_memoryUsage{id=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Top", expr6, "%", MANAGEONE.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Top", expr7, "%", MANAGEONE.name()));
|
||
break;
|
||
case TIANYI:
|
||
String expr8 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_cpu_usage{instance_id=~'" + vmText + "'} or tianyi_sys_ecs_cpu_util{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr9 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_mem_usedPercent{instance_id=~'" + vmText + "'} or tianyi_sys_ecs_mem_util{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr91 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(DISK_USED_PERCENT).getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_disk_usedPercent{instance_id=~'" + vmText + "'},0.01)", duration,
|
||
paramMap.get(DISK_USED_PERCENT).getString(OPERATOR),
|
||
paramMap.get(DISK_USED_PERCENT).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Top", expr8, "%", TIANYI.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Top", expr9, "%", TIANYI.name()));
|
||
charts.add(vmLineChart(time, "云主机磁盘利用率Top", expr91, "%", TIANYI.name()));
|
||
break;
|
||
case CLOUDTOWER:
|
||
String expr13 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_cpu_overall_usage_percent{instanceId=~'" + vmText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr14 = "sort(topk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_memory_usage_percent{instanceId=~'" + vmText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "云主机CPU利用率Top", expr13, "%", CLOUDTOWER.name()));
|
||
charts.add(vmLineChart(time, "云主机内存利用率Top", expr14, "%", CLOUDTOWER.name()));
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
} else if ("serverCapacityExpansion".equals(type)) {
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
String expr = "sort(topk(10,round(sum by (host_id,hostname)(" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
" ((1 - avg(irate(node_cpu_seconds_total{mode='idle',host_id=~'" + hostText + "'}[5m])) by (host_id,hostname))*100)", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr2 = "sort(topk(10,round(sum by (host_id,hostname)(" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"(100 - ((node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)/node_memory_MemTotal_bytes{host_id=~'" + hostText + "'}) * 100)", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(hostLineChart(time, "宿主机CPU利用率Top", expr, OPENSTACK.name(), "%"));
|
||
charts.add(hostLineChart(time, "宿主机内存利用率Top", expr2, OPENSTACK.name(), "%"));
|
||
break;
|
||
case VMWARE:
|
||
String expr3 = "sort(topk(10,round(" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_host_cpu_usage_average{cpu='instance-total',esxhostname=~'" + hostText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + ",0.01)))";
|
||
String expr4 = "sort(topk(10,round(" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_host_mem_usage_average{esxhostname=~'" + hostText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + ",0.01)))";
|
||
String expr5 = "sort(topk(10,round(" + MessageFormat.format(template,
|
||
paramMap.get(CPU_READY_SUMMATION).getString(VALUE_TYPE),
|
||
"vsphere_host_cpu_ready_summation{cpu='instance-total',esxhostname=~'" + hostText + "'}", duration,
|
||
paramMap.get(CPU_READY_SUMMATION).getString(OPERATOR),
|
||
paramMap.get(CPU_READY_SUMMATION).getString(Common.VALUE)) + ",1)))";
|
||
charts.add(hostLineChart(time, "宿主机CPU利用率Top", expr3, VMWARE.name(), "%"));
|
||
charts.add(hostLineChart(time, "宿主机内存利用率Top", expr4, VMWARE.name(), "%"));
|
||
charts.add(hostLineChart(time, "宿主机CPU就绪时间Top", expr5, VMWARE.name(), "毫秒"));
|
||
break;
|
||
case MANAGEONE:
|
||
String expr6 = "sort(topk(10,round(sum by (id,name)(" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_host_cpuUsage{id=~'" + hostText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr7 = "sort(topk(10,round(sum by (id,name)(" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_host_memoryUsage{id=~'" + hostText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(hostLineChart(time, "宿主机CPU利用率Top", expr6, MANAGEONE.name(), "%"));
|
||
charts.add(hostLineChart(time, "宿主机内存利用率Top", expr7, MANAGEONE.name(), "%"));
|
||
break;
|
||
case CLOUDTOWER:
|
||
String expr11 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_host_host_cpu_overall_usage_percent{name=~'" + hostText + "'}", duration,
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(CPU_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
String expr12 = "sort_desc(bottomk(10,round(sum by (id,name) (" + MessageFormat.format(template,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_host_host_memory_usage_percent{name=~'" + hostText + "'}", duration,
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(OPERATOR),
|
||
paramMap.get(MEM_USAGE_AVERAGE).getString(Common.VALUE)) + "),0.01)))";
|
||
charts.add(vmLineChart(time, "宿主机CPU利用率Bottom", expr11, "%", CLOUDTOWER.name()));
|
||
charts.add(vmLineChart(time, "宿云主机内存利用率Bottom", expr12, "%", CLOUDTOWER.name()));
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
}
|
||
return charts;
|
||
}
|
||
|
||
private List<JSONObject> vmAnalysisList(Map<String, JSONObject> paramMap, Date start, Date end, Set<String> tags, String vendorType, String token) {
|
||
if (tags == null || tags.isEmpty()) {
|
||
return new ArrayList<>();
|
||
}
|
||
String time = String.valueOf(end.getTime() / 1000L);
|
||
|
||
List<String> tagList = new ArrayList<>(tags);
|
||
List<JSONObject> list = new ArrayList<>();
|
||
int count = 0;
|
||
//每次请求cmp和prometheus的数据条数,为了防止参数过长导致错误
|
||
int size = 30;
|
||
boolean flag = true;
|
||
while (flag) {
|
||
List<String> subTags;
|
||
if (tagList.size() > size * (count + 1)) {
|
||
subTags = tagList.subList(size * count, size * (count + 1));
|
||
count++;
|
||
} else if (tagList.size() % size > 0) {
|
||
subTags = tagList.subList(size * (count), tagList.size());
|
||
flag = false;
|
||
} else {
|
||
break;
|
||
}
|
||
List<Param> vmParams = Lists.newArrayList();
|
||
String key = vendorType.equals(VMWARE.name()) ? "biosUuid" : "instanceId";
|
||
vmParams.add(new Param(MapTools.simpleMap(key, JSONObject.toJSONString(subTags).substring(1, JSONObject.toJSONString(subTags).length() - 1)), Sign.IN));
|
||
long t = System.currentTimeMillis();
|
||
BocloudResult cloudServerResult = imsCloudServerService.list(new Pager(1, Integer.MAX_VALUE, vmParams, null), token);
|
||
logger.info("analysis cost ims vm list:" + (System.currentTimeMillis() - t));
|
||
Assert.isTrue(cloudServerResult.isSuccess(), cloudServerResult.getMessage());
|
||
List<CloudServer> cloudServerList = ((JSONObject) cloudServerResult.getData()).getJSONArray(Common.ROWS).toJavaList(CloudServer.class);
|
||
if(ListTool.isEmpty(cloudServerList)){
|
||
continue;
|
||
}
|
||
List<JSONObject> tempList = new ArrayList<>();
|
||
for (CloudServer cloudServer : cloudServerList) {
|
||
JSONObject jsonObject = new JSONObject();
|
||
jsonObject.put("id", cloudServer.getId());
|
||
jsonObject.put("biosUuid", cloudServer.getBiosUuid());
|
||
jsonObject.put("hostname", cloudServer.getHostName());
|
||
jsonObject.put("name", cloudServer.getName());
|
||
jsonObject.put("status", cloudServer.getStatus());
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
case VMWARE:
|
||
case MANAGEONE:
|
||
jsonObject.put("ip", cloudServer.getManagerIp());
|
||
break;
|
||
case TIANYI:
|
||
String ip = cloudServer.getPrivateIps() != null ? StringUtils.join(JSONArray.parseArray(cloudServer.getPrivateIps(), String.class).toArray(), ",") : "";
|
||
jsonObject.put("ip", ip);
|
||
break;
|
||
case CLOUDTOWER:
|
||
jsonObject.put("ip", cloudServer.getManagerIp());
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
jsonObject.put("instanceId", cloudServer.getInstanceId());
|
||
tempList.add(jsonObject);
|
||
}
|
||
String duration = (end.getTime() - start.getTime()) / 1000L + "s:";
|
||
String template = "{0}_over_time({1}[{2}])";
|
||
String tag = StringUtils.join(subTags, "|");
|
||
t = System.currentTimeMillis();
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"((avg(irate(libvirt_domain_info_cpu_time_seconds_total{instanceId=~'" + tag + "'}[5m])) by (instanceId))*100/avg(libvirt_domain_info_virtual_cpus)by (instanceId))", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertCloudServer(cpuUsageAverageResult, tempList, OPENSTACK.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"((1-libvirt_domain_memory_stat_unused/libvirt_domain_memory_stat_available{instanceId=~'" + tag + "'})*100)", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertCloudServer(memUsageAverageResult, tempList, OPENSTACK.name(), "memUsage");
|
||
});
|
||
break;
|
||
case VMWARE:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_vm_cpu_usage_average{uuid=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertCloudServer(cpuUsageAverageResult, tempList, VMWARE.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_vm_mem_usage_average{uuid=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertCloudServer(memUsageAverageResult, tempList, VMWARE.name(), "memUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(DISK_USED_PERCENT)).ifPresent(jsonObject -> {
|
||
String diskUsedPercentFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_partition_disk_usedPercent{path='',uuid=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> diskUsedPercentResult = prometheusService.query(diskUsedPercentFilter, time);
|
||
convertCloudServer(diskUsedPercentResult, tempList, VMWARE.name(), "diskUsedPercent");
|
||
});
|
||
Optional.ofNullable(paramMap.get(CPU_READY_SUMMATION)).ifPresent(jsonObject -> {
|
||
String cpuReadySummationFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_vm_cpu_ready_summation{cpu='instance-total',uuid=~'" + tag + "'}", duration) + ",1)";
|
||
List<PrometheusResult> cpuReadySummationResult = prometheusService.query(cpuReadySummationFilter, time);
|
||
convertCloudServer(cpuReadySummationResult, tempList, VMWARE.name(), "cpuReady");
|
||
});
|
||
Optional.ofNullable(paramMap.get(DISK_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String diskUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_vm_disk_usage_average{disk='instance-total',uuid=~'" + tag + "'}", duration) + ",1)";
|
||
List<PrometheusResult> diskUsageAverageResult = prometheusService.query(diskUsageAverageFilter, time);
|
||
convertCloudServer(diskUsageAverageResult, tempList, VMWARE.name(), "diskUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(NET_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String netUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"vsphere_vm_net_usage_average{interface='instance-total',uuid=~'" + tag + "'}", duration) + ",1)";
|
||
List<PrometheusResult> netUsageAverageResult = prometheusService.query(netUsageAverageFilter, time);
|
||
convertCloudServer(netUsageAverageResult, tempList, VMWARE.name(), "netUsage");
|
||
});
|
||
break;
|
||
case MANAGEONE:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_cpuUsage{id=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertCloudServer(cpuUsageAverageResult, tempList, MANAGEONE.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_vm_memoryUsage{id=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertCloudServer(memUsageAverageResult, tempList, MANAGEONE.name(), "memUsage");
|
||
});
|
||
break;
|
||
case TIANYI:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_cpu_usage{instance_id=~'" + tag + "'} or tianyi_sys_ecs_cpu_util{instance_id=~'" + tag + "'},0.01)", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertCloudServer(cpuUsageAverageResult, tempList, TIANYI.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_mem_usedPercent{instance_id=~'" + tag + "'} or tianyi_sys_ecs_mem_util{instance_id=~'" + tag + "'},0.01)", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertCloudServer(memUsageAverageResult, tempList, TIANYI.name(), "memUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(DISK_USED_PERCENT)).ifPresent(jsonObject -> {
|
||
String diskUsedPercentFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"round(tianyi_agt_ecs_disk_usedPercent{instance_id=~'" + tag + "'},0.01)", duration) + ",0.01)";
|
||
List<PrometheusResult> diskUsedPercentResult = prometheusService.query(diskUsedPercentFilter, time);
|
||
convertCloudServer(diskUsedPercentResult, tempList, TIANYI.name(), "diskUsedPercent");
|
||
});
|
||
break;
|
||
case CLOUDTOWER:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_cpu_overall_usage_percent{instanceId=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertCloudServer(cpuUsageAverageResult, tempList, CLOUDTOWER.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, jsonObject.getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_vm_elf_vm_memory_usage_percent{instanceId=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertCloudServer(memUsageAverageResult, tempList, CLOUDTOWER.name(), "memUsage");
|
||
});
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
logger.info("analysis cost prom:" + (System.currentTimeMillis() - t));
|
||
list.addAll(tempList);
|
||
}
|
||
return list;
|
||
}
|
||
|
||
private List<JSONObject> hostAnalysisList(Map<String, JSONObject> paramMap, Date start, Date end, List<String> tags, String vendorType, Long vendorId) {
|
||
if (ListTool.isEmpty(tags)) {
|
||
return new ArrayList<>();
|
||
}
|
||
String time = String.valueOf(end.getTime() / 1000L);
|
||
List<Param> hostParams = Lists.newArrayList();
|
||
String key = vendorType.equals(OPENSTACK.name()) ? "id" : vendorType.equals(VMWARE.name()) ? "name" : "hostname";
|
||
hostParams.add(new Param(MapTools.simpleMap(key, JSONObject.toJSONString(tags).substring(1, JSONObject.toJSONString(tags).length() - 1)), Sign.IN));
|
||
BocloudResult serverResult = new BocloudResult();
|
||
List<Server> serverList = new ArrayList<>();
|
||
if (CLOUDTOWER.name().equals(vendorType)) {
|
||
JSONArray serverArray = JSONArray.parseArray(JSONObject.toJSONString(imsRpcService.getServerByName(tags, vendorId)));
|
||
for (Object o : serverArray) {
|
||
Server server = JSONObject.parseObject(o.toString(), Server.class);
|
||
serverList.add(server);
|
||
}
|
||
} else {
|
||
serverResult = this.imsServerService.list(new Pager(1, Integer.MAX_VALUE, hostParams, null));
|
||
serverList = ((JSONObject) serverResult.getData()).getJSONArray(Common.ROWS).toJavaList(Server.class);
|
||
}
|
||
List<JSONObject> list = new ArrayList<>(serverList.size());
|
||
for (Server server : serverList) {
|
||
JSONObject jsonObject = new JSONObject();
|
||
jsonObject.put("id", server.getId());
|
||
jsonObject.put("name", server.getName());
|
||
jsonObject.put("status", server.getStatus());
|
||
jsonObject.put("ip", server.getManageIp());
|
||
jsonObject.put("hostname", server.getHostname());
|
||
list.add(jsonObject);
|
||
}
|
||
String duration = (end.getTime() - start.getTime()) / 1000L + "s:";
|
||
String template = "{0}_over_time({1}[{2}])";
|
||
String tag = StringUtils.join(tags, "|");
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"((1 - avg(irate(node_cpu_seconds_total{mode='idle',host_id=~'" + tag + "'}[5m])) by (host_id))*100)", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertServer(cpuUsageAverageResult, list, OPENSTACK.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"(100 - ((node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes)/node_memory_MemTotal_bytes{host_id=~'" + tag + "'}) * 100)", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertServer(memUsageAverageResult, list, OPENSTACK.name(), "memUsage");
|
||
});
|
||
break;
|
||
case VMWARE:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_host_cpu_usage_average{cpu='instance-total',esxhostname=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertServer(cpuUsageAverageResult, list, VMWARE.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"vsphere_host_mem_usage_average{esxhostname=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertServer(memUsageAverageResult, list, VMWARE.name(), "memUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(CPU_READY_SUMMATION)).ifPresent(jsonObject -> {
|
||
String cpuReadySummationFilter = "round(" + MessageFormat.format(template, paramMap.get(CPU_READY_SUMMATION).getString(VALUE_TYPE),
|
||
"vsphere_host_cpu_ready_summation{cpu='instance-total',esxhostname=~'" + tag + "'}", duration) + ",1)";
|
||
List<PrometheusResult> cpuReadySummationResult = prometheusService.query(cpuReadySummationFilter, time);
|
||
convertServer(cpuReadySummationResult, list, VMWARE.name(), "cpuReady");
|
||
});
|
||
break;
|
||
case MANAGEONE:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_host_cpuUsage{id=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertServer(cpuUsageAverageResult, list, MANAGEONE.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_fusioncloud_host_memoryUsage{id=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertServer(memUsageAverageResult, list, MANAGEONE.name(), "memUsage");
|
||
});
|
||
break;
|
||
case CLOUDTOWER:
|
||
Optional.ofNullable(paramMap.get(CPU_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String cpuUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(CPU_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_host_host_cpu_overall_usage_percent{name=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> cpuUsageAverageResult = prometheusService.query(cpuUsageAverageFilter, time);
|
||
convertServer(cpuUsageAverageResult, list, CLOUDTOWER.name(), "cpuUsage");
|
||
});
|
||
Optional.ofNullable(paramMap.get(MEM_USAGE_AVERAGE)).ifPresent(jsonObject -> {
|
||
String memUsageAverageFilter = "round(" + MessageFormat.format(template, paramMap.get(MEM_USAGE_AVERAGE).getString(VALUE_TYPE),
|
||
"bocloud_cloudtower_host_host_memory_usage_percent{name=~'" + tag + "'}", duration) + ",0.01)";
|
||
List<PrometheusResult> memUsageAverageResult = prometheusService.query(memUsageAverageFilter, time);
|
||
convertServer(memUsageAverageResult, list, CLOUDTOWER.name(), "memUsage");
|
||
});
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
return list;
|
||
}
|
||
|
||
/**
|
||
* 查询符合条件的云主机uuid集合
|
||
*
|
||
* @param start
|
||
* @param end
|
||
* @param flag
|
||
* @param params
|
||
* @return
|
||
*/
|
||
private Set<String> queryVmTagsFromPrometheus(Date start, Date end, String flag, String vendorType, JSONArray params) {
|
||
String expr;
|
||
List<PrometheusResult> prometheusResultList;
|
||
Set<String> tags = new HashSet<>();
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
expr = getPerformanceExpr(params, start, end, flag, OPENSTACK, "vm");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("instanceId")));
|
||
}
|
||
break;
|
||
case VMWARE:
|
||
expr = getPerformanceExpr(params, start, end, flag, VMWARE, "vm");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("uuid")));
|
||
}
|
||
break;
|
||
case MANAGEONE:
|
||
expr = getPerformanceExpr(params, start, end, flag, MANAGEONE, "vm");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("id")));
|
||
}
|
||
break;
|
||
case TIANYI:
|
||
expr = getPerformanceExpr(params, start, end, flag, TIANYI, "vm");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("instance_id")));
|
||
}
|
||
break;
|
||
case CLOUDTOWER:
|
||
expr = getPerformanceExpr(params, start, end, flag, CLOUDTOWER, "vm");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("instanceId")));
|
||
}
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
return tags;
|
||
}
|
||
|
||
/**
|
||
* 查询符合条件的宿主机name集合
|
||
*
|
||
* @param start
|
||
* @param end
|
||
* @param flag
|
||
* @param params
|
||
* @return
|
||
*/
|
||
private List<String> queryHostTagsFromPrometheus(Date start, Date end, String flag, String vendorType, JSONArray params) {
|
||
String expr;
|
||
List<PrometheusResult> prometheusResultList;
|
||
List<String> tags = new ArrayList<>();
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
expr = getPerformanceExpr(params, start, end, flag, OPENSTACK, "host");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("host_id")));
|
||
}
|
||
break;
|
||
case VMWARE:
|
||
expr = getPerformanceExpr(params, start, end, flag, VMWARE, "host");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("esxhostname")));
|
||
}
|
||
break;
|
||
case MANAGEONE:
|
||
expr = getPerformanceExpr(params, start, end, flag, MANAGEONE, "host");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("id")));
|
||
}
|
||
break;
|
||
case CLOUDTOWER:
|
||
expr = getPerformanceExpr(params, start, end, flag, CLOUDTOWER, "host");
|
||
prometheusResultList = prometheusService.query(expr, String.valueOf(end.getTime() / 1000L));
|
||
for (PrometheusResult prometheusResult : prometheusResultList) {
|
||
tags.add(String.valueOf(prometheusResult.getMetric().get("name")));
|
||
}
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
return tags;
|
||
}
|
||
|
||
/**
|
||
* 根据前端传来的查询条件获取查询表达式
|
||
*
|
||
* @param params
|
||
* @param vendorTags vcenterAddress,cloud
|
||
* @param type vm,host
|
||
* @return
|
||
*/
|
||
private String getPerformanceExpr(JSONArray params, Date start, Date end, String vendorTags, CloudProvider vendorType, String type) {
|
||
String template = "{0}_over_time({1}[{2}]) {3} {4}";
|
||
String duration = (end.getTime() - start.getTime()) / 1000L + "s";
|
||
StringBuilder result = new StringBuilder();
|
||
for (int i = 0; i < params.size(); i++) {
|
||
JSONObject param = params.getJSONObject(i);
|
||
String expr = "";
|
||
switch (vendorType) {
|
||
case OPENSTACK:
|
||
if ("vm".equals(type) && vmOpenStackMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = vmOpenStackMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendor_id", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
vmOpenStackMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (instanceId)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (instanceId)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
} else if ("host".equals(type) && hostOpenStackMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = hostOpenStackMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendor_id", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
hostOpenStackMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (host_id)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (host_id)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
}
|
||
break;
|
||
case VMWARE:
|
||
if ("vm".equals(type) && vmVcenterMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = vmVcenterMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vcenter", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
vmVcenterMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (uuid)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (uuid)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
} else if ("host".equals(type) && hostVcenterMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = hostVcenterMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vcenter", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
hostVcenterMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (esxhostname)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (esxhostname)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
}
|
||
break;
|
||
case MANAGEONE:
|
||
if ("vm".equals(type) && vmManageOneMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = vmManageOneMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendorId", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
vmManageOneMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (id)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (id)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
} else if ("host".equals(type) && hostManageOneMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = hostManageOneMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendorId", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
hostManageOneMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (id)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (id)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
}
|
||
break;
|
||
case TIANYI:
|
||
if ("vm".equals(type) && vmTianyiMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = vmTianyiMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendor_id", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
vmTianyiMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (instance_id)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (instance_id)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
}
|
||
break;
|
||
case CLOUDTOWER:
|
||
if ("vm".equals(type) && vmCloudTowerMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = vmCloudTowerMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendorId", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
vmCloudTowerMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
// 因为cloudTower云平台没有disk平均使用率的监控信息 所以需要特殊处理
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (instanceId)(").append(expr).append(")");
|
||
break;
|
||
} else {
|
||
result.append(" sum by (instanceId)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
} else if ("host".equals(type) && hostCLoudTowerMetricMap.containsKey(param.getString(METRIC))) {
|
||
String metric = hostCLoudTowerMetricMap.get(param.getString(METRIC));
|
||
Map<String, String> map = new HashMap<>(2);
|
||
map.put("vendorId", vendorTags);
|
||
if (StringUtils.isBlank(expr)) {
|
||
expr = MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
PrometheusUtils.putParams(metric, map), duration, param.getString(OPERATOR),
|
||
param.getString(Common.VALUE));
|
||
} else {
|
||
expr = expr + MessageFormat.format(template, param.getString(VALUE_TYPE),
|
||
hostCLoudTowerMetricMap.get(param.getString(METRIC)), duration,
|
||
param.getString(OPERATOR), param.getString(Common.VALUE));
|
||
}
|
||
if (i == params.size() - 1) {
|
||
result.append(" sum by (name)(").append(expr).append(")");
|
||
} else {
|
||
result.append(" sum by (name)(").append(expr).append(") ").append(param.getString("relation"));
|
||
}
|
||
} else {
|
||
result = new StringBuilder(result.substring(0, result.length() - 3));
|
||
}
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorTags);
|
||
}
|
||
}
|
||
return result.toString();
|
||
}
|
||
|
||
/**
|
||
* 转换规则为以metric为key的map,如果没有则提供默认值
|
||
*
|
||
* @param params
|
||
* @return
|
||
*/
|
||
private Map<String, JSONObject> convertParamMap(JSONArray params) {
|
||
Map<String, JSONObject> paramMap = new HashMap<>(16, 0.75F);
|
||
for (int i = 0; i < params.size(); i++) {
|
||
JSONObject param = params.getJSONObject(i);
|
||
paramMap.put(param.getString(METRIC), param);
|
||
}
|
||
String[] array = new String[]{CPU_USAGE_AVERAGE, MEM_USAGE_AVERAGE, DISK_USED_PERCENT, CPU_READY_SUMMATION, DISK_USAGE_AVERAGE, NET_USAGE_AVERAGE};
|
||
Arrays.stream(array).forEach(metric -> {
|
||
if (!Optional.ofNullable(paramMap.get(metric)).isPresent()) {
|
||
JSONObject param = new JSONObject();
|
||
param.put(METRIC, metric);
|
||
param.put(VALUE_TYPE, "avg");
|
||
param.put(OPERATOR, "");
|
||
param.put(Common.VALUE, "");
|
||
paramMap.put(metric, param);
|
||
}
|
||
});
|
||
return paramMap;
|
||
}
|
||
|
||
private void convertCloudServer(List<PrometheusResult> results, List<JSONObject> list, String vendorType, String key) {
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
case CLOUDTOWER:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("instanceId"))
|
||
.equals(String.valueOf(result.getMetric().get("instanceId")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case VMWARE:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("biosUuid")).equals(String.valueOf(result.getMetric().get("uuid")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case MANAGEONE:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("instanceId"))
|
||
.equals(String.valueOf(result.getMetric().get("id")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case TIANYI:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("instanceId"))
|
||
.equals(String.valueOf(result.getMetric().get("instance_id")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
|
||
}
|
||
|
||
private void convertServer(List<PrometheusResult> results, List<JSONObject> list, String vendorType, String key) {
|
||
switch (CloudProvider.valueOf(vendorType)) {
|
||
case OPENSTACK:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("id"))
|
||
.equals(String.valueOf(result.getMetric().get("host_id")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case VMWARE:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("name"))
|
||
.equals(String.valueOf(result.getMetric().get("esxhostname")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case MANAGEONE:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("hostname"))
|
||
.equals(String.valueOf(result.getMetric().get("id")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case CLOUDTOWER:
|
||
for (PrometheusResult result : results) {
|
||
for (JSONObject jsonObject : list) {
|
||
if (String.valueOf(jsonObject.get("name"))
|
||
.equals(String.valueOf(result.getMetric().get("name")))) {
|
||
jsonObject.put(key, result.getValue()[1]);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
throw new IllegalStateException("Unexpected value: " + vendorType);
|
||
}
|
||
|
||
}
|
||
|
||
private JSONObject vmLineChart(String time, String name, String expr, String unit, String vendorType) {
|
||
List<PrometheusResult> prometheusResultList = prometheusService.query(expr, time);
|
||
List<String> keys = new ArrayList<>(prometheusResultList.size());
|
||
List<Object> data = new ArrayList<>(prometheusResultList.size());
|
||
String key = vendorType.equals(OPENSTACK.name()) ? "instanceName" : vendorType.equals(VMWARE.name()) ? "vmname" : "name";
|
||
for (PrometheusResult result : prometheusResultList) {
|
||
keys.add(String.valueOf(result.getMetric().get(key)));
|
||
data.add(result.getValue()[1]);
|
||
}
|
||
JSONObject jsonObject = new JSONObject();
|
||
jsonObject.put("name", name);
|
||
jsonObject.put("keys", keys);
|
||
jsonObject.put("values", data);
|
||
jsonObject.put("unit", unit);
|
||
return jsonObject;
|
||
}
|
||
|
||
private JSONObject hostLineChart(String time, String name, String expr, String vendorType, String unit) {
|
||
List<PrometheusResult> list = prometheusService.query(expr, time);
|
||
List<String> keys = new ArrayList<>(list.size());
|
||
List<Object> data = new ArrayList<>(list.size());
|
||
String key = vendorType.equals(OPENSTACK.name()) ? "hostname" : vendorType.equals(VMWARE.name()) ? "esxhostname" : "name";
|
||
for (PrometheusResult result : list) {
|
||
keys.add(String.valueOf(result.getMetric().get(key)));
|
||
data.add(result.getValue()[1]);
|
||
}
|
||
JSONObject jsonObject = new JSONObject();
|
||
jsonObject.put("name", name);
|
||
jsonObject.put("keys", keys);
|
||
jsonObject.put("values", data);
|
||
jsonObject.put("unit", unit);
|
||
return jsonObject;
|
||
}
|
||
|
||
public ImsCloudVendorService getImsCloudVendorService() {
|
||
return imsCloudVendorService;
|
||
}
|
||
|
||
public AnalysisSnapshotRepository getAnalysisSnapshotRepository() {
|
||
return analysisSnapshotRepository;
|
||
}
|
||
|
||
public AnalysisRuleRepository getAnalysisRuleRepository() {
|
||
return analysisRuleRepository;
|
||
}
|
||
}
|