public static void Run(CoreDB coreDB, IMemoryCache memoryCache) { if (IsRun) { return; } IsRun = true; #region IspNumberOfRequestToHour // Если есть кеш за прошлый час var TimeIspNumberOfRequestDay = DateTime.Now.AddHours(-1); if (memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToHour(TimeIspNumberOfRequestDay), out IDictionary <string, NumberOfRequestHour> DataNumberOfRequestToHour)) { SqlToMode.SetMode(SqlMode.Read); coreDB.ChangeTracker.AutoDetectChangesEnabled = false; // Записываем данные в базу foreach (var item in DataNumberOfRequestToHour) { coreDB.RequestsFilter_NumberOfRequestDay.Add(new NumberOfRequestDay() { Host = item.Key, Time = TimeIspNumberOfRequestDay, Count200 = item.Value.Count200, Count303 = item.Value.Count303, Count401 = item.Value.Count401, Count403 = item.Value.Count403, Count500 = item.Value.Count500, Count2FA = item.Value.Count2FA, }); } // Сохраняем базу coreDB.SaveChanges(); // Разрешаем записывать данные в SQL SqlToMode.SetMode(SqlMode.ReadOrWrite); coreDB.ChangeTracker.AutoDetectChangesEnabled = true; // Сносим кеш (статистика за час) memoryCache.Remove(KeyToMemoryCache.IspNumberOfRequestToHour(TimeIspNumberOfRequestDay)); // Раз в час GC.Collect(GC.MaxGeneration); } #endregion #region Очистка баз + перенос NumberOfRequestDay в NumberOfRequestMonth if (memoryCache.TryGetValue("CronIspClearDB", out DateTime CronIspClearDB)) { // Если дата отличается от текущей if (CronIspClearDB.Day != DateTime.Now.Day) { SqlToMode.SetMode(SqlMode.Read); // Обновляем кеш memoryCache.Set("CronIspClearDB", DateTime.Now); #region Очищаем NumberOfRequestMonth foreach (var item in coreDB.RequestsFilter_NumberOfRequestMonth.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_NumberOfRequestMonth), item.Id)); } } #endregion #region Очищаем Jurnals200 foreach (var item in coreDB.RequestsFilter_Jurnals200.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals200), item.Id)); } } #endregion #region Очищаем Jurnals303 foreach (var item in coreDB.RequestsFilter_Jurnals303.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals303), item.Id)); } } #endregion #region Очищаем Jurnals403 foreach (var item in coreDB.RequestsFilter_Jurnals403.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals403), item.Id)); } } #endregion #region Очищаем Jurnals401 foreach (var item in coreDB.RequestsFilter_Jurnals401.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals401), item.Id)); } } #endregion #region Очищаем Jurnals2FA foreach (var item in coreDB.RequestsFilter_Jurnals2FA.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals2FA), item.Id)); } } #endregion #region Очищаем Jurnals500 foreach (var item in coreDB.RequestsFilter_Jurnals500.AsNoTracking()) { // Если записи больше 30 дней if ((DateTime.Now - item.Time).TotalDays > 30) { coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_Jurnals500), item.Id)); } } #endregion #region Переносим NumberOfRequestDay в NumberOfRequestMonth // Хранимм дату и значение Dictionary <int, NumberOfRequestBase> NumberOfRequestMonth = new Dictionary <int, NumberOfRequestBase>(); // Собираем статистику за прошлые дни foreach (var item in coreDB.RequestsFilter_NumberOfRequestDay.AsNoTracking()) { // Пропускаем статистику за сегодня if (item.Time.Day == DateTime.Now.Day && item.Time.Month == DateTime.Now.Month) { continue; } #region Переносим значения в NumberOfRequestMonth if (NumberOfRequestMonth.TryGetValue(item.Time.Day, out NumberOfRequestBase it)) { it.Count200 += item.Count200; it.Count303 += item.Count303; it.Count403 += item.Count403; it.Count401 += item.Count401; it.Count500 += item.Count500; it.Count2FA += item.Count2FA; } else { NumberOfRequestMonth.Add(item.Time.Day, item); } #endregion // Удаляем значения из базы coreDB.Database.ExecuteSqlCommand(ComandToSQL.Delete(nameof(coreDB.RequestsFilter_NumberOfRequestDay), item.Id)); } // Переносим временные данные с NumberOfRequestMonth в базу foreach (var item in NumberOfRequestMonth) { // Добовляем в базу coreDB.RequestsFilter_NumberOfRequestMonth.Add(new NumberOfRequestMonth() { Time = item.Value.Time, allRequests = item.Value.Count200 + item.Value.Count303 + item.Value.Count403 + item.Value.Count500 + item.Value.Count401 + item.Value.Count2FA, Count200 = item.Value.Count200, Count303 = item.Value.Count303, Count401 = item.Value.Count401, Count403 = item.Value.Count403, Count500 = item.Value.Count500, Count2FA = item.Value.Count2FA, }); } #endregion // Сохраняем базу coreDB.SaveChanges(); SqlToMode.SetMode(SqlMode.ReadOrWrite); // Раз в день GC.Collect(GC.MaxGeneration); } } else { // Создаем кеш задним числом memoryCache.Set("CronIspClearDB", DateTime.Now.AddDays(-1)); } #endregion IsRun = false; }
public static void SetCountRequestToHour(TypeRequest type, string host, bool EnableCountRequest) { #region Локальный метод - "SetCount" void SetCount(NumberOfRequestHour dt) { switch (type) { case TypeRequest._200: dt.Count200++; break; case TypeRequest._303: dt.Count303++; break; case TypeRequest._403: dt.Count403++; break; case TypeRequest._401: dt.Count401++; break; case TypeRequest._500: dt.Count500++; break; case TypeRequest._2fa: dt.Count2FA++; break; } } #endregion if (EnableCountRequest) { string keyNumberOfRequestToHour = KeyToMemoryCache.IspNumberOfRequestToHour(DateTime.Now); if (memoryCache.TryGetValue(keyNumberOfRequestToHour, out IDictionary <string, NumberOfRequestHour> DataNumberOfRequestDay)) { // Если хост есть в кеше if (DataNumberOfRequestDay.TryGetValue(host, out NumberOfRequestHour dtValue)) { SetCount(dtValue); } // Если хоста нету в кеше else { var dt = new NumberOfRequestHour(); dt.Time = DateTime.Now; SetCount(dt); DataNumberOfRequestDay.Add(host, dt); } } else { // Считаем запрос var dt = new NumberOfRequestHour(); dt.Time = DateTime.Now; SetCount(dt); // Создаем кеш memoryCache.Set(keyNumberOfRequestToHour, new Dictionary <string, NumberOfRequestHour>() { [host] = dt }, TimeSpan.FromHours(2)); } } }
private string StatReguestToHours(string ShowHost = null) { // Данные для вывода статистики var DtNumberOfRequestDay = new Dictionary <int, NumberOfRequestBase>(); #region Локальный метод - "AddToNumberOfRequestDay" void AddOrUdpateNumberOfRequestDay(string host, NumberOfRequestBase dt) { // Статистика не для текущего дня // Поиск по домену if (dt.Time.Day != DateTime.Now.Day || (ShowHost != null && ShowHost != host)) { return; } if (DtNumberOfRequestDay.TryGetValue(dt.Time.Hour, out NumberOfRequestBase item)) { // Добовляем данные к статистике item.Count200 += dt.Count200; item.Count303 += dt.Count303; item.Count403 += dt.Count403; item.Count401 += dt.Count401; item.Count500 += dt.Count500; item.Count2FA += dt.Count2FA; item.CountIPtables += dt.CountIPtables; } else { // Записываем данные DtNumberOfRequestDay.TryAdd(dt.Time.Hour, new NumberOfRequestBase() { Time = dt.Time, Count200 = dt.Count200, Count303 = dt.Count303, Count403 = dt.Count403, Count401 = dt.Count401, Count500 = dt.Count500, Count2FA = dt.Count2FA, CountIPtables = dt.CountIPtables }); } } #endregion #region Статистика из базы за сутки foreach (var RequestToHour in coreDB.RequestsFilter_NumberOfRequestDay.AsNoTracking()) { AddOrUdpateNumberOfRequestDay(RequestToHour.Host, RequestToHour); } #endregion #region Статистика из кеша за текущий час if (memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToHour(DateTime.Now), out IDictionary <string, NumberOfRequestHour> DataNumberOfRequestToHour)) { foreach (var item in DataNumberOfRequestToHour) { AddOrUdpateNumberOfRequestDay(item.Key, item.Value); } } #endregion #region Переменные для статистики string tmpBase = "{x:'0:00',y:0},{x:'1:00',y:0},{x:'2:00',y:0},{x:'3:00',y:0},{x:'4:00',y:0},{x:'5:00',y:0},{x:'6:00',y:0},{x:'7:00',y:0},{x:'8:00',y:0},{x:'9:00',y:0},{x:'10:00',y:0},{x:'11:00',y:0},{x:'12:00',y:0},{x:'13:00',y:0},{x:'14:00',y:0},{x:'15:00',y:0},{x:'16:00',y:0},{x:'17:00',y:0},{x:'18:00',y:0},{x:'19:00',y:0},{x:'20:00',y:0},{x:'21:00',y:0},{x:'22:00',y:0},{x:'23:00',y:0}"; string tmp200 = tmpBase; string tmp303 = tmpBase; string tmp403 = tmpBase; string tmp401 = tmpBase; string tmp500 = tmpBase; string tmp2FA = tmpBase; string tmpIPtables = tmpBase; #endregion #region Обновляем переменные foreach (var dt in DtNumberOfRequestDay) { #region Локальный метод - "GeReplacet" string GeReplace(string s, long value) { return(s.Replace("{x:'" + dt.Value.Time.Hour + ":00',y:0}", "{x:'" + dt.Value.Time.Hour + ":00',y:" + value + "}")); } #endregion tmp200 = GeReplace(tmp200, dt.Value.Count200); tmp303 = GeReplace(tmp303, dt.Value.Count303); tmp403 = GeReplace(tmp403, dt.Value.Count403); tmp401 = GeReplace(tmp401, dt.Value.Count401); tmpIPtables = GeReplace(tmpIPtables, dt.Value.CountIPtables); tmp500 = GeReplace(tmp500, dt.Value.Count500); tmp2FA = GeReplace(tmp2FA, dt.Value.Count2FA); } #endregion #region Собираем json StringBuilder json = new StringBuilder(); json.Append("{key: '200', nonStackable: false, shifting: false, values: [ " + tmp200 + " ] },"); json.Append("{key: '303', nonStackable: false, shifting: false, values: [ " + tmp303 + " ] },"); json.Append("{key: '403', nonStackable: false, shifting: false, values: [ " + tmp403 + " ] },"); json.Append("{key: '401', nonStackable: false, shifting: false, values: [ " + tmp401 + " ] },"); json.Append("{key: 'IPtables', nonStackable: false, shifting: false, values: [ " + tmpIPtables + " ] },"); json.Append("{key: '500', nonStackable: false, shifting: false, values: [ " + tmp500 + " ] },"); json.Append("{key: '2FA', nonStackable: false, shifting: false, values: [ " + tmp2FA + " ] }"); #endregion // Успех return(json.ToString()); }
public JsonResult StatsDay(string SearchHost = null) { // Данные для вывода статистики var DtNumberOfRequestDay = new Dictionary <string, List <NumberOfRequestDay> >(); #region Локальный метод "AddOrUpdateToNumberOfRequestDay" void AddOrUpdateToNumberOfRequestDay(string _host, NumberOfRequestBase dt, DateTime time) { if (SearchHost != null && SearchHost != _host) { return; } var item = new NumberOfRequestDay() { Host = _host, Time = time, Count200 = dt.Count200, Count303 = dt.Count303, Count401 = dt.Count401, Count403 = dt.Count403, Count500 = dt.Count500, Count2FA = dt.Count2FA, }; if (DtNumberOfRequestDay.TryGetValue(_host, out List <NumberOfRequestDay> mass)) { // Добовляем данные mass.Add(item); // Перезаписываем данные DtNumberOfRequestDay[_host] = mass; } else { // Записываем новые данные DtNumberOfRequestDay.Add(_host, new List <NumberOfRequestDay>() { item }); } } #endregion #region Статистика из базы за сутки foreach (var RequestToHour in coreDB.RequestsFilter_NumberOfRequestDay.AsNoTracking()) { AddOrUpdateToNumberOfRequestDay(RequestToHour.Host, RequestToHour, RequestToHour.Time); } #endregion #region Статистика из кеша за текущий час if (memoryCache.TryGetValue(KeyToMemoryCache.IspNumberOfRequestToHour(DateTime.Now), out IDictionary <string, NumberOfRequestHour> DataNumberOfRequestToHour)) { foreach (var item in DataNumberOfRequestToHour) { AddOrUpdateToNumberOfRequestDay(item.Key, item.Value, DateTime.Now); } } #endregion // Ответ return(Json(DtNumberOfRequestDay)); }