Просто потому, что мы делаем что-то одним способом, не всегда означает, что это правильный путь… или даже лучший способ.
Сколько я себя помню, я включал сообщения журнала в свой код, чтобы во время выполнения получить представление о том, что на самом деле делает код. От разработчиков, работающих локально, до инженера производственной поддержки, эти дополнительные строки кода предназначены для устранения неполадок в непредвиденных сценариях.
Проблема с этим подходом заключается в том, что весь процесс кажется немного неправильным. Происходит что-то неожиданное, поэтому мы изо всех сил пытаемся найти первопричину, используя какое-либо решение для ведения журнала, отслеживая сообщения журнала и трассировку стека в обратном направлении, пытаясь определить, где реальность отличалась от ожиданий. Это может потребовать много усилий и времени — и все это ценой нетерпеливых клиентов (как внутренних, так и внешних), которые задаются вопросом, почему что-то не работает должным образом.
Когда я начал читать о Перекладина , я начал задаваться вопросом, не были ли мои годы, проведенные в одном направлении, в конце концов, неправильными. Поэтому я решил попробовать Roll bar, чтобы посмотреть, предлагает ли он лучший способ, чем мой текущий процесс.
Что такое перекладина?
Roll bar обеспечивает другой подход к мониторингу приложений. Он ориентирован не только на гибкую разработку и непрерывную доставку, но и на обеспечение видимости вашего приложения в режиме реального времени без необходимости обновлять загроможденные экраны журналов и собирать горы данных. Кроме того, данные, поступающие на панель мониторинга Roll bar, не только обеспечивают показатели, ожидаемые командами производственной поддержки и DevOps, но также ссылаются на исходный код — даже до такой степени, что существующие заявки могут быть связаны с неожиданным событием… или же новый билет может быть создан непосредственно из самой Rollbar.
Поэтому, когда Rollbar сообщает об ошибке, вы часто находитесь всего в одном клике от исходного кода, вызывающего нарушение, и создаете новый билет.
Я чувствую, что это тот момент, когда я начинаю писать: “но подождите… это еще не все.” Честно говоря, на самом деле это еще не все, но сейчас самое подходящее время перестать идти по пути маркетинга и действительно что-то сделать с самим Rollbar.
приступая к работе
Прежде чем мы перейдем к деталям, давайте сначала пройдемся по настройке. Первое, что нам нужно сделать, это создать учетную запись, перейдя по следующей ссылке:
Первое, что нам нужно сделать, это создать учетную запись, перейдя по следующей ссылке:
Вы должны увидеть экран, похожий на тот, что показан ниже:
После отправки создается бесплатная учетная запись. Следующим шагом будет создание нового проекта:
Думайте о проекте как о экземпляре службы Roll bar. В моем примере я создал проект под названием “springboot-example”, потому что я планирую использовать простой проект Spring Boot, чтобы взять Rollbar для тест-драйва. Для целей этой статьи я планирую придерживаться значений по умолчанию, насколько это возможно. Перед созданием службы Spring Boot мне нужно получить значение токена post_server_item из раздела Токены доступа к проекту в настройках моего проекта:
Токен post_server_item, который в моем случае начинается с “a2f21”, будет использоваться службой Spring Boot, которую мы создадим следующим.
Создание службы загрузки Spring
Используя IntelliJ IDEA, я смог использовать Spring Initializr для создания базового Spring API, который включал следующие зависимости:
org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-jersey org.springframework.boot spring-boot-starter-web com.h2database h2 runtime org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok true
Для перекладины я добавил следующую зависимость к pom.xml:
com.rollbar rollbar-spring-boot-webmvc 1.7.4
Я также добавил несколько библиотек Apache и свою собственную библиотеку случайных генераторов:
org.apache.commons commons-lang3 org.apache.commons commons-collections4 4.1 com.gitlab.johnjvester random-generator 1.9
Базовая функциональность Сервиса
Базовая функциональность Сервиса Базовая функциональность Сервиса Базовая функциональность Сервиса
@Entity @AllArgsConstructor @NoArgsConstructor @Data public class Musician { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String firstName; private String lastName; @ManyToOne private Instrument instrument; } @Entity @AllArgsConstructor @NoArgsConstructor @Data public class Instrument { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String name; }
Поскольку я использую базу данных H2 в памяти, я включил SQL-скрипт В результате сценарий выполняется каждый раз при запуске сервера Spring Boot.
Установив базовую службу, я запустил службу Spring Boot на порту 8001 и заметил, что мое использование логотипа Roll bar довольно хорошо отображается в журналах:
В текущих версиях Spring Boot вам просто нужно прикрепить изображение с именем banner.png в папку \resources проекта, и Spring Boot автоматически создаст то, что показано выше.
Затем, используя Postman, я смог сделать простой запрос GET на//URI, который вернул ответ 200 OK и следующие данные:
[ { "id": 1, "firstName": "Alex", "lastName": "Lifeson", "instrument": { "id": 1, "name": "Guitar" } }, { "id": 2, "firstName": "Trevor", "lastName": "Rabin", "instrument": { "id": 1, "name": "Guitar" } }, { "id": 3, "firstName": "Geddy", "lastName": "Lee", "instrument": { "id": 2, "name": "Bass" } }, { "id": 4, "firstName": "Chris", "lastName": "Squire", "instrument": { "id": 2, "name": "Bass" } }, { "id": 5, "firstName": "Tony", "lastName": "Kaye", "instrument": { "id": 3, "name": "Keyboards" } }, { "id": 6, "firstName": "Neil", "lastName": "Peart", "instrument": { "id": 4, "name": "Drums" } }, { "id": 7, "firstName": "Alan", "lastName": "White", "instrument": { "id": 4, "name": "Drums" } }, { "id": 8, "firstName": "Jon", "lastName": "Anderson", "instrument": { "id": 5, "name": "Vocals" } } ]
На данный момент служба Spring Boot была проверена как запущенная, поэтому я решил зафиксировать свой код в новом общедоступном репозитории в GitLab .
Настройка Spring Boot для использования Rollbar
Поскольку я являюсь поклонником экстернализации как можно большей части конфигурации, я решил использовать приложение.файл yml и установите следующие пользовательские свойства:
rollbar: access-token: accessTokenGoesHere branch: master environment: development code-version: codeVersionGoesHere spring: application: name: Spring Boot Rollbar Example
Для свойств полосы прокрутки я создал следующий класс, чтобы обеспечить легкий доступ к этим свойствам:
@Data @Configuration("rollbarConfiguration") @ConfigurationProperties("rollbar") public class RollbarConfigurationProperties { private String accessToken; private String branch; private String codeVersion; private String environment; }
Мой план состоит в том, чтобы никогда не сохранять значения токена доступа и версии кода в application.yml. Вместо этого я передам их, используя один из вариантов Spring Boot. В этом примере будет использоваться конфигурация запуска/отладки в IntelliJ IDEA:
Свойство roll bar.access-token – это место, где мы будем хранить значение, начинающееся с “a2f21”, а версией кода будет SHA из GitLab для моей последней фиксации главной ветки, которая будет заполнена, как только все будет настроено.
С установленными свойствами конфигурации требуются только два класса конфигурации. Первый – установить сервер/провайдера для использования Rollbar:
@RequiredArgsConstructor @Component public class RollbarServerProvider implements Provider{ private final Environment environment; private final RollbarConfigurationProperties rollbarConfigurationProperties; @Override public Server provide() { return new Server.Builder() .codeVersion(rollbarConfigurationProperties.getCodeVersion()) .branch(rollbarConfigurationProperties.getBranch()) .host(environment.getProperty("spring.application.name")) .root("com.gitlab.johnjvester.rollbar") .build(); } }
Далее мы добавляем конфигурацию перекладины:
@Slf4j @RequiredArgsConstructor @ComponentScan({ "com.gitlab.johnjvester.rollbar", "com.rollbar.spring", }) @Component public class RollbarConfig { private final RollbarConfigurationProperties rollbarConfigurationProperties; private final RollbarServerProvider rollbarServerProvider; @Bean public Rollbar rollbar() { log.debug("rollbarConfigurationProperties={}", rollbarConfigurationProperties); return new Rollbar(RollbarSpringConfigBuilder .withAccessToken(rollbarConfigurationProperties.getAccessToken()) .environment(rollbarConfigurationProperties.getEnvironment()) .server(rollbarServerProvider) .build()); } }
Наконец, я хотел создать обработчик исключений глобального контроллера, чтобы отчитываться перед Rollbar и сохранять все СУХИМ (не повторяйтесь).:
@Slf4j @RequiredArgsConstructor @ControllerAdvice public class GlobalControllerExceptionHandler { private final Rollbar rollbar; @ExceptionHandler(value = Exception.class) public void handleExceptions(HttpServletRequest request, HttpServletResponse response, RollbarException e) { e.getRollbarExceptionData().setIpAddress(request.getRemoteAddr()); e.getRollbarExceptionData().setUri(request.getRequestURI()); e.getRollbarExceptionData().setRequestType(request.getMethod()); log.error("e.getMessage()={} [{}]", e.getMessage(), e.getRollbarExceptionData()); rollbar.error(e.getMessage(), e.getRollbarExceptionData().getRollbarMap()); response.setStatus(HttpStatus.BAD_REQUEST.value()); } }
Использование Перекладины С Пружинным Башмаком
Теперь давайте посмотрим, как работает Rollbar. Для этого очень простого примера я хотел использовать Rollbar для захвата следующих действий:
- Когда запустилась служба весенней загрузки (информация).
- Когда базовый API-интерфейс был вызван хотя бы с одним результатом (информацией).
- Когда произошло принудительное исключение (ошибка).
Использование Генератора Случайных Чисел С перекладиной
Чтобы имитировать более одного пользователя, я создал статическую утилиту Rollbar Utils Я создал 17 разных пользователей и использовал фреймворк Random Generator , чтобы выбрать одного пользователя случайным образом. Панель прокрутки позволяет отправлять карту пользовательской информации при каждом вызове API в службу Rollbar, которая доступна на панели инструментов Rollbar.
Тот же подход был использован для возврата случайного сообщения об ошибке для концепции неправильного запроса, которую я хотел доказать в этой статье.
Обработка исключений и привязка к GitLab
После очередного коммита в репозиторий на GitLab я хотел выполнить несколько дополнительных шагов настройки в приложении Rollbar. В разделе настроек проекта “springboot-example” был открыт раздел Интеграции | Управления версиями и настроен, как показано ниже:
Затем я настроил раздел Интеграции | Уведомления, как показано ниже:
Благодаря этим изменениям Roll bar может не только ссылаться на систему управления версиями в случае непредвиденной ситуации, но и имеет возможность связать это событие с существующим тикетом в GitLab (в качестве примера) или создать новый тикет непосредственно с панели инструментов Rollbar.
Получив последний SHA из GitLab, я обновил настройки запуска/отладки для своего приложения Spring Boot и перезапустил его. Это действие, которое обычно является частью процесса CI/CD, позволяет панели отката узнать хэш фиксации, используемый службой.
Использование @PostConstruct С Rollbar
При наличии всего необходимого создать информационное событие Rollbar довольно просто:
@RequiredArgsConstructor @Slf4j @Component public class RollbarEvents { private final Environment environment; private final RollbarConfigurationProperties rollbarConfigurationProperties; private final Rollbar rollbar; @PostConstruct public void postConstruct() { rollbar.info(String.format("Started %s on port #%s using Rollbar accessToken=%s (%s)" environment.getProperty("spring.application.name"), environment.getProperty("server.port"), SecurityUtils.maskCredentialsRevealPrefix(rollbarConfigurationProperties.getAccessToken(), 5, '*'), rollbarConfigurationProperties.getEnvironment())); } }
Каждый раз, когда запускается служба Spring Boot, фиксируется следующее событие, которое можно просмотреть в режиме реального времени на панели управления Rollbar:
На скриншоте выше обратите внимание, что есть возможность создать проблему GitLab. Это позволит вставить новый тикет в раздел проблем GitLab, который также мог быть настроен для такой системы, как JIRA. Нажатие стрелки вниз на этой кнопке также позволяет связать эту ошибку с существующей заявкой.
Вызываем//URI
В сервисе Musician объект Rollbar может быть введен через Spring framework для отправки как информационных, так и предупреждающих сообщений в Rollbar:
public ListgetAllMusicians() { List musicians = musicianRepository.findAll(); if (CollectionUtils.isNotEmpty(musicians)) { rollbar.info(String.format("Found %s musicians", musicians.size()), RollbarUtils.createRollbarExceptionData().getRollbarMap()); } else { rollbar.warning("Could not locate any musicians", RollbarUtils.createRollbarExceptionData().getRollbarMap()); } return musicians; }
Теперь давайте посмотрим на панель управления Roll bar, где мы видим следующие события:
Обратите внимание, что мы видим много полезной информации об ошибке:
- детали запроса
- адрес электронной почты пользователя ” tom.doe@example.com “
- значение идентификатора пользователя, равное шести
- количество предыдущих случаев этой ошибки
- действия рабочего процесса, такие как создание или назначение/сортировка проблемы
- версия кода, в которой произошла эта ошибка
- история ошибок такого типа
Обработка общего исключения
Одной из самых сложных проблем для этой статьи было найти способ ввести код, который привел бы к исключению. Во многом это связано с многолетним опытом предотвращения исключений, дополненным клиентом IntelliJ IDEA, который всегда стремится предотвратить попадание исключений в кодовую базу. Попытавшись придумать что-нибудь захватывающее, я решил прибегнуть к простому исключению, как показано ниже:
public Musician getIndexOutOfBounds() { ListmusicianList = new ArrayList<>(); return musicianList.get(0); }
В приведенном выше примере мы создаем новый список, и код пытается вернуть первый элемент из списка. Это должно привести к исключению IndexOutOfBoundsException. Контроллер, вызывающий этот код, показан ниже:
@GetMapping("/indexOutOfBounds") public ResponseEntitygetIndexOutOfBounds() { return new ResponseEntity<>(musicianService.getIndexOutOfBounds(), HttpStatus.ACCEPTED); }
При вызове URI/IndexOutOfBounds на панель управления Rollbar поступает следующее событие:
Поскольку я уже связал эту проблему с проблемами GitLab, я могу просмотреть ее непосредственно с панели управления Rollbar. Кроме того, обратите внимание, что трек стека включает ссылки, которые ведут меня прямо к сервису Musician.java:41. При нажатии на эту ссылку открывается новое окно непосредственно в проект GitLab:
При использовании вкладки “Вхождения” в столбце code_version теперь есть ссылки:
Щелчок по ссылкам также приведет меня непосредственно к самому коммиту:
При возникновении непредвиденного исключения панель мониторинга панели отката можно использовать для отслеживания событий в реальном времени и даже для просмотра строки исходного и текущего хэша фиксации, который выполняется на сервере. Это было бы полезно не только в процессе разработки, но и в дальнейшем на этапе развертывания в test/stage и, конечно же, в prod.
Вывод
После использования Rollbar я чувствую, что мой подход к мониторингу приложений нуждался в новом подходе. По сути, я использовал один и тот же подход в течение более чем двух десятилетий разработки приложений, и результаты этого подхода всегда требовали больше времени, чем я надеялся, чтобы добраться до неожиданного источника Панель прокрутки обеспечивает новый способ мониторинга приложений, который является не только правильным, но и лучшим способом.
С внедрением Rollbar возникло несколько проблем. Краткий список будет включать следующие пункты:
- Я чувствовал, что использование поставщика сервера Roll bar не должно требоваться для предоставления ожидаемых данных в Rollbar.
- Первоначально я хотел использовать метод @PreDestroy, чтобы предупредить Rollbar о завершении работы службы. Однако, когда срабатывает событие жизненного цикла @Predestroy, слишком поздно обращаться в службу Roll bar.
- Что должно быть включено в экраны конфигурации, на самом деле не совсем ясно, и концепция server_root была тем, что я изо всех сил пытался понять. Тем не менее, я чувствую, что в этой статье есть все необходимое, чтобы заставить Rollbar полностью работать с репозиторием GitLab.
В каждом случае я смог быстро решить свои проблемы, воспользовавшись помощью команды инженеров Rollbar, особенно Виджая!
С точки зрения ценообразования разработчики хобби могут бесплатно использовать пакет Essentials с лимитом в 5000 мероприятий в месяц. Платный план Essentials начинается с 1 доллара в день для 6000 мероприятий и расширяется до 599 долларов в месяц для 4 миллионов мероприятий. Расширенный план ориентирован на клиентов, которым требуется расширенная панель управления учетными записями, канал для нескольких проектов и управление версиями в диапазоне от 99 до 999 долларов в месяц за 4 миллиона транзакций. Во всех случаях составление годовых планов предполагает довольно внушительную скидку.
Rollbar предоставляет решение в режиме реального времени, оснащенное аналитическими инструментами, которые обеспечивают лучшее понимание работы приложения, чем то, что я испытал за свою карьеру. На самом деле, я планирую углубиться в аналитику в будущей статье, а также подключить клиент на основе JavaScript для доступа к моей службе Spring Boot.
Вы можете клонировать, разветвлять или загружать проект, который я создал для этой статьи здесь .
Оригинал: “https://dev.to/mbogan/you-can-log-better-how-to-implement-real-time-application-monitoring-30jn”