# mrxu-monitor **Repository Path**: dingwen-gitee/mrxu-monitor ## Basic Information - **Project Name**: mrxu-monitor - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 11 - **Created**: 2023-09-16 - **Last Updated**: 2023-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1 Monitor API 是什么? API监控平台是专门为SpringBoot微服务打造 的实时监控中心,对业务代码零侵入,只需引入jar包开启yml配置即可收集 API的运行状况和性能数据,并通过大屏进行直观展示。 内置告警通知可以对我们的 http错误状态码、业务错误状态码、慢请求、cc攻击做出预警。
说明:项目必须依赖redis,启动成功后默认通过 http://您的ip:你的端口/monitor/index.html访问(和swagger原理一样)。 ![效果图](md/demo.gif) ### 2 监控指标 1. 今日pv:当天访问网站接口的总次数。 2. 今日uv:当天访问网站的ip个数。 3. 错误数:当天接口返回http状态码非200和304个数。 4. 业务异常:当天接口返回业务状态码错误数。 5. 告警次数:当天触发告警次数。 6. 异常告警(列表):当天触发的告警明细。 7. 今日耗时接口top10:当天平均耗时最高的10个接口。 8. 今日状态码码:当天http状态码分布饼状图 。 9. 今日热门接口top10:当天请求次数最多的10个接口。 10. 接口流量:当日接口返回数据大小总和。 11. 总接口数:当日请求接口的总个数。 12. 今日浏览器类型:当日请求的浏览器top4. 13. 今日移动端占比:当日移动端请求与当日pv比值。 14. 访问最多的国家:当日访问最多的国家 15. 访问最多的省份: 当日访问最多的省份(国外的显示国家) 16. 访问最多的城市: 当日访问最多的城市(国外的显示国家) ### 3 项目使用方式 1. 引入pom文件 ```java com.mrxu mrxu-monitor 1.0.0-SNAPSHOT ``` 2. 启动类引入监控启动配置项(demo) ```java @SpringBootApplication @EnableMonitor public class MrxuDemoApplication { public static void main(String[] args) { SpringApplication.run(MrxuDemoApplication.class, args); } } ``` 3. 项目配置文件 ```sh # 项目redis 配置 spring: redis: host: 你的redis地址 port: 6379 password: 你的redis密码 monitor: # 项目是否开启 api监控 enable: true # 项目名称,也是redis key前缀的一部分 projectCode: mrxu-demo # 访问监控大屏的密码 viewPassword: cmcc # 告警通知渠道 notify: # 钉钉告警 https://open.dingtalk.com/document/robots/custom-robot-access dingDingWebhook: https://oapi.dingtalk.com/robot/send?access_token=XXXX # 飞书告警 https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot feiShuWebhook: https://open.feishu.cn/open-apis/bot/v2/hook/XXXX #企业微信告警 qiYeWeiWinWebhook: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXX # 邮箱告警收件人,发件人详见mail.setting 配置 toEmail: - '收件邮箱地址' # 拦截器规则 interceptor: # 需要拦截的路径,默认全部 path: - '/**' # 需要排除的路径 excludePath: #- '/*.css' # 需要排除的ip excludeIp: #- '127.0.0.1' #- 'localhost' # 攻击相关配置 attack: # 同一个ip每秒超过多少次访问认定为攻击 limitCountPerSecond: 60 # http状态码配置 httpStatusConfig: enable: true # 每秒http状态码非200和304个数超过多少触发预警 httpStatusErrorCountLimitPerSecond: 50 # 慢请求配置 timeOutConfig: enable: true # 每秒慢请求个数超过多少触发告警 limitCountPerSecond: 3 # 接口响应数据大于多少认为是慢请求 limitMilliSecond: 1000 # 业务异常状态码 businessCode: # 是否开启业务异常状态码监控 enable: true # 业务状态码key如返回:{code:200,msg:"成功",data:null} 业务状态码为code codeName: code # 正常的业务状态码 successCode: 0 # 业务状态码非正常每秒超过多少触发告警 limitErrorCountPerSecond: 20 # 监控特殊状态码用于感知系统异常 errorCodeNotice: 203: 发票余额不足 201: 实名认证失败 ``` 4. 邮箱告警邮件发送方配置 ```sh # 配置相关文档:https://hutool.cn/docs/#/extra/%E9%82%AE%E4%BB%B6%E5%B7%A5%E5%85%B7-MailUtil?id=%e5%8f%91%e9%80%81%e9%82%ae%e4%bb%b6 # 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀> host = smtp.qq.com # 邮件服务器的SMTP端口,可选,默认25 port = 465 # 发件人(必须正确,否则发送失败) from = 你的qq@qq.com # 用户名,默认为发件人邮箱前缀 user = 你的qq@qq.com # 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助) pass = XXXXXXXXXXX # 使用SSL安全连接 sslEnable = true ``` ### 4 告警相关 #### 4.1 异常告警类型 1. http状态码每秒非200和304个数超过配置阈值:当黑客尝试一些常见服务的路径如:swagger、springboot健康检查等服务常见路径,从而利用这些服务的漏洞对我们服务器进行渗透攻击。这种尝试通常会触发我们服务大量404状态,从而触发告警。 2. 业务状态码错误数每秒超过配置阈值:项目中如果状态码错误数过多,在一定程度上会影响用户或接口调用方的体验,当这种告警出现时说明有人在渗透我们系统或前端校验不足。黑客暴力破解密码时也会触发告警。 3. 单个ip每秒请求次数超过阈值:黑客通过接口爬取网站数据,会触发该预警。 4. 慢请求每秒超过配置阈值:可以根据配置文件配置接口响应时间超过多少毫秒定义为慢请求,配置每秒超过多少触发告警。 5. 接口返回配置文件中自定义异常业务状态码:当我们需要监控某种错误时可以配置该状态码,当出现该错误时及时通知相关人员。 #### 4.2 告警方式 1. 钉钉(webhook方式) 2. 企业微信(webhook方式) 3. 飞书(webhook方式) 4. 邮箱 #### 4.3 告警收敛 为了防止告警消息太多,我们针对每种告警类型做了限制,每种告警类型30秒内只会告警一次。 ### 5 数据收集方式 1. 通过类_ApiResponseBodyAdvice对我们系统所有RESTFULL API接口做切面拦截。收集接口的请求ip、请求路径、返回状态码、接口耗时、返回数据大小、请求浏览器类型等信息。改类命名以下划线开头为了是让该切面处理排到业务定义的切面后处理。 2. 请求来源地址,获取请求来源ip,通过本地ip数据库文件获取ip归属地。 3. 数据持久化采用redis存储。 4. 为了防止收集指标数据已经频繁操作redis对我们业务产生影响,我们使用本地内存,并处理可能产生的异常,然后通过定时任务每秒向redis中写入。 ### 6 代码目录 ```markdown ├── src/ # 源码路径 │ ├── main/ │ │ └── java/ # java 源代码 │ │ └──── com.mrxu.monitor # 监控相关java代码包 │ └── resource/ # 配置文件demo ├── README.md #说明文档 └── pom.xml #maven pom 文件 ``` ### 7 总结 欢迎拍砖。