mirror of https://github.com/apache/cloudstack.git
Externalize VMWare stats time window config (#5357)
Co-authored-by: SadiJr <17a0db2854@firemailbox.club>
This commit is contained in:
parent
159c72fa97
commit
8e0e5acea7
|
|
@ -46,6 +46,10 @@ public interface VmwareManager {
|
|||
static final ConfigKey<Integer> s_vmwareOVAPackageTimeout = new ConfigKey<Integer>(Integer.class, "vmware.package.ova.timeout", "Advanced", "3600",
|
||||
"Vmware script timeout for ova packaging process", true, ConfigKey.Scope.Global, 1000);
|
||||
|
||||
public static final ConfigKey<Integer> VMWARE_STATS_TIME_WINDOW = new ConfigKey<Integer>("Advanced", Integer.class, "vmware.stats.time.window", "300",
|
||||
"VMware interval window (in seconds) to collect metrics. If this is set to less than 20, then default (300 seconds) will be used. The interval used must be enabled in vCenter for this change to work, "
|
||||
+ "otherwise the collection of metrics will result in an error. Check VMWare docs to know how to enable metrics interval.", true);
|
||||
|
||||
String composeWorkerName();
|
||||
|
||||
String getSystemVMIsoFileNameOnDatastore();
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
|
|||
|
||||
@Override
|
||||
public ConfigKey<?>[] getConfigKeys() {
|
||||
return new ConfigKey<?>[] {s_vmwareNicHotplugWaitTimeout, s_vmwareCleanOldWorderVMs, templateCleanupInterval, s_vmwareSearchExcludeFolder, s_vmwareOVAPackageTimeout};
|
||||
return new ConfigKey<?>[] {s_vmwareNicHotplugWaitTimeout, s_vmwareCleanOldWorderVMs, templateCleanupInterval, s_vmwareSearchExcludeFolder, s_vmwareOVAPackageTimeout, VMWARE_STATS_TIME_WINDOW};
|
||||
}
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
|
|
|
|||
|
|
@ -3959,8 +3959,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
final ManagedObjectReference perfMgr = getServiceContext().getServiceContent().getPerfManager();
|
||||
VimPortType service = getServiceContext().getService();
|
||||
|
||||
final int intervalSeconds = 300;
|
||||
final XMLGregorianCalendar startTime = VmwareHelper.getXMLGregorianCalendar(new Date(), intervalSeconds);
|
||||
Integer windowInterval = getVmwareWindowTimeInterval();
|
||||
final XMLGregorianCalendar startTime = VmwareHelper.getXMLGregorianCalendar(new Date(), windowInterval);
|
||||
final XMLGregorianCalendar endTime = VmwareHelper.getXMLGregorianCalendar(new Date(), 0);
|
||||
|
||||
PerfCounterInfo diskReadIOPerfCounterInfo = null;
|
||||
|
|
@ -4016,45 +4016,50 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
}
|
||||
|
||||
if (perfMetricsIds.size() > 0) {
|
||||
final PerfQuerySpec qSpec = new PerfQuerySpec();
|
||||
qSpec.setEntity(vmMo.getMor());
|
||||
qSpec.setFormat("normal");
|
||||
qSpec.setIntervalId(intervalSeconds);
|
||||
qSpec.setStartTime(startTime);
|
||||
qSpec.setEndTime(endTime);
|
||||
qSpec.getMetricId().addAll(perfMetricsIds);
|
||||
try {
|
||||
final PerfQuerySpec qSpec = new PerfQuerySpec();
|
||||
qSpec.setEntity(vmMo.getMor());
|
||||
qSpec.setFormat("normal");
|
||||
qSpec.setIntervalId(windowInterval);
|
||||
qSpec.setStartTime(startTime);
|
||||
qSpec.setEndTime(endTime);
|
||||
qSpec.getMetricId().addAll(perfMetricsIds);
|
||||
|
||||
for (final PerfEntityMetricBase perfValue : service.queryPerf(perfMgr, Collections.singletonList(qSpec))) {
|
||||
if (!(perfValue instanceof PerfEntityMetric)) {
|
||||
continue;
|
||||
}
|
||||
final List<PerfMetricSeries> values = ((PerfEntityMetric) perfValue).getValue();
|
||||
if (values == null || values.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
for (final PerfMetricSeries value : values) {
|
||||
if (!(value instanceof PerfMetricIntSeries) || !value.getId().getInstance().equals(diskBusName)) {
|
||||
for (final PerfEntityMetricBase perfValue: service.queryPerf(perfMgr, Collections.singletonList(qSpec))) {
|
||||
if (!(perfValue instanceof PerfEntityMetric)) {
|
||||
continue;
|
||||
}
|
||||
final List<Long> perfStats = ((PerfMetricIntSeries) value).getValue();
|
||||
if (perfStats.size() > 0) {
|
||||
long sum = 0;
|
||||
for (long val : perfStats) {
|
||||
sum += val;
|
||||
final List<PerfMetricSeries> values = ((PerfEntityMetric) perfValue).getValue();
|
||||
if (values == null || values.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
for (final PerfMetricSeries value : values) {
|
||||
if (!(value instanceof PerfMetricIntSeries) || !value.getId().getInstance().equals(diskBusName)) {
|
||||
continue;
|
||||
}
|
||||
long avg = sum / perfStats.size();
|
||||
if (value.getId().getCounterId() == diskReadIOPerfCounterInfo.getKey()) {
|
||||
readReq = avg;
|
||||
} else if (value.getId().getCounterId() == diskWriteIOPerfCounterInfo.getKey()) {
|
||||
writeReq = avg;
|
||||
} else if (value.getId().getCounterId() == diskReadKbsPerfCounterInfo.getKey()) {
|
||||
readBytes = avg * 1024;
|
||||
} else if (value.getId().getCounterId() == diskWriteKbsPerfCounterInfo.getKey()) {
|
||||
writeBytes = avg * 1024;
|
||||
final List<Long> perfStats = ((PerfMetricIntSeries) value).getValue();
|
||||
if (perfStats.size() > 0) {
|
||||
long sum = 0;
|
||||
for (long val : perfStats) {
|
||||
sum += val;
|
||||
}
|
||||
long avg = sum / perfStats.size();
|
||||
if (value.getId().getCounterId() == diskReadIOPerfCounterInfo.getKey()) {
|
||||
readReq = avg;
|
||||
} else if (value.getId().getCounterId() == diskWriteIOPerfCounterInfo.getKey()) {
|
||||
writeReq = avg;
|
||||
} else if (value.getId().getCounterId() == diskReadKbsPerfCounterInfo.getKey()) {
|
||||
readBytes = avg * 1024;
|
||||
} else if (value.getId().getCounterId() == diskWriteKbsPerfCounterInfo.getKey()) {
|
||||
writeBytes = avg * 1024;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.error(String.format("Unable to execute PerfQuerySpec due to: [%s]. The window interval is enabled in vCenter?", VmwareHelper.getExceptionMessage(e)), e);
|
||||
}
|
||||
|
||||
}
|
||||
diskStats.add(new VmDiskStatsEntry(vmName, VmwareHelper.getDiskDeviceFileName(disk), writeReq, readReq, writeBytes, readBytes));
|
||||
}
|
||||
|
|
@ -6400,8 +6405,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
PerfCounterInfo diskReadKbsPerfCounterInfo = null;
|
||||
PerfCounterInfo diskWriteKbsPerfCounterInfo = null;
|
||||
|
||||
final int intervalSeconds = 300;
|
||||
final XMLGregorianCalendar startTime = VmwareHelper.getXMLGregorianCalendar(new Date(), intervalSeconds);
|
||||
Integer windowInterval = getVmwareWindowTimeInterval();
|
||||
final XMLGregorianCalendar startTime = VmwareHelper.getXMLGregorianCalendar(new Date(), windowInterval);
|
||||
final XMLGregorianCalendar endTime = VmwareHelper.getXMLGregorianCalendar(new Date(), 0);
|
||||
|
||||
List<PerfCounterInfo> cInfo = getServiceContext().getVimClient().getDynamicProperty(perfMgr, "perfCounter");
|
||||
|
|
@ -6523,48 +6528,52 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
}
|
||||
|
||||
if (perfMetricsIds.size() > 0) {
|
||||
final PerfQuerySpec qSpec = new PerfQuerySpec();
|
||||
qSpec.setEntity(vmMor);
|
||||
qSpec.setFormat("normal");
|
||||
qSpec.setIntervalId(intervalSeconds);
|
||||
qSpec.setStartTime(startTime);
|
||||
qSpec.setEndTime(endTime);
|
||||
qSpec.getMetricId().addAll(perfMetricsIds);
|
||||
final List<PerfEntityMetricBase> perfValues = service.queryPerf(perfMgr, Collections.singletonList(qSpec));
|
||||
for (final PerfEntityMetricBase perfValue : perfValues) {
|
||||
if (!(perfValue instanceof PerfEntityMetric)) {
|
||||
continue;
|
||||
}
|
||||
final List<PerfMetricSeries> seriesList = ((PerfEntityMetric) perfValue).getValue();
|
||||
for (final PerfMetricSeries series : seriesList) {
|
||||
if (!(series instanceof PerfMetricIntSeries)) {
|
||||
try {
|
||||
final PerfQuerySpec qSpec = new PerfQuerySpec();
|
||||
qSpec.setEntity(vmMor);
|
||||
qSpec.setFormat("normal");
|
||||
qSpec.setIntervalId(windowInterval);
|
||||
qSpec.setStartTime(startTime);
|
||||
qSpec.setEndTime(endTime);
|
||||
qSpec.getMetricId().addAll(perfMetricsIds);
|
||||
final List<PerfEntityMetricBase> perfValues = service.queryPerf(perfMgr, Collections.singletonList(qSpec));
|
||||
for (final PerfEntityMetricBase perfValue : perfValues) {
|
||||
if (!(perfValue instanceof PerfEntityMetric)) {
|
||||
continue;
|
||||
}
|
||||
final List<Long> values = ((PerfMetricIntSeries) series).getValue();
|
||||
double sum = 0;
|
||||
for (final Long value : values) {
|
||||
sum += value;
|
||||
}
|
||||
double avg = sum / values.size();
|
||||
if (series.getId().getCounterId() == rxPerfCounterInfo.getKey()) {
|
||||
networkReadKBs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == txPerfCounterInfo.getKey()) {
|
||||
networkWriteKBs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskReadIOPerfCounterInfo.getKey()) {
|
||||
diskReadIops += avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskWriteIOPerfCounterInfo.getKey()) {
|
||||
diskWriteIops += avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskReadKbsPerfCounterInfo.getKey()) {
|
||||
diskReadKbs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskWriteKbsPerfCounterInfo.getKey()) {
|
||||
diskWriteKbs = avg;
|
||||
final List<PerfMetricSeries> seriesList = ((PerfEntityMetric) perfValue).getValue();
|
||||
for (final PerfMetricSeries series : seriesList) {
|
||||
if (!(series instanceof PerfMetricIntSeries)) {
|
||||
continue;
|
||||
}
|
||||
final List<Long> values = ((PerfMetricIntSeries) series).getValue();
|
||||
double sum = 0;
|
||||
for (final Long value : values) {
|
||||
sum += value;
|
||||
}
|
||||
double avg = sum / values.size();
|
||||
if (series.getId().getCounterId() == rxPerfCounterInfo.getKey()) {
|
||||
networkReadKBs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == txPerfCounterInfo.getKey()) {
|
||||
networkWriteKBs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskReadIOPerfCounterInfo.getKey()) {
|
||||
diskReadIops += avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskWriteIOPerfCounterInfo.getKey()) {
|
||||
diskWriteIops += avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskReadKbsPerfCounterInfo.getKey()) {
|
||||
diskReadKbs = avg;
|
||||
}
|
||||
if (series.getId().getCounterId() == diskWriteKbsPerfCounterInfo.getKey()) {
|
||||
diskWriteKbs = avg;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
s_logger.error(String.format("Unable to execute PerfQuerySpec due to: [%s]. The window interval is enabled in vCenter?", VmwareHelper.getExceptionMessage(e)), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -7689,4 +7698,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
|
|||
return new GetVmVncTicketAnswer(null, false, e.getLocalizedMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Integer getVmwareWindowTimeInterval() {
|
||||
Integer windowInterval = VmwareManager.VMWARE_STATS_TIME_WINDOW.value();
|
||||
if (windowInterval == null || windowInterval < 20) {
|
||||
s_logger.error(String.format("The window interval can't be [%s]. Therefore we will use the default value of [%s] seconds.", windowInterval, VmwareManager.VMWARE_STATS_TIME_WINDOW.defaultValue()));
|
||||
windowInterval = Integer.valueOf(VmwareManager.VMWARE_STATS_TIME_WINDOW.defaultValue());
|
||||
}
|
||||
return windowInterval;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue