Контролируйте свое приложение Spring Boot с помощью Sentry

Spring Boot

Sentry — это система мониторинга приложений, которую можно использовать для онлайн-мониторинга и анализа ошибок различных интерфейсных и серверных технологических стеков.На этот раз мы используем ее для проведения онлайн-анализа журналов для проектов Spring Boot.

Создать проект

Сначала нужно создать проект в Sentry согласно подсказкам.Платформа проекта (платформа) может выбрать Spring Boot или Java.

Импорт зависимостей и конфигурации

Sentry предоставляет официальный Spring Boot Starter.

<dependency>
  <groupId>io.sentry</groupId>
  <artifactId>sentry-spring-boot-starter</artifactId>
  <version>3.1.1</version>
</dependency>

В дополнение к этому нам также необходимо настроить application.properties для импорта ключа проекта (DSN), который мы создали в Sentry:

sentry.dsn=https://key@host/id

первая ошибка

Напишите наш контроллер, чтобы он попытался создать простое исключение.

@RestController
public class HelloController {

  @RequestMapping("/")
  public void test() {
    throw new IllegalArgumentException("hello world");
  }
}

Если с предыдущей конфигурацией проблем нет, то мы можем увидеть это сообщение об исключении на панели «Проблема» Sentry.Нажмите на исключение, чтобы просмотреть подробности. Вы можете увидеть некоторые основные сведения об этом исключении, такие как «информация о пользователе (здесь не указан)», «среда пользователя», «тег», «трассировка стека вызовов (StackTrace)», «срез журнала (хлебные крошки)», «Запрос Заголовки», а также некоторый настраиваемый пользователем контент (называемый Context).Вот введение в концепцию Sentry. Прежде всего, исключения, созданные в одном и том же месте, будут обобщены как «Проблема», а каждое исключение, созданное в этом месте, называется «Событием». Таким образом, когда исключение запускается дважды в одном и том же месте, остается только одна проблема, но на странице событий можно увидеть два события.

Настроить информацию о пользователе

Теперь, когда мы знаем это исключение, мы также хотим знать, какой пользователь инициировал исключение. Sentry SDK предоставляет SentryUserProvider, который можно использовать для предоставления информации о пользователе в случае исключения Нам нужно только настроить bean-компонент.

    @Bean
    public SentryUserProvider sentryUserProvider(){
        return () -> {
            // 实际的用户信息,可能要通过其他方式获得
            User user = new User();
            user.setId("userId");
            user.setUsername("张三");
            user.setEmail("zhangsan@gmail.com");

            return user;
        };
    }

Исключение запускается снова, и мы получаем информацию о пользователе.

Настройте теги для фильтрации исключений с помощью тегов

Мы надеемся, что с увеличением количества аномальной информации мы сможем отфильтровать некоторую специфическую аномальную информацию.Sentry предоставляет функцию «Тег», которую можно фильтровать в соответствии с тегом. Хотя встроенных тегов достаточно, мы все еще надеемся настроить некоторые в соответствии с потребностями бизнеса.Конечно, Sentry SDK предоставляет функцию BeforeSendCallback, и мы можем добавить некоторые теги.

    @Bean
    public SentryOptions.BeforeSendCallback beforeSendCallback(){
        return (event, hint) -> {
            event.setTag("name","zhangsan");
            return event;
        };
    }

Вы видите, что наш тег был успешно добавлен. Нажмите на этот тег, чтобы найти все события, содержащие этот тег.

Интегрировать журнал

Обработка исключений может быть описана в нашем существующем бизнесе Spring Boot, и большинство исключений могут быть записаны непосредственно в виде журнала. Конечно, Sentry также обеспечивает поддержку фреймворков журналирования, таких как Logback/Log4j2. Просто импортируйте соответствующие зависимости, здесь мы используем Logback в качестве примера.

<dependency>
  <groupId>io.sentry</groupId>
  <artifactId>sentry-logback</artifactId>
  <version>3.1.1</version>
</dependency>

Sentry Spring Boot Starter автоматически отслеживает зависимости и настроит для нас соответствующую конфигурацию Мы можем напрямую использовать журнал вместо исходного исключения.

@RestController
public class HelloController {
    private static Logger logger = LoggerFactory.getLogger(HelloController.class);
    
    @RequestMapping("/")
    public void test(){
        logger.error("Logback error!");
    }
}

Интересный момент здесь в том, что за необработанные дикие исключения Sentry будет давать ему фатальный уровень, а после введения Logback будет использоваться лог-уровень logger.Настроив минимальный уровень событий и минимальный уровень навигационной цепочки в файле конфигурации, мы можем указать, какие уровни журнала будут генерировать «Событие», а какие уровни журнала будут записывать следующий «срез журнала (хлебные крошки)». Обратите внимание, что предпосылка заключается в том, что уровень регистратора ниже или равен этому уровню (иначе он не будет собран).

sentry.logging.minimum-event-level=info
sentry.logging.minimum-breadcrumb-level=debug

Самодельный часовой

В дополнение к официальной версии Sentry вы также можете создать собственную версию Sentry. Официальная версия имеет ограничения на использование и может потребовать оплаты; самостоятельная версия не имеет ограничений на использование, но официальная не оказывает техническую поддержку. Самостоятельно построенный Sentry также очень прост, требует Docker и Docker Compose и требует не менее 2,4 ГБ свободной памяти на оборудовании.

git clone https://github.com/getsentry/onpremise.git
cd onpremise
./install.sh

После этого вы можете увидеть самодельный Sentry на локальном хосте: 9000 и настроить порт на 80/443 с обратным прокси-сервером Nginx.

официальная документация

В этой статье представлены только некоторые часто используемые функции.Для получения дополнительных функций Sentry обратитесь к официальным документам:docs.sentry.io