private static XmlDocument CreateXmlContent(ImageServer.Common.Alert alert) { XmlDocument doc = new XmlDocument(); XmlNode docElement = doc.CreateElement("Contents"); doc.AppendChild(docElement); XmlNode messageNode = doc.CreateElement("Message"); messageNode.AppendChild(doc.CreateTextNode(alert.Message)); docElement.AppendChild(messageNode); if (alert.ContextData != null) { XmlNode contextContainerNode = doc.CreateElement("Context"); XmlNode contextNode = doc.ImportNode(XmlUtils.Serialize(alert.ContextData, false), true); contextContainerNode.AppendChild(contextNode); docElement.AppendChild(contextContainerNode); } return(doc); }
static private string ResolveKey(ImageServer.Common.Alert alert) { Platform.CheckForNullReference(alert, "alert"); Platform.CheckForNullReference(alert.Source, "alert.Source"); string key = String.Format("{0}/{1}/{2}/{3}", alert.Source.Host, alert.Source.Name, alert.Code, alert.ContextData); return(key); }
public void GenerateAlert(ImageServer.Common.Alert alert) { IAlertServiceExtension[] extensions = GetExtensions(); foreach (IAlertServiceExtension ext in extensions) { try { ext.OnAlert(alert); } catch (Exception e) { Platform.Log(LogLevel.Error, e, "Error occurred when calling {0} OnAlert()", ext.GetType()); } } }
public void OnAlert(ImageServer.Common.Alert alert) { AlertFilter filter = new AlertFilter(AlertCache.Instance); if (!filter.Filter(alert)) { AlertCache.Instance.Add(alert); if (DatabaseEnabled) { WriteToDatabase(alert); } else { WriteToLog(alert); } } }
/// <summary> /// Adds an alert into the cache. /// </summary> /// <param name="alert"></param> public void Add(ImageServer.Common.Alert alert) { lock (_syncLock) { _listAlerts.Add(alert); } _cache.Add(ResolveKey(alert), alert, null, alert.ExpirationTime, Cache.NoSlidingExpiration, CacheItemPriority.Normal, delegate(string key, Object value, CacheItemRemovedReason reason) { // Discovered an exception here when debugging that may have caused the service to // crash. This delegate was called, however, the alert was not in the cache lock (_syncLock) { if (_listAlerts.Contains((ImageServer.Common.Alert)value)) { _listAlerts.Remove((ImageServer.Common.Alert)value); } } }); }
private static void WriteToLog(ImageServer.Common.Alert alert) { XmlDocument doc = CreateXmlContent(alert); using (StringWriter sw = new StringWriter()) { XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineOnAttributes = false; settings.OmitXmlDeclaration = true; settings.Encoding = Encoding.UTF8; XmlWriter writer = XmlWriter.Create(sw, settings); doc.WriteTo(writer); writer.Flush(); String log = String.Format("ALERT: {0} : {1}", alert.Source.Name, sw); switch (alert.Level) { case AlertLevel.Critical: case AlertLevel.Error: Platform.Log(LogLevel.Error, log); break; case AlertLevel.Informational: Platform.Log(LogLevel.Info, log); break; case AlertLevel.Warning: Platform.Log(LogLevel.Warn, log); break; default: Platform.Log(LogLevel.Info, log); break; } } }
private static void WriteToDatabase(ImageServer.Common.Alert alert) { XmlDocument doc = CreateXmlContent(alert); AlertUpdateColumns columns = new AlertUpdateColumns(); columns.AlertCategoryEnum = AlertCategoryEnum.GetEnum(alert.Category.ToString()); columns.AlertLevelEnum = AlertLevelEnum.GetEnum(alert.Level.ToString()); columns.Component = alert.Source.Name; columns.Content = doc; columns.InsertTime = Platform.Time; columns.Source = alert.Source.Host; columns.TypeCode = alert.Code; IPersistentStore store = PersistentStoreRegistry.GetDefaultStore(); using (IUpdateContext ctx = store.OpenUpdateContext(UpdateContextSyncMode.Flush)) { IAlertEntityBroker alertBroker = ctx.GetBroker <IAlertEntityBroker>(); alertBroker.Insert(columns); ctx.Commit(); } }
public bool Filter(ImageServer.Common.Alert alert) { return(_cache.Contains(alert)); }
/// <summary> /// Gets a value indicating whether the specified alert or another alert that represents the same event is already in the cache. /// </summary> /// <param name="alert"></param> /// <returns></returns> public bool Contains(ImageServer.Common.Alert alert) { lock (_syncLock) return(_listAlerts.Contains(alert)); }