Skip to content

Commit

Permalink
实现短链接功能
Browse files Browse the repository at this point in the history
实现短链接功能
  • Loading branch information
kechangqing committed Mar 10, 2022
1 parent a3e8238 commit 1b351e3
Show file tree
Hide file tree
Showing 32 changed files with 935 additions and 69 deletions.
51 changes: 18 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,27 +208,8 @@ pod: ${data.result[0].metric.pod}

## 短链接服务

为了方便使用者快速查看产生报警的日志,报警消息最后会有一个日志查询地址的短链接,打开即可看到产生报警的日志。目前默认支持的短链接
有两种:四五短网址和百度短网址。默认短链接实现使用的是四五短网址免费版,网址: <a href="http://www.45dwz.cn/" target="_blank">45短网址</a>, 默认申请的token限制很大,
调用次数有限制,你可以去45短网址申请自己token,或者你可以自己选择换别的短网址服务都行,只需要自己实现简单适配即可。

如果你自己申请了token,请修改配置文件 frostmourne-spi/src/main/resources/application.properties 如下配置值:

```
dwz.type=dwz45
dwz45.token=t8HGzRNv9TmvqUFICNoW3SaYNA1C9OAC
```

如果想切换使用<a href="https://dwz.cn/console/apidoc/v3" target="_blank">百度短网址</a>,请通过修改如下配置:

```
dwz.type=baidu
dwz.baidu.token=
```

token需要自己申请。

> 说明:如果短链接服务出错或者不使用,报警消息里的链接将使用原链接,会比较长。
为了方便使用者快速查看产生报警的日志,报警消息最后会有一个日志查询地址的短链接,打开即可看到产生报警的日志。在0.4版本之前支持的短链接有两种:四五短网址和百度短网址。
在0.5版本之后,内置实现了短链接功能,所以不需要额外配置短链接服务了。

## 用户管理和登录认证

