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应该具有授权模块,防止脏数据的写入,同时避免恶意查询,限流等。

展示

最终将统一展示到数据图表中,就像发布事件一样。