All Projects → liuyueyi → Quick Alarm

liuyueyi / Quick Alarm

通用报警框架,支持报警方式自定义,报警配置自定义

Programming Languages

java
68154 projects - #9 most used programming language

Labels

Projects that are alternatives of or similar to Quick Alarm

Aospdeskclock
Fork of aosp deskclock: alarm,clock, timer,stopwatch
Stars: ✭ 28 (-70.21%)
Mutual labels:  alarm
psychoclock
ESP8266 alarm clock with 8x32 LED display, NTP time, and MOD/WAV music alarms
Stars: ✭ 35 (-62.77%)
Mutual labels:  alarm
Ics
iCalendar (ics) file generator for node.js
Stars: ✭ 324 (+244.68%)
Mutual labels:  alarm
terraform-aws-ecs-cloudwatch-sns-alarms
Terraform module to create CloudWatch Alarms on ECS Service level metrics.
Stars: ✭ 23 (-75.53%)
Mutual labels:  alarm
alarm-dog
哮天犬是一个通用的统一告警平台,提供配置化、流程化、标准化的能力,支持多种告警通知渠道,支持告警收敛、过滤、升级、工作流、自动恢复等功能,实现统一输入、不同输出。可以对接Grafana、阿里云Arms、实时计算等监控能力,各业务也可以直接在代码中埋点上报告警,也可以定制化开发,实现监控告警全场景覆盖。https://tal-tech.github.io/alarm-dog-docs
Stars: ✭ 165 (+75.53%)
Mutual labels:  alarm
Rusty Clock
An alarm clock with environment stats in pure bare metal embedded rust
Stars: ✭ 269 (+186.17%)
Mutual labels:  alarm
ad-qolsys
AppDaemon app for Qolsys IQ Panel 2
Stars: ✭ 19 (-79.79%)
Mutual labels:  alarm
Eth Alarm Clock Dapp
Chronos - Ethereum Alarm Clock DApp
Stars: ✭ 42 (-55.32%)
Mutual labels:  alarm
new-clock
The best clock app there is
Stars: ✭ 24 (-74.47%)
Mutual labels:  alarm
Iot 433mhz
🌐 IoT System to control 433 MHz RC power sockets, PIR, Door Sensors and much more.
Stars: ✭ 301 (+220.21%)
Mutual labels:  alarm
Alarm
420! Alarm App ⏰
Stars: ✭ 41 (-56.38%)
Mutual labels:  alarm
homebridge-konnected
A Homebridge plugin for Konnected Alarm Panel devices
Stars: ✭ 25 (-73.4%)
Mutual labels:  alarm
Alertr
A client/server based multi-purpose alarm and monitoring system
Stars: ✭ 277 (+194.68%)
Mutual labels:  alarm
VisonicAlarm-for-Hassio
Visonic/Bentel/Tyco Alarm System integrtation for Home Assistant
Stars: ✭ 14 (-85.11%)
Mutual labels:  alarm
Ring
Unofficial API for Ring Doorbells, Cameras, Alarm System, and Smart Lighting
Stars: ✭ 437 (+364.89%)
Mutual labels:  alarm
MD DS3231
DS3231 Real Time Clock Library
Stars: ✭ 29 (-69.15%)
Mutual labels:  alarm
Simple Clock
Combination of a beautiful clock with widget, alarm, stopwatch & timer, no ads
Stars: ✭ 257 (+173.4%)
Mutual labels:  alarm
Sentinl
Kibana Alert & Report App for Elasticsearch
Stars: ✭ 1,233 (+1211.7%)
Mutual labels:  alarm
Chronometer
A Chronometer for GNU Emacs
Stars: ✭ 6 (-93.62%)
Mutual labels:  alarm
Alarm Ios Swift
clone of the official IOS clock alarm app written in swift
Stars: ✭ 295 (+213.83%)
Mutual labels:  alarm

一个可扩展的报警系统Quick-Alarm

I. 背景

日常的系统中,报警是不可缺少的一环,目前报警方式很多,最常见的有直接打日志,微信报警,短信报警,邮件报警等;而涉及到报警,一般不可避免的需要提前设置一些基本信息,如报警方式,报警频率,报警用户,开关等;

另外一个常见的问题是一般采用的是单一的报警方式,比如不管什么类型的报警全部都用短信方式触达,然后就会发现手机时常处于被淹没的状态了,久而久之对报警短信就不会敏感了

