1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Goslee-simple-prometheus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

🛠️simple-prometheus

Легковесный инструмент для мониторинга ошибок (просто, еще проще)

🍬Сделай это просто, сделай это просто.
star



📚 Обзор

Этот инструмент для мониторинга ошибок предназначен для небольших проектов. Он создан для удобства разработчиков в быстром определении проблем, снижении затрат на коммуникацию и повышении производительности разработки. Основные идеи — легковесность, быстрое использование и готовое к применению решение. Это позволяет разработчикам или лицам, интересующимся подобными вопросами, минимизировать затраты на создание крупномасштабных промежуточных компонентов. Если требуется создание крупномасштабных промежуточных компонентов и услуг, это может привести к потерям времени, энергии и финансовых затрат. Этот инструмент создан для того, чтобы помочь малым предприятиям минимизировать указанные выше затраты.### 🧬Системные требования

версия JDK версия Spring Cloud Spring Boot

📐Текущая версия

текущая версия проекта

🍊Реализация#### 1. Реализация мониторинга на основе AOP Spring, отправка сообщений с использованием события для публикации и подписки

Для одиночной машины это обеспечивает хорошую производительность. Для распределенной среды рекомендуется заменить событие на MQ1. [x] Реализация обертки аспекта для перехвата исключений, создание нового типа исключения主要用于异常推送监控, правила перехвата аспектом и логирования одинаковы и включают в себя [@RequestMapping, @GetMapping, @PostMapping], метод перехвата — обертка, не влияет на использование исходной функциональности.

  1. Если это системное исключение, не обработанное явно (Exception), отправить в группу разработчиков.
  2. Если это обработанное исключение для мониторинга (SPrometheusException), отправить в группу специалистов по соответствующему бизнесу.
  3. Если это необработанное исключение для мониторинга, не требуется никаких действий, рассматривать как обычное бизнес-исключение.
  4. Если не требуется выбрасывать исключение, а только отправить сообщение в определенном месте, можно использовать предоставленные инструменты. #### 2. Дизайн поиска мест возникновения ошибок в коде Основная часть этой функции — это исключительная информация, поэтому важно знать, как получить нужную информацию об исключениях и стеке вызовов.Важно помнить, что, помимо описания исключения, ключевым является стек вызовов, так как большая часть информации в нем не требуется. Нам нужно только место возникновения ошибки в бизнес-коде. Поскольку стек вызовов работает по принципу "последним пришел — первым ушел", то место, где было выброшено исключение, находится на вершине стека. Таким образом, первое отфильтрованное сообщение стека вызовов — это место возникновения бизнес-ошибки.### 🐞 Содержание уведомлений об исключениях Название сервиса, адрес запроса, описание интерфейса, информация об исключении, трассировка исключения, код ошибки, локализация исключения, идентификатор транзакции, время возникновения исключения, время выполнения интерфейса, IP-адрес запроса, параметры запроса

👉 Быстрый старт

  • В модуле, где требуется использование, добавьте зависимость pom
<dependency>
    <groupId>io.gitee.goslee</groupId>
    <artifactId>spring-boot-starter-simple-prometheus</artifactId>
    <version>1.0.1</version>
</dependency>
  • Если при старте возникают ошибки, попробуйте добавить следующую зависимость (в будущем я исправлю это)
<dependency>
    <groupId>net.jodah</groupId>
    <artifactId>expiringmap</artifactId>
    <version>0.5.8</version>
    <optional>true</optional>
</dependency>
  • В файле application.yml выполните следующие настройки```yaml

Мониторинг

sprometheus: default: "feishu" feishu: # Включить уведомления об исключениях enabled: true # Необходимые пути для трассировки includedTracePackage: - "com.gosling" - "com.mysql" - "java.sql.SQLException" - "java.net" # Уведомления в группу Feishu business: # Группа бизнес-уведомлений Feishu - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" code: ",200000,200001,200002,200003," developer: # Группа разработчиков Feishu - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" code: ",500,"

```yaml
# Мониторинг
sprometheus:
  default: "dingdung"
  dingdung:
    # Включение или отключение аномальных уведомлений
    enabled: true
    # Путь к пакетам трейса, которые должны быть включены
    includedTracePackage:
      - "com.gosling"
      - "com.mysql"
      - "java.sql.SQLException"
      - "java.net"
    # Уведомления в группе Дингдунг
    business:
      # Группа уведомлений для бизнеса 1 Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",200000,200001,200002,200003,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
    developer:
      # Группа уведомлений для разработчиков Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",500,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
```- Конфигурационные инструкции
```yaml
# Мониторинг
sprometheus:
  default: "feishu"
  feishu:
    # Включить уведомления об исключениях
    enabled: true
    # Необходимые пути для трассировки
    includedTracePackage:
      - "com.gosling"
      - "com.mysql"
      - "java.sql.SQLException"
      - "java.net"
    # Уведомления в группу Feishu
    business:
      # Группа бизнес-уведомлений Feishu
      - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
        code: ",200000,200001,200002,200003,"
    developer:
      # Группа разработчиков Feishu
      - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
        code: ",500,"
