bocloud.cms/bocloud.cms.service/src/main/java/com/bocloud/cms/service/AnalysisServiceImpl.java

1224 lines
80 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}