II. 目标

因此我们准备设计一个通用的报警框架

  • 可以自由选择报警方式,
  • 支持用户自定义报警方式拓展
  • 支持动态的报警配置,
  • 支持用户自定义报警规则拓展
  • 支持报警方式自动切换规则设定
  • 支持报警方式自定义自动切换规则拓展

通过做一个东西,当然是希望可以带来一些用处,或者能学习到什么东西,才不枉花费精力来折腾一下,那么我们这个报警系统,究竟有什么用,或者可以从中学习到什么东西呢?

用途:

  • 支持灵活可配的报警规则,以及具体报警业务的自定义拓展
  • 目标就是统一报警的使用姿势,也就是不管什么报警,都一个姿势,但是内部可以玩出各种花样,对使用者而言就方便简洁了

学习:

抛开特有的知识点,可以抽象一些公共可用的地方,大概就下面这两点了

  • 我们可以如何支持功能的动态可拓展
  • 线程池的使用

III. 设计

整体来说,报警主要可以划分为三个步骤,如下:

IMAGE

  • 提交报警:对外部使用者提供的接口
  • 选择报警:根据报警相关信息,选择具体的报警执行单元
  • 执行报警:实现具体的报警逻辑

从任务划分上来看,比较清晰简单,但是每一块的内容又必须可以拓展,

  • 选择报警:

    • 报警规则的制定
    • 报警规则加载器 ConfLoader
    • 报警规则变更的触发器 ConfChangeTrigger
    • 报警规则解析器
      • ConfParse : 解析文本格式报警规则为业务对象
      • AlarmSelector :根据报警规则和报警类型,选择具体报警执行器 AlarmExecute
  • 执行报警:

    • 线程池执行(以防止影响主业务流程)
    • AlarmExecute的动态拓展(支持用户自定义的报警器实现)
    • 实际的报警逻辑

根据上面的拆解,在应用启动的时候,就有一些事情必须去做了

  1. ConfLoader的选择
  2. 报警规则加载
  3. AlarmExecute的加载(包括默认的+自定义实现的)

下图显示在应用启动时,报警规则解析的相关步骤

应用启动.png

至于报警执行器的加载就比较简单了,如下图

IMAGE

因此,整个的工作流程如下图

alarm-arch.jpg

IV. 任务拆解

通过前面的任务设计之后,对需要做的东西有了一个大概的脉络了,因此在正式操刀实现之前,下对整个架构进行任务拆解,看下可以具体的执行步骤可以怎么来

  • 最直接的就是设计报警执行器AlarmExecute
    • 定义基本接口
    • 制定自定义扩展规则
  • 接下来就是设计报警规则
    • 如何加载报警规则?
    • 报警规则具体的定义细则
    • 报警规则的解析:即根据报警类型来获取报警执行器
    • 报警规则动态更新支持
  • 报警线程池
    • 维护报警队列
    • 报警的计数与频率控制
  • 封装对外使用接口

所以,通过上面的分析可以看出,这个系统的结构还是蛮简单的,整个只需要四个部分就可以搞定,其中最主要的就是前面两个了,后面将分别说明

V. 整体说明

0. 简单使用case

a. 引入依赖

基于maven项目,如下配置

先添加仓库

<repositories>
    <repository>
        <id>yihui-maven-repo</id>
        <url>https://raw.githubusercontent.com/liuyueyi/maven-repository/master/repository</url>
    </repository>
</repositories>

引入依赖

<dependency>
    <groupId>com.hust.hui.alarm</groupId>
    <artifactId>core</artifactId>
    <version>1.0</version>
</dependency>

也可以直接在将代码拷贝下来使用

b. 添加基本配置文件

如果使用系统默认的配置注册方式,则在项目的资源目录下新增文件

alarm.properties

## 应用名,必填
appName=test

## 报警规则文件所在的路径,如果采用系统默认加载方式,必填
## / 开头,表示存的是绝对路径
## 非/开头,表示存的是系统相对路径,一般是放在资源目录下
alarmConfPath=/tmp/alarmConfig

## 最大的报警类型,非必填
maxAlarmType=1000

## 默认报警用户,必填
defaultAlarmUsers=yihui

请注意其中的 alramConfPath 参数,这个指定报警规则文件的路径, 然后根据这个路径,添加报警规则文件,一个case如下:

