From b7d4df0a11f634b23907531ef0349a3842446046 Mon Sep 17 00:00:00 2001 From: GaOrtiga <49285692+GaOrtiga@users.noreply.github.com> Date: Sat, 4 Jul 2026 11:26:08 -0300 Subject: [PATCH] Add more details to VM deployment failure alert messages (#12939) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Erik Böck <89930804+erikbocks@users.noreply.github.com> --- .../java/com/cloud/vm/UserVmManagerImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 1a65bbaca8d..e6e110e341f 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -160,6 +160,7 @@ import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.logging.log4j.ThreadContext; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -2775,22 +2776,29 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (vm != null) { if (vm.getState().equals(State.Stopped)) { HostVO host = _hostDao.findById(hostId); - logger.debug("Destroying vm {} as it failed to create on Host: {} with id {}", vm, host, hostId); + logger.debug("Destroying VM [{}] as it was unable to be deployed on Host: {}.", vm, host); try { _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailedToError, null); } catch (NoTransitionException e1) { - logger.warn(e1.getMessage()); + logger.error("Error when transitioning state of [{}].", vm, e1); } // destroy associated volumes for vm in error state // get all volumes in non destroyed state + logger.debug("Destroying associated volumes of [{}] as it was unable to be deployed.", vm); List volumesForThisVm = _volsDao.findUsableVolumesForInstance(vm.getId()); for (VolumeVO volume : volumesForThisVm) { if (volume.getState() != Volume.State.Destroy) { + logger.trace("Destroying volume [{}] as its VM was unable to be deployed.", volume); volumeMgr.destroyVolume(volume); } } - String msg = String.format("Failed to deploy Vm %s, on Host %s with Id: %d", vm, host, hostId); - _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_USERVM, vm.getDataCenterId(), vm.getPodIdToDeployIn(), msg, msg); + String subject = String.format("Failed to deploy Instance [ID: %s]", vm.getUuid()); + String body = String.format("Failed to deploy [%s]%s. To troubleshoot, please check the logs with [logid:%s].", + vm, + hostId != null ? String.format(" on host [%s]", hostId) : "", + ThreadContext.get("logcontextid")); + + _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_USERVM, vm.getDataCenterId(), vm.getPodIdToDeployIn(), subject, body); // Get serviceOffering and template for Virtual Machine ServiceOfferingVO offering = serviceOfferingDao.findById(vm.getId(), vm.getServiceOfferingId()); @@ -2802,8 +2810,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } } - - private class VmIpFetchTask extends ManagedContextRunnable { @Override