public Notifier(string gameId, MessageTopic topic, MoniverseNotification notification, NotificationLevel level = NotificationLevel.Info) { GameId = gameId; message = notification; NotificationId = notification.Id; Topic = topic; Level = level; switch (topic) { case MessageTopic.Error: message.ARN = NotificationTopics.ServiceError; if (level == NotificationLevel.Error) { message.ARN = NotificationTopics.ServiceError; } break; case MessageTopic.Users: message.ARN = NotificationTopics.ServiceError; break; case MessageTopic.Game: break; case MessageTopic.Hosting: break; } }
public static MoniverseNotification ActiveUserDeltaThreshold(GameMonitoringConfig game) { MoniverseNotification notification = new MoniverseNotification() { Id = "UserDelta", ShouldSend = false }; string subject = "{0} Users Online Dropped {1}"; string message = "[{0} Alert {1}] | Game: {2} - Number of Users Online Dropped by {3} over past {4} minutes which is over the threshold of {5}"; Logger.Instance.Info(String.Format("Check User Delta for {0}", game.Id)); // Get last three user count snapshots string query = String.Format( @"SELECT RecordTimestamp, SUM(GameSessionUsers) AS GameSessionUsers FROM ( SELECT DATE_SUB(RecordTimestamp, INTERVAL (IFNULL(HOUR(RecordTimestamp) % FLOOR(3 / 60), 0) * 60 * 60) + ((MINUTE(RecordTimestamp) % 3) * 60) + SECOND(RecordTimestamp) SECOND) AS RecordTimestamp, ROUND(AVG(GameSessionUsers)) AS GameSessionUsers, RegionName FROM GameUserActivity WHERE GameId = '{0}' AND DATE_SUB(RecordTimestamp, INTERVAL (IFNULL(HOUR(RecordTimestamp) % FLOOR(3 / 60), 0) * 60 * 60) + ((MINUTE(RecordTimestamp) % 3) * 60) + SECOND(RecordTimestamp) SECOND) > UTC_TIMESTAMP() - INTERVAL 10 MINUTE GROUP BY DATE_SUB(RecordTimestamp, INTERVAL (IFNULL(HOUR(RecordTimestamp) % FLOOR(3 / 60), 0) * 60 * 60) + ((MINUTE(RecordTimestamp) % 3) * 60) + SECOND(RecordTimestamp) SECOND), RegionName ) USERS GROUP BY RecordTimestamp ORDER BY RecordTimestamp DESC LIMIT 0, 3;", game.Id); DataTable queryResults = DBManager.Instance.Query(Datastore.Monitoring, query); if (!queryResults.HasRows() || queryResults.Rows.Count != 3) { if (game.IsNotificationSettingEnabled(NotificationLevel.PVSupport)) { new Notifier(Games.EMPTYGAMEID, MessageTopic.Error, new MoniverseNotification() { Id = "DBERROR", Message = "Not Enough User Rows returned in Online User Check", Subject = "Online User Check Failed" }).SendOnce(); Logger.Instance.Info(String.Format("Not Enough User Rows Returned", game.Id)); } } int currentUsers = (int)queryResults.Rows[0].Field<decimal>("GameSessionUsers"); int users_3MinsAgo = (int)queryResults.Rows[1].Field<decimal>("GameSessionUsers"); int users_6MinsAgo = (int)queryResults.Rows[2].Field<decimal>("GameSessionUsers"); string recordTimestamp = queryResults.Rows[0].Field<DateTime>("RecordTimestamp").ToString(); // Check notification thresholds and send notification of delta warning or error is necessary float sixMinDropPercent = 1.0f - ((float)currentUsers / (float)users_6MinsAgo); float threeMinDropPercent = 1.0f - ((float)currentUsers / (float)users_3MinsAgo); string sixMinuteDropF = Math.Abs((decimal)(sixMinDropPercent * 100)).ToString("#.##\\%"); // if (sixMinDropPercent > game.ActiveUserDeltaThresholdPct_6Min) { notification.ShouldSend = true; notification.Message = String.Format(message, NotificationLevel.Error.ToString(), recordTimestamp, game.Title, sixMinuteDropF, 6, game.ActiveUserDeltaThresholdPct_6Min); notification.Subject = String.Format(subject, game.ShortTitle, sixMinuteDropF); } else if (threeMinDropPercent > game.ActiveUserDeltaThresholdPct_6Min) { notification.ShouldSend = true; notification.Message = String.Format(message, NotificationLevel.Error.ToString(), recordTimestamp, game.Title, sixMinuteDropF, 6, game.ActiveUserDeltaThresholdPct_6Min); notification.Subject = String.Format(subject, game.ShortTitle, sixMinuteDropF); } else if (threeMinDropPercent > game.ActiveUserDeltaThresholdPct_3Min) { notification.ShouldSend = true; notification.Message = String.Format(message, NotificationLevel.Error.ToString(), recordTimestamp, game.Title, sixMinuteDropF, 6, game.ActiveUserDeltaThresholdPct_6Min); notification.Subject = String.Format(subject, game.ShortTitle, sixMinuteDropF); } return notification; }
public void setNotification(MoniverseNotification notification) { notification.ARN = this.message.ARN; this.message = notification; }
public static MoniverseNotification TestNotification(GameMonitoringConfig game) { MoniverseNotification notification = new MoniverseNotification() { Id = "TestNotification", Message = "TESTMESSAGE", Subject = "TEST TEST TEST" }; return notification; }