# 数据收集器

负责收集应用中的数据，经过筛选之后存储到`ElasticSearch` 中，主要核心功能是为了弥补CAT中的日志搜索能力较弱的短板，另外还会对CAT的拓展做增强，比如监控告警等等，更加满足实际业务的需要。

## 核心功能

1. 日志搜索

提供控制台进行日志能力的搜索，涵盖消息队列、SQL执行、网关请求等等，后续会继续新增更多的模块；

2. 分组告警

提供多平台规则定义告警，将关注的异常信息告警到特定的讨论组中。

3. 前后端分离

将控制台录入通过端点提供访问，让特定的引擎根据规则参数进行渲染。

4. 存储层
   - 表拆分: 由于监控的数据量较大，会按照天的纬度进行划分到不同的表中。
   - 可拓展: 由于前期设计是`Msql`存储，但搜索能力太弱。切换到`ElasticSearch`了。底层可以来回切换成`Mysql`或者`ElasticSearch`.
   - 支持本地文件存储大文本文件，前期是为了弥补`Mysql`对大文本存储能力较弱，占用内存的情况。
5. 配置层

目前是按照本地配置走，支持`ElasticSearch`或`MySQL`切换，但目前都未实现，可以自行实现。



## 核心代码梳理



### 1. 模块分层

- jay-monitor-data-client : 客户端层，由客户端引入之后提供发送数据的能力。
- jay-monitor-data-core: 核心模块，全局类公共类定义
- jay-monitor-data-server : 服务端，负责接收客户端的数据进行分析、告警、存储



### 2. 功能描述

#### 1. 数据传输

`MonitorDataServer` : 服务端数据接收的入口类，通过Spring注入之后调用`Start()`方法启动一个端口: 9420(默认)，负责接收客户端发送过来的数据。

具体参考:

`com.jay.monitor.data.server.config.BeanConfig#boltServer` : 会将所有实现`UserProcessor`接口的类作为消费类，负责消费客户端传递过来的数据。

这些消费类存储在包: `com.jay.monitor.data.server.process` 中涵盖

- MQ
- SQL
- URL

#### 2.告警模块

在数据传输的过程中，会对每条数据进行分析，根据告警的规则来判定这条数据是否属于要告警的数据。

`RealtimeAlertProcess` : 实时告警处理器，负责接收数据传输的模块进行回调分析并且交由`ConfigAlertRule`处理。

`ConfigAlertRule` : 配置告警，负责读取配置与传输数据进行匹配。满足则告警

`MatchValueCondition` : 告警的配置规则定义，比如表达式、或者其他的一些规则详情。目前较推荐和灵活的是`ExpressionValueCondition`，根据Spring的表达式，非常灵活的匹配传输数据是否合理。



`AlertSendProcess` : 告警发送模型，负责调用各个平台实现的接口进行匹配发送到特定的平台。接口是`AlertRealTimeMsg`，目前实现有`钉钉` 如果想拓展可以实现比如微信、邮件、短信等等。

`DingDingRealTimeAlertProcess` : 钉钉的实现。



#### 3. 存储模块

##### 配置存储

`ConfigStoreManager` : 配置的定义

- `DefaultLocalConfigManager` :  本地文件配置
- `MysqlConfigStoreManager` : **Mysql**的配置



##### **数据拆分**

`DataIdFactory` : 按照纬度进行拆分表的尾缀值.

- `DayIdGenerate` : 天纬度
- `HourIdGenerate` : 小时纬度

在表的创建和获取的时候通过工厂获取规则得到一个尾缀值，将数据找到对应的表，并且流入对应的表。













