staboat
v0.1.0
Published
Staboat 是一种侵入式的线上服务监控系统, 提供对服务接口调用情况的实时监控。
Downloads
5
Readme
Staboat 监控系统
简介
Staboat 是一种侵入式的线上服务监控系统, 提供对服务接口调用情况的实时监控。
设计具有高度拓展性,支持多种服务故障后通知方式:短信、电子邮件、微信公众号等。
动机
- 普通的服务是裸奔的, 没有一套控制系统系统掌握它的业务状态变化。
- 其次很多监控系统的对接较为复杂,功能超出监控本身要关心的事。
- 树课等业务服务已经到达了需要一个监控系统保证它稳定性的时候,
- 从外部保证各种业务代码可以放下包袱的开始随心设计。
于是设计了一款具有高拓展性,支持各种系统对接的,支持HTTP Restful API查询的监控系统。
安装
直接执行
git clone https://github.com/Underdog-Studio/staboat
拉取本项目工程目录
视为完成安装
启动监控
先初始化一个配置文件
node ../bin/cli --init
会在当前目录下生成一个配置文件
之后执行
node ../bin/cli -c config.json
即可手动启动监控
向监控报告状态
报告有三种类型,分别是
SUCCESS:代表一个成功的服务调用发生了
ERROR:代表一次失败的服务调用发生了
HEARTBEAT:代表一次心跳报告
通过 npm 安装 staboat
npm install staboat
之后可以导入 staboat 提供的报告器
const {ReporterHelper, UDPReporter} = require("staboat");
通过报告器可以向已经启动的监控系统上报自己的状态
const reporter = new UDPReporter("127.0.0.1:9999");
const helper = new ReporterHelper(reporter);
helper.report({
serv_id:"testservice",
level:"SUCCESS"
msg:"一次API调用成功"
});
helper.report({
serv_id:"testservice",
level:"ERROR"
msg:"一次API调用失败,原因是..."
});
更方便的上报状态
如果使用 jigsaw 对外提供接口
可以向staboat库获取jigsaw适配器
const {ReporterHelper,JigsawAdapter} = require("staboat");
const reporter = new UDPReporter("127.0.0.1:9999");
const helper = new ReporterHelper(reporter);
const adapter = new JigsawAdapter(helper);
...
jigsaw.use(adapter.handle());
之后只要是该jigsaw实例收到一次请求,都会以testservice的服务名自动上报调用情况.
四种服务状态
FINE: 当前服务工作正常
NOTWELL: 当前服务勉强工作
FAILURE: 当前服务故障过于频繁
DOWN: 当前服务已经停止了工作
如果注册了通知器, 通知器在服务改变状态的时候会向你报告这四种状态的切换情况
对外 Restful API 接口
本监控系统可以实时查询服务情况, 以及可以添加服务名, 删除服务名等 以上操作都是标准的 HTTP Restful API
在监控启动后,通过访问 http://127.0.0.1:1000/?path=staboat
可以得到所有Restful API
{
"error": true,
"code": 9005,
"httpcode": 400,
"message": "Your request format isn't correct.",
"detail": {
"/v1/service/id": {
"desc": "获取当前所有服务标识符",
"return": "array<serv_id>",
"method": {
"get": {},
"post": {
"serv_id": "required"
},
"delete": {
"serv_id": "required"
}
}
},
"/v1/service/service": {
"desc": "获取所有服务的状态信息",
"return": "array<info>",
"method": {
"get": {
"id": "string",
"detail": "in:true,false"
}
}
},
"/v1/service/report": {
"desc": "向服务新增一次报告",
"return": "void",
"method": {
"post": {
"id": "required|string",
"level": "required|in:SUCCESS,ERROR,HEARTBEAT",
"msg": "required|string"
}
}
}
},
"type": "object",
"data": null
}
例如我要调用 /v1/service/service API
请用 GET 等方式(不同的HTTP方式执行结果,要求的参数也是不一样的)
访问 GET http://127.0.0.1:1000/v1/service/service?path=staboat
HTTP的正文必须是一个JSON,提供接口需要的参数,否则HTTP接口会提示你缺少什么参数。