Рубрики
Без рубрики

Вы можете лучше вести журнал – Как реализовать мониторинг приложений в режиме реального времени

Просто потому, что мы делаем что-то одним способом, не всегда означает, что это правильный путь… или даже лучший ва… Помечено как java, учебное пособие, тестирование, webdev.

Просто потому, что мы делаем что-то одним способом, не всегда означает, что это правильный путь… или даже лучший способ.

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

Проблема с этим подходом заключается в том, что весь процесс кажется немного неправильным. Происходит что-то неожиданное, поэтому мы изо всех сил пытаемся найти первопричину, используя какое-либо решение для ведения журнала, отслеживая сообщения журнала и трассировку стека в обратном направлении, пытаясь определить, где реальность отличалась от ожиданий. Это может потребовать много усилий и времени — и все это ценой нетерпеливых клиентов (как внутренних, так и внешних), которые задаются вопросом, почему что-то не работает должным образом.

Когда я начал читать о Перекладина , я начал задаваться вопросом, не были ли мои годы, проведенные в одном направлении, в конце концов, неправильными. Поэтому я решил попробовать 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 List getAllMusicians() {
   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() {
   List musicianList = new ArrayList<>();
   return musicianList.get(0);
}

В приведенном выше примере мы создаем новый список, и код пытается вернуть первый элемент из списка. Это должно привести к исключению IndexOutOfBoundsException. Контроллер, вызывающий этот код, показан ниже:

@GetMapping("/indexOutOfBounds")
public ResponseEntity getIndexOutOfBounds() {
   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”