```- Конфигурационные инструкции
```yaml
# Мониторинг
sprometheus:
  default: "dingdung"
  dingdung:
    # Включение или отключение аномальных уведомлений
    enabled: true
    # Путь к пакетам трейса, которые должны быть включены
    includedTracePackage:
      - "com.gosling"
      - "com.mysql"
      - "java.sql.SQLException"
      - "java.net"
    # Уведомления в группе Дингдунг
    business:
      # Группа уведомлений для бизнеса 1 Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",200000,200001,200002,200003,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
    developer:
      # Группа уведомлений для разработчиков Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",500,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
```- Конфигурационные инструкции
```yaml
# Мониторинг
sprometheus:
  default: "feishu"
  feishu:
    # Включить уведомления об исключениях
    enabled: true
    # Необходимые пути для трассировки
    includedTracePackage:
      - "com.gosling"
      - "com.mysql"
      - "java.sql.SQLException"
      - "java.net"
    # Уведомления в группу Feishu
    business:
      # Группа бизнес-уведомлений Feishu
      - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
        code: ",200000,200001,200002,200003,"
    developer:
      # Группа разработчиков Feishu
      - url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
        code: ",500,"
```- Конфигурационные инструкции
```yaml
# Мониторинг
sprometheus:
  default: "dingdung"
  dingdung:
    # Включение или отключение аномальных уведомлений
    enabled: true
    # Путь к пакетам трейса, которые должны быть включены
    includedTracePackage:
      - "com.gosling"
      - "com.mysql"
      - "java.sql.SQLException"
      - "java.net"
    # Уведомления в группе Дингдунг
    business:
      # Группа уведомлений для бизнеса 1 Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",200000,200001,200002,200003,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
    developer:
      # Группа уведомлений для разработчиков Дингдунг
      - url: "https://oapi.dingtalk.com/robot/send?access_token=3c36"
        code: ",500,"
        secret: "SEC9a6b2202a0b92847fd7098630d20b4"
```- Конфигурационные инструкции| Название                     | Тип параметра    | Описание                          | Обязательное |
|------------------------|---------|-----------------------------|------|
| default                | string  | Указание конфигурации по умолчанию для отправки                 | Да    |
| enabled                | boolean | Включение уведомлений об ошибках                    | Да    |
| included_trace_package | string  | Путь к пакету trace, который нужно включить               | Да    |
| url                    | string  | URL для бизнес-сообщений и сообщений разработчиков (webhook для Feishu или других) | Да    |
| code                   | string  | Бизнес-код                         | Да    |
| secret                 | string  | Секретный ключ подписи для DingTalk                         | Нет-обязательно для DingTalk    |

### 🍺Использование на уровне кода (несколько способов)

#### Способ 1:

```java
// Вставьте этот код в месте ошибки
SPrometheusUtil.insert("Тест ошибки", SPrometheusTitleEnum.OTHER);

Способ 2:

// Вставьте этот код в месте ошибки
SPrometheusUtil.insert("Тест ошибки", SPrometheusTitleEnum.OTHER, JSONObject.toJSONString(req));

Способ 3:

// Вставьте этот код в месте ошибки
Exp exp = new Exp();
exp.setMsg("test...уже получил событие");
exp.setUri("/admin/test1");
exp.setSendChannel(SendChannel.FEISHU);
exp.setAtAll(SConstants.YES);
exp.setReqData(JSONObject.toJSONString(req));
exp.setTitleEnum(SPrometheusTitleEnum.OTHER);
SPrometheusUtil.insert(exp);
```#### Способ 4:
```java
Exp exp = new Exp();
//...
exp.setMsg(originMsg);
// Если вы хотите сохранить исходный формат вашего сообщения без изменений
// Например, если вам нужно отправить таблицу Feishu, сообщение, написанное для документа Feishu или любой другой формат, который вы хотите сохранить, вы можете использовать этот способ
SPrometheusUtil.insertOrg(exp);
```> Описание класса Exp
```java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Exp {
    @Msg(msg = "Классификация мониторинга")
    private SPrometheusTitleEnum titleEnum = SPrometheusTitleEnum.OTHER;
    @Msg(msg = "Адрес интерфейса")
    private String uri;
    @Msg(msg = "Сообщение об ошибке")
    private String msg = SConstants.DEFAULT_MSG;
    @Msg(msg = "Параметры запроса")
    private String reqData;
    @Msg(msg = "Уведомление всем @all")
    private Integer atAll = SConstants.NO;
    @Msg(msg = "Медиа для отправки 1:Feishu (по умолчанию) 2:DingTalk 3:Email")
    private String sendChannel = SendChannel.FEISHU;
}

