JDK | 17+ |
---|---|
Maven | 3.2.5+ |
Spring boot | 3.0.0+ |
Текущая версия проекта | 0.8.0 |
---|
Скопируйте этот проект с помощью команды mvn clean install
в локальный репозиторий. (Версия 0.8.0 уже добавлена в центральный репозиторий Maven, можно напрямую добавить зависимость).
Добавьте следующую зависимость в файл pom.xml
вашего проекта:
<dependency>
<groupId>top.codef</groupId>
<artifactId>prometheus-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
application.properties
или application.yml
: (более подробное описание настроек приведено в следующем разделе)prometheus:
enabled: true
exceptionnotice:
enabled: true
included-trace-package: com.havefun
notice:
dingding:
user1:
access-token: 在webhook中的参数:accessToken
sign-secret: 钉钉的签名秘钥
enable-signature-check: true
phone-num:
- 通知人的手机号
default-name: user1
Что касается конфигурации WeChat, пожалуйста, перейдите по ссылке: WeChat Robot, здесь следует особо отметить, что WeChat провёл обновление своего робота WeChat в октябре 2019 года (примерно), это обновление сделало безопасность обязательной опцией, ранее настроенные роботы WeChat без настроенной безопасности не были затронуты.
После завершения настройки вы можете написать демонстрационный тест. Сначала создайте первый компонент:
@Component
@ExceptionListener
public class SomeComponent {
public String haveException() {
throw new NullPointerException("Это исключение нулевого указателя");
}
}
@SpringBootTest
class PrometheusDemoApplicationTests {
@Autowired
private SomeComponent someComponent;
@Test
void contextLoads() {
someComponent.haveException();
}
}
После запуска модульного теста, если конфигурация WeChat верна, в вашем WeChat появится сообщение, подобное следующему:
Если в настроенном вами WeChat появляется сообщение, похожее на это, поздравляем, вам удалось создать уведомление об исключении.
Эта структура основана на автоматической конфигурации spring boot starter для создания автоматизированной структуры уведомлений об исключениях. Весь бизнес-процесс выглядит следующим образом:
Конфигурация этой структуры в основном состоит из четырёх частей:
prometheus:
enabled: true
project-enviroment: develop
project-name: demo
default-name: user1
Подробное описание следующее:
Имя | Тип параметра | Описание | Обязательная настройка |
---|---|---|---|
Включено | Логическое значение | Используется для включения конфигурации проекта, является главным переключателем | Да |
Среда проекта | Перечисление | Среда проекта (перечисление), по умолчанию — разработка | Нет |
Название проекта | Строка | Обычно игнорируется, заменяется на spring.application.name | Нет |
По умолчанию имя | Строка | Указывает получателя уведомления по умолчанию | Да |
project-enviroment
в основном используется для различения проблем с окружающей средой в онлайн-среде проекта, независимо от того, передаётся ли традиционная конфигурация свойств проекта или централизованная конфигурация микросервисного центра конфигурации, необходимо различать проблемы с окружающей средой проекта, поэтому для удобства сравнения была добавлена эта конфигурация.
Среда проекта делится на следующие пять типов:
Наиболее важным из уведомлений является exceptionnotice.listen-type, эта конфигурация определяет способ мониторинга проекта. В настоящее время существует два способа мониторинга: обычный мониторинг (common) и веб-мониторинг (web). Эти два метода мониторинга имеют свои преимущества, обычный мониторинг в основном использует метод АОП для мониторинга методов или классов с аннотациями, которые можно добавить к любому классу и методу. Веб-мониторинг может отслеживать только контроллер, но информация об исключениях более полная, включая не только всю информацию обычного мониторинга (без параметров), но также включает информацию о пути запроса (path), параметрах запроса (param), теле запроса (body) и заголовке тела запроса (header). Например:
@RestController
@RequestMapping("/havefun")
@ExceptionListener
public class HaveFunController {
@PostMapping("/fun/{pathVal}")
public String havefun(@PathVariable String pathVal, @RequestParam String queryParam,
@RequestBody String bodyParam) {
throw new NullPointerException("Запрос пустого указателя исключения");
}
}
Конкретный эффект:
prometheus.exceptionnotice.exclude-exceptions=java.lang.IllegalArgumentException,com.yourpackage.YourLogicException
Как правило, когда в методе возникает исключение, это означает, что каждый раз, когда вызывается один и тот же метод, будет возникать одно и то же исключение. Если оставить его без внимания, уведомления об исключениях в виде сообщений и уведомлений по электронной почте будут повторяться для одного и того же исключения. Чтобы ограничить частоту отправки, по умолчанию, если в каком-либо методе возникает исключение, которое требует уведомления, такое уведомление будет отправляться только один раз в день. Конечно, это также может привести к проблемам, например, если сообщение или электронное письмо не получено, вполне вероятно, что это уведомление будет пропущено, поэтому была создана стратегия уведомлений.
Стратегия уведомлений соответствует классу конфигурации ExceptionNoticeFrequencyStrategy.
В настоящее время есть два типа стратегий уведомлений:
Соответствующая конфигурация:
exceptionnotice.strategy.frequency-type=timeout/showcount
Вышеупомянутое говорит обо всех конфигурациях, глобальных конфигурациях и конфигурациях исключений. После получения исключения проектом и после упаковки сообщения необходимо выполнить уведомление.
Всего существует три типа уведомлений:
Ниже приведены все конфигурации уведомлений:
prometheus:
notice:
enable-async: true
dingding-text-type: text
email-text-type: text
dingding:
user1:
access-token: 钉钉webhook中的token参数
enable-signature-check: true
phone-num:
- 通知人手机号
sign-secret: 签名秘钥
email:
user2:
to: 发给谁
bcc: 秘密抄送给谁
cc: 抄送给谁
Название | Тип параметра | Описание | Необходимая конфигурация |
---|---|---|---|
enable-async | boolean | Следует ли включать асинхронное уведомление, по умолчанию не включено | Нет |
dingding-text-type | enum | Тип текста уведомления в чате: текст/markdown, по умолчанию текст | Нет |
email-text-type | enum | Формат текста уведомления по электронной почте, в настоящее время только текст | Нет |
dingding | map | Информация о получателе уведомления в чате, ключ представляет идентификатор получателя, значение — конфигурация, связанная с чатом | Да |
map | Получатель уведомления по электронной почте, ключ обозначает идентификатор получателя, а значение — конфигурацию электронной почты | Нет | |
Конфигурация, связанная с чатом | |||
access-token | string | Значение токена в webhook чата | Да |
enable-signature-check | boolean | Следует ли включить проверку подписи, по умолчанию да | Нет |
phone-num | string | Номер телефона получателя уведомления | Да |
sign-secret | string | Секретный ключ подписи, который должен быть заполнен, когда enable-signature-check имеет значение true | Да |
Соответствующая конфигурация | |||
to | string | Адрес электронной почты получателя уведомления | Да |
cc | string | Копия адреса электронной почты получателя | Нет |
bcc | string | Скрытый адрес электронной почты получателя | Нет |
Это все конфигурации уведомлений, здесь следует отметить, что конфигурации уведомлений в чате и уведомления по электронной почте могут соответствовать одному и тому же человеку, указывая, что при необходимости уведомления сообщение будет одновременно отправляться этому человеку через чат и электронную почту.
Когда включена проверка подписи, необходимо установить флажок «подписать» в настройках безопасности машины чата:
Фреймворк сохраняет все необходимые интерфейсы для уведомлений, пользователи могут определять свои собственные уведомления, подробности см. ниже, сначала посмотрите вниз, позже будет введение.
Вы можете посмотреть следующую конфигурацию:
prometheus:
enabled: true
default-name: user1
exceptionnotice:
enabled: true
included-trace-package: Ваш собственный путь пакета
listen-type: web
include-header-name:
- Content-Type
notice:
dingding:
user1:
access-token:
sign-secret: Ваш
phone-num: Номер мобильного телефона
dingding-text-type: markdown
В этой конфигурации используется режим веб, и заголовок фильтруется, и при возникновении исключения уведомление отправляется через чат, и содержимое уведомления отображается в формате markdown:
По сравнению со строковым соединением структура markdown относительно сильнее. Аннотация @ExceptionListener
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface ExceptionListener {
/**
* 出错了找谁???
*
* @return
*/
String value() default "";
}
Аннотация @ExceptionListener
— это единственная аннотация в рамках, которая служит для конфигурации. Необходимо обратить внимание на то, что все классы и методы, которые требуют уведомления об исключениях, должны быть снабжены этой аннотацией.
В зависимости от типа конфигурации exceptionnotice.listen-type
расположение аннотации будет отличаться:
exceptionnotice.listen-type=common
, то @ExceptionListener
можно добавить к любому классу или методу.exceptionnotice.listen-type=web
, то @ExceptionListener
может быть добавлен только к тем классам или методам, которые имеют аннотацию @Controller
или @RestController
. Также метод должен иметь аннотацию @RequestMapping
.Параметр аннотации представляет собой идентификатор получателя уведомления в конфигурациях exceptionnotice.listen-type
. Это может быть ключ в конфигурации «dingding» или «email».
Конфигурация
На основе всех описанных конфигураций в систему были добавлены дополнительные расширения конфигурации, включающие несколько модулей:
Пользовательский компонент отправки сообщений реализуется через интерфейс INoticeSendComponent
. Этот интерфейс отвечает за отправку сообщений:
public interface INoticeSendComponent extends Unique {
void send(PromethuesNotice exceptionNotice, NoticeTextResolver noticeTextResolver);
}
Интерфейс Unique
используется для идентификации каждого компонента отправки сообщений. Например, компонент отправки сообщений «DingDingNoticeSendComponent» имеет имя «dingding», а компонент «EmailNoticeSendComponent» — «email». Это позволяет пользователям заменять стандартные компоненты отправки сообщений (по умолчанию — «dingding» и «email») своими собственными. Для этого необходимо реализовать интерфейс NoticeSendComponentCustomer
:
public interface NoticeSendComponentCustomer extends Ordered {
void custom(NoticeSendComponentRegister register);
}
NoticeSendComponentRegister
используется для регистрации компонентов отправки сообщений и их владельцев. Это позволяет находить соответствующий компонент отправки сообщений через параметр аннотации @ExceptionListener
.
Кроме компонента отправки сообщений, важным модулем в системе является обработка текстовых форматов. В системе информация собирается и упаковывается в объект PromethuesNotice
. Обработка этих объектов и форматирование текста выполняются через интерфейс NoticeTextResolver
:
public interface NoticeTextResolver {
public String resolve(PromethuesNotice notice);
public boolean support(Class<? extends PromethuesNotice> clazz, INoticeSendComponent sendComponent);
}
В конфигурации dingding-text-type
есть соответствующие резолверы, такие как ExceptionNoticeMarkdownMessageResolver
. Эти резолверы также могут быть настроены программно через реализацию интерфейса NoticeTextResolverCustomer
.
public interface NoticeTextResolverCustomer extends Ordered{
public void custom(NoticeTextResolverProvider resolverProvider);
}
Для отправки сообщений с помощью OpenFeign в системе используется интерфейс DingdingHttpClient
:
@FunctionalInterface
public interface DingdingHttpClient {
DingDingResult doSend(DingDingNotice notice, DingDingNoticeProperty dingDingNoticeProperty);
}
Мониторинг микросервисов
Поскольку автор использует бесплатную версию Consul, мониторинг микросервисов не так эффективен. Однако, благодаря наличию интерфейсов для отправки уведомлений, появилась возможность интегрировать мониторинг микросервисов в эту систему. Это позволило сделать компоненты более согласованными.
Как это работает
При запуске сервиса мониторинга микросервисов выполняется инициализация, в ходе которой обнаруживаются все микросервисы в центре регистрации и определяются три типа проблем:
Информация о проблемах сервисов собирается и сохраняется с помощью ServiceNoticeRepository
. Затем эти данные передаются соответствующим компонентам отправки уведомлений через ServiceNoticeTask
.
Конфигурации
Все настройки мониторинга микросервисов хранятся в файле YAML. Ниже приведён пример конфигурации:
prometheus:
enabled: true
project-enviroment: develop
dingding:
enabled: true
phone-num: 15129072758
access-token:
sign-secret:
enable-signature-check: true
service-monitor:
auto-discovery: true
enabled: true
service-check-notice-interval: 3m
service-exist-check-interval: 3m
monitor-services:
have-fun:
service-count: 3
health-check-url: /actuator/health
health-check-headers:
test:
- aaa
check-interval: 2m
enabled: true
Здесь представлены следующие параметры:
Наименование | Тип параметра | Описание | Обязательный |
---|---|---|---|
enabled |
boolean | Включает мониторинг микросервисов. По умолчанию отключён. | Да |
auto-discovery |
boolean | Автоматическое обнаружение сервисов. По умолчанию включено. | Нет |
service-check-notice-interval |
duration | Интервал времени для уведомлений о состоянии сервисов. По умолчанию 3 минуты. | Нет |
service-exist-check-interval |
duration | Интервал времени для проверки существования сервисов. По умолчанию 3 минуты. | Нет |
ServiceCheck | |||
service-count | number | Количество сервисов, по умолчанию 1 | Нет |
health-check-url | string | Адрес проверки работоспособности, по умолчанию — адрес проверки работоспособности actuator | Нет |
health-check-headers | map | Информация о заголовках для проверки работоспособности | Нет |
check-interval | duration | Интервал проверки работоспособности, по умолчанию две минуты | Нет |
Это все настройки мониторинга сервисов.
Теоретически можно использовать любой реестр служб, но я работал только с Consul. Если вам нужно протестировать другие реестры, свяжитесь со мной. Чтобы добавить сервис в кластер микросервисов, нужен сервис, который будет выполнять мониторинг и управление микросервисами. После добавления сервиса через auto-discovery будут обнаружены все существующие сервисы кластера и получено их состояние работоспособности. В этот момент система будет считать кластер микросервисов завершённым. Если позже появятся новые сервисы, они будут автоматически добавлены в список сервисов для мониторинга.
Требования к уведомлениям микросервисов всё ещё находятся в разработке. Если у вас есть вопросы или проблемы, вы можете создать issue.
Что касается уведомлений, например, в WeChat:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )