コード例 #1
0
ファイル: Monitoring.cs プロジェクト: loreps-all-site/ISPCore
        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;
        }
コード例 #2
0
        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));
                }
            }
        }
コード例 #3
0
        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());
        }
コード例 #4
0
        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));
        }