Events Hub Proposal
Background
当线上服务出现故障时,我们会依赖监控数据来排查问题,是服务器硬件出现了异常,还是资源出现了瓶颈,或者有可能是开发上线了新的版本,也可能是网络底层在替换一个新的机柜交换机。这些信息可能发生在不同的服务器上,不同的时间,不同的部门,我们可能很难第一时间共享到这些信息,进而无法帮助我们快速排查故障。
Design
我们需要一个服务来收集这些事件,将事件标准化,
ID: 时间ID,eventsHub产生
ns: "xxx.loda" (事件对应的ns节点,如果是全局事件,请填写loda)
machine: "s1" (事件对应的服务器主机名,有可能事件只发生在该台服务器上)
msg: "替换机房故障交换机" (具体的消息内容)
link: "http://test.com/123" (事件地址,来自第三方系统)
author: libk (执行人员,系统自动触发为system)
timestamp: 1550239348 (事件发生的unix时间戳,int64)
type: "network" (事件类型,用于后期展示过滤)
app: "pms" (事件来源应用)
token: "1af7ae2149766384b00e5f2782903feb" (用于认证)
事件对象
ns: 一个事件可能是发生在某一组机器上,这是这个事件影响的范围是这组机器,对应到服务树上的某个ns machine:一个事件可能只发生在某一台机器上,比如用户登录机器。
应该是二选一。
事件内容
msg: 消息内容应该简明扼要,”网络变更“ 是一个不好的消息,应该写下做了什么变更。 link:如果我们想具体看看这个变更事件的详情,可以通过这个链接跳转到第三方系统。
事件元数据
谁,什么时候,什么类型,这些都是事件的meta数据,也方便过滤数据。
type 可选类型: network 、system 、service
数据流
eventsHub服务应该存在两个异步的主要工作流程,分别处理数据的写入和查询,同时这个服务应该是无状态的,方便水平扩容。
Push : 第三方系统 -> eventsHub -> MQ <- eventsHub -> DB
Query : 第三方系统 <-> eventsHub (cache?) <-> DB
API
服务域名: eventshub.monitor.test.com 协议:HTTPS
/api/v1/push [POST]
body:
{
"ns": "loda"
"machine": "s1",
"msg": "替换机房故障交换机",
"link": "http://pms.test.com/123",
"author": libk,
"timestamp": 1542958371,
"type": "network",
"app": "pms",
"token": "1af7ae2149766384b00e5f2782903feb"
}
/api/v1/query [Get]
query para:
from: 1542958271
to: 1542958471
"ns": "loda"
"machine": "s1"
"author": libk
"type": "network"
"app": "pms"
认证与流控
events Hub应该具有授权模块,防止脏数据的写入,同时避免恶意查询,限流等。
展示
最终将统一展示到数据图表中,就像发布事件一样。