Expand Down Expand Up @@ -439,28 +420,33 @@ mybatis最新推出了新的模块[mybatis-dynamic-sql](https://github.com/mybat
* ~~log4j2升级至2.17.1~~ [2022-01-14]
* ~~恢复通知默认改为关闭~~ [2022-02-16]
* ~~解决不报警并且关闭恢复通知的时候,没有记录执行日志的问题。~~ [issue#53](https://github.com/AutohomeCorp/frostmourne/issues/53) [2022-03-07]
* elasticsearch数据监控增加kibana链接设置,如果设置kibana短链,查询链接将优先使用kibana。
* 解决邮箱报警不支持ssl的问题
* ~~mysql: 增加短链接表 [short_link](./doc/mysql-schema/2022-03-08/short_link.sql)~~ [2022-03-08]
* ~~elasticsearch数据监控增加查询链接配置,例如可以设置查询链接为kibana链接,查询链接将优先使用kibana链接。~~ [2022-03-09]
* ~~内置实现一个短链接功能,移除外部短链接服务依赖,解决外部短链接服务请求比较慢的问题~~ [2022-03-09]
* ~~修改短链接部分文档说明~~ [2022-03-10]
* ~~mysql: 增加配置表[config_map](./doc/mysql-schema/2022-03-08/config_map.sql)~~ [2022-03-10]
* ~~doc: 增加如何配置报警消息头的方法文档说明~~ [2022-03-10]
* 增加邮箱在线配置页面功能
* 增加企业微信在线配置页面功能
* 将发送消息功能从spi移到monitor;
* 移除spi模块,随着monitor功能完善,spi的存在已经成为鸡肋,移除掉可以降低调试和部署难度。
* 增加消息内容长度配置,超过长度配置部分将被截掉
* 增加报警消息头设置
* 报警消息增加静默说明,如:请注意,未来10分钟此监控连续报警消息将被静默
* 内置实现一个短链接功能,移除外部短链接服务依赖,解决外部短链接服务请求比较慢的问题
* 增加报警消息是否附带查询链接配置
* msyql监控增加表达式监控规则
* 增加用户密码设置功能,方便没有部署ldap的团队
* Elasticsearch监控数值实现环比监控
* 解决邮箱报警不支持ssl的问题
* 增加用户密码设置功能,方便没有部署ldap的团队使用。配置了ldap的将优先使用ldap认证。
* 发布0.5-RELEASE
* important breaking feature: 移除xxl-job依赖,内置实现分布式调度,减小部署难度
* 解决firefox浏览器时间显示有问题的bug
* 增加报警组支持
* Elasticsearch数据名增加traceid字段配置,可以配置为skywalking的traceId,显示skywalking traceid的时候,增加连接,跳转到skywalking对应的调用链
* Elasticsearch数据名增加traceid字段配置,可以配置跳转链接。例如: 配置skywalking的链接将跳转到skywalking对应的调用链
* 报警消息格式增加类型: text, markdown选项
* 数据配置支持数据分组,分组类型支持两种:1. 按字段值分组,相当于ES里的Terms Aggregation; 2. 按时间分组,相当于ES里的DateHistogramAggregation
* 增加[prometheus](https://github.com/prometheus/prometheus)数据监控报警支持
* 增加[skywalking](https://github.com/apache/skywalking)数据监控报警支持
* 增加[iotdb](https://github.com/apache/iotdb)数据监控报警
* 增加[loki](https://github.com/grafana/loki)数据监控报警
* 改进消息静默功能:对报警事件数据和静默时间内的事件数据对比,如果相似度很高就静默,如果和静默时间内事件相似度不高仍然报警。这样可以避免漏报同时防止报警消息过多导致疲劳。
* mysql数据监控增加除count外其他聚合类型支持
* clickhouse数据监控增加除count外其他聚合类型支持
* 改进消息静默功能:对报警事件数据和静默时间内的事件数据对比,如果相似度很高就静默,如果和静默时间内事件相似度不高仍然报警。这样可以避免漏报同时防止报警消息过多。
* influxDB数据查询除了返回数值,另外返回最新一个point详细数据用于报警消息模板
* 增加influxDB数据查询页面
* influxdb数据监控增加短链接,跳转到influxdb数据查询页面
Expand All @@ -485,7 +471,6 @@ mybatis最新推出了新的模块[mybatis-dynamic-sql](https://github.com/mybat
* 增加frostmourne程序日志查询和分析功能
* 3-sigma离群点检测报警规则
* 加入时序数据异常检测算法规则(需要实验可行性,欢迎有相关经验的同僚联系)
* 移除xxl-job依赖,内置实现分布式调度,减小部署难度(待定)
* 总结项目用到的知识点

## 发版历史
Expand Down
7 changes: 7 additions & 0 deletions ReleaseNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
* 报警方式增加飞书机器人 [2021-10-30]
* http监控兼容异常状态码 [2021-11-06]
* 恢复通知默认改为关闭 [2022-02-16]
* elasticsearch数据监控增加查询链接配置,例如可以设置查询链接为kibana链接,查询链接将优先使用kibana链接。 [2022-03-09]
* 内置实现一个短链接功能,移除外部短链接服务依赖,解决外部短链接服务请求比较慢的问题 [2022-03-09]

### Bugfix

Expand All @@ -14,9 +16,14 @@
### Mysql

* mysql: alert表增加字段feishu_robot_hook,表示飞书机器人地址 - [SQL](./doc/mysql-schema/2021-10-30/change.sql) [2021-10-30]
* mysql: 增加短链接表short_link - [SQL](./doc/mysql-schema/2022-03-08/short_link.sql) [2022-03-08]
* mysql: 增加配置表config_map - [SQL](./doc/mysql-schema/2022-03-08/config_map.sql) [2022-03-08]

### Document

* 修改短链接部分文档说明, 移除外部短链接依赖 [2022-03-10]
* 增加如何配置报警消息头的方法说明 [2022-03-10]

### Others

* log4j2升级至2.17.1 [2022-01-14]
Expand Down
16 changes: 16 additions & 0 deletions doc/mysql-schema/2022-03-08/config_map.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
DROP TABLE IF EXISTS config_map;
CREATE TABLE IF NOT EXISTS config_map
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
config_key VARCHAR(500) NOT NULL COMMENT '配置key',
config_value VARCHAR(1000) NOT NULL COMMENT '配置value',
creator VARCHAR(200) NOT NULL COMMENT '创建人',
create_at DATETIME NOT NULL COMMENT '创建时间',
modify_at DATETIME NOT NULL COMMENT '修改时间',
modifier VARCHAR(200) NOT NULL COMMENT '最后修改人'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '内部配置表';

CREATE UNIQUE INDEX uniq_configkey ON config_map (config_key);
10 changes: 10 additions & 0 deletions doc/mysql-schema/2022-03-08/short_link.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
DROP TABLE IF EXISTS short_link;
CREATE TABLE IF NOT EXISTS short_link
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
long_link VARCHAR(1000) NOT NULL COMMENT '监控数据类型。(http: http监控;其他值: 关联data_name表)',
create_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '短链接表';
31 changes: 31 additions & 0 deletions doc/mysql-schema/frostmourne.sql
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,37 @@ CREATE TABLE IF NOT EXISTS `service_info`
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='服务信息';

/*------------------------------------------- create short_link---------------------------------------------------------------------*/
DROP TABLE IF EXISTS short_link;
CREATE TABLE IF NOT EXISTS short_link
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
long_link VARCHAR(1000) NOT NULL COMMENT '监控数据类型。(http: http监控;其他值: 关联data_name表)',
create_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '短链接表';

/*------------------------------------------- create config_map---------------------------------------------------------------------*/
DROP TABLE IF EXISTS config_map;
CREATE TABLE IF NOT EXISTS config_map
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
config_key VARCHAR(500) NOT NULL COMMENT '配置key',
config_value VARCHAR(1000) NOT NULL COMMENT '配置value',
creator VARCHAR(200) NOT NULL COMMENT '创建人',
create_at DATETIME NOT NULL COMMENT '创建时间',
modify_at DATETIME NOT NULL COMMENT '修改时间',
modifier VARCHAR(200) NOT NULL COMMENT '最后修改人'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '内部配置表';

CREATE UNIQUE INDEX uniq_configkey ON config_map (config_key);


/*------------------------------------------- init data---------------------------------------------------------------------*/
INSERT INTO department_info(department_name, full_name, creator, create_at, modify_at, modifier)
VALUES ('default', '默认部门', 'admin', now(), now(), 'admin');
Expand Down
16 changes: 16 additions & 0 deletions doc/mysql-schema/tables/config_map.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
DROP TABLE IF EXISTS config_map;
CREATE TABLE IF NOT EXISTS config_map
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
config_key VARCHAR(500) NOT NULL COMMENT '配置key',
config_value VARCHAR(1000) NOT NULL COMMENT '配置value',
creator VARCHAR(200) NOT NULL COMMENT '创建人',
create_at DATETIME NOT NULL COMMENT '创建时间',
modify_at DATETIME NOT NULL COMMENT '修改时间',
modifier VARCHAR(200) NOT NULL COMMENT '最后修改人'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '内部配置表';

CREATE UNIQUE INDEX uniq_configkey ON config_map (config_key);
10 changes: 10 additions & 0 deletions doc/mysql-schema/tables/short_link.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
DROP TABLE IF EXISTS short_link;
CREATE TABLE IF NOT EXISTS short_link
(
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
long_link VARCHAR(1000) NOT NULL COMMENT '监控数据类型。(http: http监控;其他值: 关联data_name表)',
create_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4
COMMENT = '短链接表';
39 changes: 31 additions & 8 deletions doc/wiki/template.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
消息模板使用的语法是freemarker,具体用法参考freemarker官方文档。可用的变量分两部分。一部分是报警规则设置,一部分
是查询出来的数据。不同规则可使用的变量如下表格。

字段名 | 类型 | 说明 | 适用的判断类型
字段名 | 类型 | 说明 | 适用的判断类型
-------- |----------| ------- | -----
TIME_WINDOW | int | 查询时间范围窗口大小(单位: 分钟) | 数值
TIME_WINDOW | int | 查询时间范围窗口大小(单位: 分钟) | 数值
NUMBER | double | 数值类型值 | 数值
THRESHOLD | double | 判断阈值 | 数值
COUNT | long | 查询记录数量 | 数值
Expand All @@ -14,12 +14,12 @@ COUNT | long | 查询记录数量 | 数值

### HTTP数据内置变量

字段名 | 类型 | 说明 | 适用的数据源
字段名 | 类型 | 说明 | 适用的数据源
-------- |----------| ------- | -----
HTTP_STATUS | int | HTTP状态码 | HTTP
HTTP_STATUS | int | HTTP状态码 | HTTP
HTTP_COST | long | 请求耗时 | HTTP

查询的数据可用变量取决于你的数据格式。以我们部门程序日志数值监控为例,可用变量和我们日志格式是一致的。如下表格:
查询的数据可用变量取决于你的数据格式。以我们部门程序日志数值监控为例,可用变量和我们日志格式是一致的。如下表格:

序号 | 字段名 | 类型 | 说明 | Elasticsearch存储
----|-------- |----------| ------- | -----
Expand All @@ -46,9 +46,9 @@ HTTP_COST | long | 请求耗时 | HTTP
21 | ExceptionMessage | string | 异常信息 | 分词
22 | CustomMessage | string | 自定义信息 | 分词
23 | StackTrace | string | 堆栈信息 | 分词
24 | HawkKey | string | Key | 不分词
24 | HawkKey | string | Key | 不分词

这样我们一般为程序日志报警定制的消息模板为:
这样我们一般为程序日志报警定制的消息模板为:

```
${Project}最近${TIME_WINDOW}分钟内有异常日志${NUMBER}条。最近一条异常信息:
Expand Down Expand Up @@ -79,4 +79,27 @@ HttpCode: ${code}
```

这里用我们内部使用的例子供大家参考使用,具体模板内容,你需要自己根据数据格式定制。如果你想使用我们的日志格式,请参考
另外一个开源项目: autolog4j[https://github.com/AutohomeCorp/autolog4j]
另外一个开源项目: autolog4j[https://github.com/AutohomeCorp/autolog4j]

## Q: 报警字段值太长,如何处理?

freemarker提供了字符串截取的操作,例如:

```
${userName?truncate(16)}
```

如果userName长度超过16,将被截取。更多使用方法请参考[freemarker文档](https://freemarker.apache.org/docs/ref_builtins_string.html#ref_builtin_truncate);

## Q: 如何设置报警消息头?

默认报警消息title是: 霜之哀伤监控平台。可以配置config_map表config_key为AlertTitle的行的config_value值来设置自定义报警消息头。例如:

```sql
INSERT INTO config_map(config_key, config_value, creator, create_at, modifier, modify_at)
VALUES('AlertTitle', '霜之哀伤监控平台', 'admin', now(), 'admin', now());
```

同一个config_key禁止配置多条,对config_key建了唯一索引。

注意如果你的报警机器人依赖报警消息头作为关键词,请记得同时改机器人配置,否则会导致机器人消息无法发送。
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.autohome.frostmourne.core.contract.Protocol;
import com.autohome.frostmourne.monitor.contract.ElasticsearchDataResult;
import com.autohome.frostmourne.monitor.service.core.query.IQueryService;
import com.autohome.frostmourne.monitor.service.core.service.IShortLinkService;
import com.autohome.frostmourne.spi.starter.api.IFrostmourneSpiApi;
import org.elasticsearch.common.Strings;
import org.joda.time.DateTime;
Expand All @@ -36,6 +37,9 @@ public class DataQueryController {
@Resource
private IFrostmourneSpiApi frostmourneSpiApi;

@Resource
private IShortLinkService shortLinkService;

@ResponseBody
@RequestMapping(value = "/elasticsearchData")
public Protocol<ElasticsearchDataResult> elasticsearchData(@RequestParam(value = "_appId", required = true) String _appId,
Expand Down Expand Up @@ -70,7 +74,8 @@ public Protocol<List<String>> elasticsearchFields(@RequestParam(value = "_appId"
@RequestMapping(value = "/shortenLink", method = RequestMethod.GET)
public Protocol<String> shortenLink(@RequestParam(value = "_appId", required = true) String _appId,
@RequestParam(value = "longUrl", required = true) String longUrl) {
return frostmourneSpiApi.shortenLink("frostmourne-monitor", longUrl);
String shortLink = shortLinkService.shorten(longUrl);
return new Protocol<>(shortLink);
}

@RequestMapping(value = "/downloadData")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.autohome.frostmourne.monitor.controller;

import java.util.Optional;
import javax.annotation.Resource;

import com.autohome.frostmourne.monitor.controller.annotation.PermissionLimit;
import com.autohome.frostmourne.monitor.dao.mybatis.frostmourne.domain.ShortLink;
import com.autohome.frostmourne.monitor.dao.mybatis.frostmourne.repository.IShortLinkRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class IndexController {

private final static Logger LOGGER = LoggerFactory.getLogger(IndexController.class);

@Resource
private IShortLinkRepository shortLinkRepository;

@PermissionLimit(limit = false)
@RequestMapping(value = "/goto/{id}", method = RequestMethod.GET)
public String jump(@PathVariable(value = "id") Long id) {
if (id == null || id <= 0) {
LOGGER.error("invalid short link id: {}", id);
return "redirect:/dashboard.view";
}
Optional<ShortLink> shortLinkOptional = shortLinkRepository.selectByPrimaryKey(id);
if (shortLinkOptional.isPresent()) {
return String.format("redirect:%s", shortLinkOptional.get().getLongLink());
} else {
LOGGER.error("invalid short link id: {}", id);
return "redirect:/dashboard.view";
}
}
}
Loading

0 comments on commit 1b351e3

Please sign in to comment.