Пятый способ: ручное выбрасывание исключения SPrometheusException

throw new SPrometheusException(SPrometheusTitleEnum.OTHER, "Пользовательская информация отсутствует");

Шестой способ: аннотация слушателя исключений @SPrometheus

@SPrometheus(title = SPrometheusTitleEnum.OTHER, uri = "admin/test1", scene = Scene.BUSINESS)
public void test(String id) {
    if (StrUtil.isBlank(id)) {
        System.out.println("Основной ключ ID отсутствует");
        throw new NullPointerException("Основной ключ ID отсутствует");
    }
}

Предсказуемые исключения

Например: исключения валидации параметров, предопределенные исключения в бизнес-процессах и т.д. Эти исключения не являются критическими, некоторые из них требуют внимания со стороны сотрудников бизнеса, но в большинстве случаев сотрудники бизнеса не должны их учитывать, а разработчики и подавно. Поэтому такие исключения требуют контроля частоты уведомлений и их охвата, чтобы избежать излишнего количества сообщений в группе, что может привести к пропуску важных уведомлений.#### Непредсказуемые исключения Неизвестные разработчикам исключения не требуют предварительного определения и позиционирования, например: исключение NullPointerException, ошибка преобразования типов, исключение выполнения SQL, таймаут и т.д. Если такие исключения возникают, они требуют немедленной обработки, их уровень критичности является самым высоким P0 уровнем, и такие исключения будут отправлены непосредственно в группу разработчиков.

📦Практический эффект

Когда в системе возникает бизнес-исключение, то появляется следующее уведомление

Создание тестового исключения

@PostMapping("/test/test")
@Operation(summary = "APP[Система управления рисками обратная связь инициирования платежа]")
public void prepayment(@Valid @RequestBody LoanOrderQueryVO vo) {
    if (1 == 1) {
        throw new PrometheusException("NullPointerException");
    }
}

Получение уведомления в Feishu```textmate Имя сервиса: gosling-server Адрес запроса: /app-api/test/test Описание интерфейса: иное|системное исключение Информация об исключении: отсутствует параметр запроса: id Трассировка исключения: com.gosling.framework.web.core.handler.GlobalExceptionHandler.missingServletRequestParameterExceptionHandler(GlobalExceptionHandler.java:110) Код ошибки: 100000 Локализация исключения: com.gosling.framework.web.core.handler.GlobalExceptionHandler.missingServletRequestParameterExceptionHandler(GlobalExceptionHandler.java:110) ID цепи: 94bb8b920be3401e9e0474224c30939e Время возникновения исключения: 2024-09-06 11:05:15 Время выполнения интерфейса: 1.0091 сек IP запроса: 192.168.1.1 active: test Параметры запроса: {"id":""}

Если вы хотите получить более полное уведомление, вы можете выбрать  
При глобальном перехвате исключений, аналогично отсутствию параметров запроса или некорректному методу запроса, исключения не попадают в аспектный мониторинг, поэтому требуется ручное настройка мониторинга ошибок (в будущем это будет автоматизировано)
```java
@ExceptionHandler(value = MissingServletRequestParameterException.class)
public BaseResult<?> missingServletRequestParameterExceptionHandler(HttpServletRequest request, MissingServletRequestParameterException ex) {
    log.error("Обработка глобальных ошибок: ошибка передачи параметров", ex);
    String message = String.format("Отсутствие параметров запроса: %s", ex.getParameterName());
    Exp exp = new Exp();
    exp.setUri(request.getRequestURI());
    exp.setMsg(message);
    exp.setReqData(getParams(request));
    exp.setTitleEnum(PrometheusTitleEnum.OTHER);
    PrometheusUtil.insert(repayReq);
    return BaseResult.error(message);
}
```### 🍐Структура фреймворка

![img.png](src/main/resources/static/img_1.png)

### 📖Планируемые задачи (TODO pmo)
- Улучшение уведомлений по электронной почте
- Улучшение уведомлений в DingTalk (завершено)
- Улучшение уведомлений в QQ
- Улучшение уведомлений в WeChat
- Улучшение мониторинга NACOS
- Улучшение уведомлений для конкретных пользователей

### ⭐Star simple-prometheus⭐

### ⚠Предоставление обратной связи по ошибкам или предложениям
1. Отправка issues на gitee

2. Сканируйте QR-код ниже, чтобы подписаться на официальный аккаунт, отправьте сообщение, и я немедленно отвечу
![img.png](src/main/resources/static/img.png)

Спасибо за вашу ценный звездочку O(∩_∩)O~~

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Решение: Легковесное мониторинговое оповещение (открытый проект) Развернуть Свернуть
Java
MulanPSL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/Goslee-simple-prometheus.git
git@api.gitlife.ru:oschina-mirror/Goslee-simple-prometheus.git
oschina-mirror
Goslee-simple-prometheus
Goslee-simple-prometheus
master