Мониторинг производительности приложения

Я хотел бы иметь специальный журнал производительности с информацией о HTTP-запрос в одной строке

  • запрошенный URL
  • пройденное время
  • имя пользователя
  • возвращенный код состояния
  • идентификатор активности (в случае, если какой-то запрос будет перенаправлен на другое действие)

Сейчас я использую серилог для регистрации необработанных исключений. Где лучше всего добавить такую ​​вставку журнала или что лучше? Хранить журналы в базе данных - это хорошая практика?

Вы должны использовать что-то вроде prometheus и библиотеку метрик для измерения и отслеживания производительности.

Jehof 10.07.2018 20:18

спасибо, я изучу это, но я хотел бы, чтобы все было проще. Например, у моего приложения есть только разрешение на выполнение в базе данных, и я чувствую, что могу ожидать некоторых проблем таким образом.

Muflix 10.07.2018 20:22

Почему голосование против? Стоит добавить некоторые детали?

Muflix 10.07.2018 23:58
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
0
3
949
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если вы хотите, чтобы это было просто и вы используете собственное решение, вы можете написать Промежуточное ПО для основного конвейера asp.net для отслеживания необходимых данных.

Я бы не рекомендовал использовать Serilog для сохранения собранной информации. Serilog - это фреймворк для ведения журналов, и его не следует использовать для отслеживания показателей приложения.

Используйте напрямую базу данных (sql, mongo и т. д.) Для хранения и анализа ваших данных. Вы уже определили объектную модель в своем вопросе, поэтому вам должно быть легко создать и сохранить экземпляр вашей модели в базе данных.

Спасибо, Джехоф, я написал промежуточное ПО, которое, кажется, работает нормально.

Muflix 12.07.2018 10:47

Я поддерживаю довольно полный пример "промежуточного программного обеспечения Serilog" здесь с некоторыми пояснениями в это сообщение в блоге. Он нацелен на одно событие на запрос и поставляется в качестве источника, чтобы легко настроить включенные свойства. HTH :-)

Nicholas Blumhardt 12.07.2018 23:52

Почему бы не взглянуть на инструмент APM или инструмент трассировки, чтобы сделать это, вместо того, чтобы просто создавать журналы с данными, которые не позволяют вам фактически идентифицировать и решать проблемы. Инструменты APm предоставляют гораздо большую ценность, чем просто запись данных о производительности, но вместо этого позволяют решать проблемы. Лидерами в этой области являются AppDynamics, New Relic и Dynatrace. Здесь также могут помочь многие инструменты с открытым исходным кодом, такие как Zipkin, Jaeger и Skywalking. Вы также можете объяснить архитектуру и язык своего приложения :)

Я хотел, чтобы это было просто. Я уже регистрирую необработанные ошибки с помощью Serilog, поэтому могу получать информацию об ошибках приложения.

Muflix 12.07.2018 10:51

Да, необработанные исключения, безусловно, являются одним из способов отладки проблем, но есть много других категорий проблем, помимо ошибок, с которыми вы можете столкнуться и которые будет сложно отлаживать в производственной среде, например, проблемы с производительностью (db, code apis), вопросы об использовании и эффективности кода, которые могут решить инструменты APM. Многие коммерческие инструменты также помогают в мониторинге инфраструктуры.

Jonah Kowall 13.07.2018 18:32

Подход промежуточного программного обеспечения, кажется, работает.

public class PerformanceMiddleware
    {
        private readonly RequestDelegate next;
        private readonly IConfiguration _configuration;
        private readonly ILogger _logger;

        public PerformanceMiddleware(RequestDelegate next, IConfiguration configuration, ILogger<PerformanceMiddleware> logger)
        {
            _configuration = configuration;
            _logger = logger;
            this.next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            await next.Invoke(context);

            stopwatch.Stop();

            try
            {
                using (var conn = new SqlConnection(_configuration.GetConnectionString("DefaultConnection")))
                using (var command = new SqlCommand("dbo.usp_insertPerformance", conn) { CommandType = CommandType.StoredProcedure })
                {
                    conn.Open();

                    // set parameters
                    command.ExecuteNonQuery();
                }
            }
            // We dont want show this error to user.
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error in PerformanceMiddleware database operation.");
            }

        }
    }

Другие вопросы по теме