(说明,外层的key为报警类型,default为默认的兜底规则,支持多个报警规则共享一个配置项,只需要用英文逗号分割即可,如下面的NPE, SELFDEFINE两种报警类型)

{
    "default": {
        "level": "NONE",
        "autoIncEmergency": true,
        "max": 30,
        "min": 3,
        "threshold": [
            {
                "level": "LOG",
                "threshold": 5,
                "users": [
                    "yihui",
                    "erhui"
                ]
            }
        ],
        "users": [
            "yihui"
        ]
    },
    "NPE,SELFDEFINE": {
        "level": "LOG",
        "autoIncEmergency": false,
        "max": 30,
        "min": 0,
        "threshold": [
            {
                "level": "SMS",
                "threshold": 20,
                "users": [
                    "345345345345",
                    "123123123123"
                ]
            },
            {
                "level": "WEIXIN",
                "threshold": 10,
                "users": [
                    "小灰灰Blog",
                    "greyBlog"
                ]
            }
        ],
        "users": [
            "yihui"
        ]
    }
}

c. 报警调用

一个测试case如下

@Test
public void sendMsg() throws InterruptedException {
    String key = "NPE";
    String title = "NPE异常";
    String msg = "出现NPE异常了!!!";
    AlarmWrapper.getInstance().sendMsg(key, title, msg);

    // 不存在异常配置类型, 采用默认报警, 次数较小, 则直接不输出
    AlarmWrapper.getInstance().sendMsg("zzz", "不存在xxx异常配置", "报警嗒嗒嗒嗒");

    // 确保报警执行完毕,再退出任务
    Thread.sleep(1000);
}

d. 更多

对于如何扩展自定义报警执行器,如何使用自定义的配置文件加载类替换系统的,可以参考更详细文档: 报警系统QuickAlarm使用手册

如有任何问题,随时欢迎联系,通过issuse,email,微博都可以

这是个人信息主页: 小灰灰Blog

1. 相关文档

所有文档可以在个人博客查看汇总:

  1. QuickAlarm博客汇总

v0.1版相关文档

  1. 报警系统QuickAlarm总纲
  2. 报警系统QuickAlarm之报警执行器的设计与实现
  3. 报警系统QuickAlarm之报警规则的设定与加载
  4. 报警系统QuickAlarm之报警规则解析
  5. 报警系统QuickAlarm之频率统计及接口封装
  6. 报警系统QuickAlarm使用手册
  7. 报警系统Quick-Alarm-钉钉报警支持

v0.2版改进文档

  1. 报警系统QuickAlarm之默认报警规则扩展

2. 历程

  • [x] 2018.02.07
    • 整体框架搭建完成
    • 基本功能实现
  • [x] 2018.02.12 : v0.1 正式包
    • 项目开发技术文档完成
    • 开发使用手册完成
  • [x] 2018.03.05
  • [x] 2018.03.28
    • 新增模板方式输出报警内容接口
    • 新增指定报警用户的接口
    • 支持多ConfLoader加载器同时生效,根据IConfLoader优先级排序,通过AlarmKey优先选择精确匹配的报警规则,都没有时,选择最高优先级的IConfLoader的兜底报警规则
  • [x] 2018.04.08
  • [x] 2018.04.10
    • 完成邮件报警方式封装
    • 使用姿势参考: 使用说明
  • [x] 2019.12.25
    • 完成钉钉报警方式封装
    • 使用姿势参考: 使用说明
  • [x] 2020.04.21
    • 完成飞书报警方式封装
    • 使用姿势参考: 使用说明

3. todoList

  • 剥离报警规则和解析器,支持用户自定义
  • 邮件报警方式
  • 钉钉报警
  • 飞书报警
  • 短线报警方式
  • 微信报警方式
  • 电话报警方式
  • 支持多重报警类型同时选择

4. 版本说明

版本 说明
email-plugin 1.0 基本的邮件报警方式封装
email-plugin 1.1 支持ssl方式, 通过配置文件 emailSsl=true 开启
dingding-plugin 1.0 基本的钉钉报警方式
feishu-plugin 1.0 基本的飞书报警方式
core 1.0 正式包

VI. 其他

个人博客: 一灰灰blog

基于hexo + github pages搭建的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

声明

尽信书则不如,以上内容,纯属一家之言,因本人能力一般,见识有限,如发现bug或者有更好的建议,随时欢迎批评指正,我的微博地址: 小灰灰Blog

扫描关注

公众号&博客

QrCode

打赏码

pay

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].