private void Repopulate() { if (_XenObject == null) { return; } try { var perfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(_XenObject); for (int i = 0; i < perfmonDefinitions.Length; i++) { PerfmonDefinition perfmonDefinition = perfmonDefinitions[i]; if (perfmonDefinition.IsCPUUsage) { cpuAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsNetworkUsage) { netAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsDiskUsage) { diskAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsMemoryUsage) { memoryAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsSrUsage) { srAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsDom0MemoryUsage) { dom0MemoryAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsSrPhysicalUtilisation) { physicalUtilisationAlert.Populate(perfmonDefinition); } } } catch { } }
protected override void Run() { if (xo == null) { return; } Host theHost = xo as Host; // Dom0 Memory usage alert is an exception. While configuration for all the alerts (eg. related to the Host) have to be saved to this "xo", // dom0 Memory usage's has to be in the Dom0's other config. // var dom0_memory_usage = perfmonDefinitions.FirstOrDefault(d => d.IsDom0MemoryUsage); if (dom0_memory_usage != null) { perfmonDefinitions.Remove(dom0_memory_usage); var dom0Vm = theHost == null ? null : theHost.ControlDomainZero; if (dom0Vm != null) { var dom0PerfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(dom0Vm).ToList(); bool found = false; for (int ii = 0; ii < dom0PerfmonDefinitions.Count; ii++) { var pmd = dom0PerfmonDefinitions[ii]; if (pmd != null && pmd.IsDom0MemoryUsage) { dom0PerfmonDefinitions[ii] = dom0_memory_usage; found = true; break; } } if (!found) { dom0PerfmonDefinitions.Add(dom0_memory_usage); } string dom0PerfmonConfigXML = PerfmonDefinition.GetPerfmonDefinitionXML(dom0PerfmonDefinitions); Helpers.SetOtherConfig(Session, dom0Vm, PerfmonDefinition.PERFMON_KEY_NAME, dom0PerfmonConfigXML); } } else { var dom0Vm = theHost == null ? null : theHost.ControlDomainZero; if (dom0Vm != null) { var dom0PerfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(dom0Vm).ToList(); int found = dom0PerfmonDefinitions.RemoveAll(d => d.IsDom0MemoryUsage); if (found > 0) { string dom0PerfmonDefinitionsXml = PerfmonDefinition.GetPerfmonDefinitionXML(dom0PerfmonDefinitions); Helpers.SetOtherConfig(Session, dom0Vm, PerfmonDefinition.PERFMON_KEY_NAME, dom0PerfmonDefinitionsXml); } } } if (perfmonDefinitions == null || perfmonDefinitions.Count == 0) { Helpers.RemoveFromOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME); } else { string perfmonConfigXML = PerfmonDefinition.GetPerfmonDefinitionXML(perfmonDefinitions); Helpers.SetOtherConfig(Session, xo, PerfmonDefinition.PERFMON_KEY_NAME, perfmonConfigXML); } var hosts = new List <Host>(); if (theHost == null) { VM vm = xo as VM; if (vm == null) { SR sr = xo as SR; if (sr != null) { foreach (var pbdRef in sr.PBDs) { PBD pbd = sr.Connection.Resolve(pbdRef); if (pbd == null) { continue; } var host = pbd.Connection.Resolve(pbd.host); if (host != null) { hosts.Add(host); } } } } else { var host = vm.Home(); if (host != null) { hosts.Add(host); } } } else { hosts.Add(theHost); } foreach (var host in hosts) { try { //NB The refresh causes the server to re-read the configuration //immediately. But even if the refresh fails, the change will be //noticed, just a bit later. new ExecutePluginAction(host.Connection, host, XenServerPlugins.PLUGIN_PERFMON_PLUGIN, XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH, new Dictionary <string, string>(), true).RunExternal(Session); } catch (Exception e) { // Handle perfmon randomly being stopped if (e.Message.StartsWith(XenServerPlugins.PLUGIN_PERFMON_ERROR_NOT_RUNNING)) { // start perfmon and try again try { new ExecutePluginAction(host.Connection, host, XenServerPlugins.PLUGIN_PERFMON_PLUGIN, XenServerPlugins.PLUGIN_PERFMON_FUNCTION_START, new Dictionary <string, string>(), true).RunExternal(Session); new ExecutePluginAction(host.Connection, host, XenServerPlugins.PLUGIN_PERFMON_PLUGIN, XenServerPlugins.PLUGIN_PERFMON_FUNCTION_REFRESH, new Dictionary <string, string>(), true).RunExternal(Session); } catch (Exception ex) { log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", ex.Message); } } else { log.DebugFormat("Perfmon refresh failed ({0}). Alerts will start being produced within half an hour.", e.Message); } } } }
private void Repopulate() { if (_XenObject == null) { return; } try { var perfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(_XenObject); for (int i = 0; i < perfmonDefinitions.Length; i++) { PerfmonDefinition perfmonDefinition = perfmonDefinitions[i]; if (perfmonDefinition.IsCPUUsage) { cpuAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsNetworkUsage) { netAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsDiskUsage) { diskAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsMemoryUsage) { memoryAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsSrUsage) { srAlert.Populate(perfmonDefinition); } else if (perfmonDefinition.IsSrPhysicalUtilisation) { physicalUtilisationAlert.Populate(perfmonDefinition); } } } catch (Exception ex) { log.Error("Unexpected error during populating controls for Alerts. Exception swallowed.", ex); //Adding this to pre-existing empty catch block to log it at least } // Dom0 memory usage is stored in the other_config of the Dom0 vm not on the host (or any other XenObject) try { var host = _XenObject as Host; if (host != null) { var dom0 = host.ControlDomainZero; if (dom0 != null) { var controlDomainPerfmonDefinitions = PerfmonDefinition.GetPerfmonDefinitions(dom0); if (controlDomainPerfmonDefinitions != null) { for (int i = 0; i < controlDomainPerfmonDefinitions.Length; i++) { var def = controlDomainPerfmonDefinitions[i]; if (def != null && def.IsDom0MemoryUsage) { dom0MemoryAlert.Populate(def); } } } } } } catch (Exception ex) { log.Error("Unexpected error during populating controls for Dom0 Memory Usage alert. Exception swallowed.", ex); //Any error here will cause the controls not being populated, but they will be still usable. } }