/
Frozin
/
DIS-3
Обзор
Документация
Войти
/
Frozin
/
DIS-3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
API_PIR/Middleware/StatisticsLoggingMiddleware.cs
81 строка
2 KB
Dobryk
Добавлен внутренний API
20 окт 2025, 05:26
20 окт 2025, 05:26
7ee684c
Код
Авторство
О чём код?
using API_PIR.Services; namespace API_PIR.Middleware; public class StatisticsLoggingMiddleware { private readonly RequestDelegate _next; private readonly IInternalApiClient _internalApiClient; private readonly ILogger<StatisticsLoggingMiddleware> _logger; private DateTime _lastStatisticsUpdate = DateTime.MinValue; private readonly TimeSpan _updateInterval = TimeSpan.FromMinutes(5); private readonly Lock _lock = new(); public StatisticsLoggingMiddleware( RequestDelegate next, IInternalApiClient internalApiClient, ILogger<StatisticsLoggingMiddleware> logger) { _next = next; _internalApiClient = internalApiClient; _logger = logger; } public async Task InvokeAsync(HttpContext context) { if (context.Request.Path.StartsWithSegments("/api/internal") || context.Request.Path.StartsWithSegments("/swagger")) { await _next(context); return; } await TryUpdateAndLogStatisticsAsync(); await _next(context); } private async Task TryUpdateAndLogStatisticsAsync() { var shouldUpdate = false; lock (_lock) { if (DateTime.UtcNow - _lastStatisticsUpdate >= _updateInterval) { shouldUpdate = true; _lastStatisticsUpdate = DateTime.UtcNow; } } if (shouldUpdate) { await UpdateAndLogStatisticsAsync(); } } private async Task UpdateAndLogStatisticsAsync() { try { var statistics = await _internalApiClient.GetStatisticsFromInternalApiAsync(); if (statistics != null) { _logger.LogInformation( "Статистика по веб-приложению: Всего заметок {TotalNotes}, всего пользователей {TotalUsers}. Last updated: {LastUpdated}", statistics.TotalNotes, statistics.TotalUsers, statistics.LastUpdated.ToString("yyyy-MM-dd HH:mm:ss")); } else { _logger.LogWarning("Не удалось получить статистику"); } } catch (Exception ex) { _logger.LogError(ex, "Ошибка при получении статистики"); } } }