设计与实现基于Kibana Watcher的服务分级报警平台

Posted by WGrape的博客 on September 10, 2020

文章内容更新请以 WGrape GitHub博客 : 设计与实现基于Kibana Watcher的服务分级报警平台 为准

前言

本文原创,著作权归WGrape所有,未经授权,严禁转载

一、问题背景

由于优先级高的重要接口与低优先级的一般接口混杂在一起,使重要接口无法优先关注,进而出现问题处理不及时、报警不及时或提醒能力弱等报警缺点。久之,无法形成完善的工作制度以保障业务的安全正常运转。

二、实现目标

实现由接口分级为基础的整个业务保障的流程闭环

image

通过接口分级的基础建设,推动个人分级意识和报警能力的增强,进而可以对整个业务做到问题的及时把控,最终实现保障业务安全

三、实现思想

应该用什么方式实现 ”接口分级“ 的基础建设,目前主要有如下两种方式,本期使用第一种方式实现,即 「通过设计API Notice平台实现接口分级的基础建设」 1、通过设计并完成API Notice平台 2、通过在项目代码中直接编码的方式

四、设计方案

1、主要内容

(1) 分级设计

目前根据业务场景可以分为4个服务重要级别,如果不确定服务级别,可以和产品业务方确认当前需求的重要程度,如果无法确认,一般默认设定为B级服务

级别 重要程度 定义
S级 最高 直接或间接涉及到公司财产、绩效、声誉的服务、或对用户重要且使用率高的服务
A 级 对用户重要但使用率不高的服务
B 级 对用户一般重要的服务
C 级 对用户不重要的服务

(2) 实现过程

1、形成按业务区分的接口容器 2、可以为每一个容器手动添加、自动添加接口 3、容器中的每一个接口都可存储相应的信息,如重要级别等 4、可根据服务优先级、异常数等指标为容器中的接口做排序查看 5、报警方式是定制化的,表现在可使用短信、邮件、电话等不同的提醒方式 6、报警规则是定制化的,表现在可以匹配HTTP状态码,响应码,参数,IP等任何日志信息 7、可以为S、A、B、C四种不同的级别设置不同的报警规则,且自动应用于所有相应等级的接口

2、设计总览

API Notice平台的定位如下,即处于用户 和 Watcher之间,让用户先为业务接口做分级,最后对不同级别的接口实现统一监控,用最简单的方式实现统一报警。

image

3、数据源(数据表设计)

在数据库中创建共计api_config(接口容器)、api_alarm_config(接口业务级别的报警配置)两张表,这两张表就是整个平台的数据来源

CREATE TABLE IF NOT EXISTS `api_config`
(
  `id`           INT(11) UNSIGNED    NOT NULL AUTO_INCREMENT,
  `path`         VARCHAR(128)        NOT NULL DEFAULT '' COMMENT '接口路径(如/service/task/new_task)',
  `name`         VARCHAR(64)         NOT NULL DEFAULT '' COMMENT '接口名称',
  `desc`         VARCHAR(512)        NOT NULL DEFAULT '' COMMENT '接口描述',
  `level`        VARCHAR(2)          NOT NULL DEFAULT '' COMMENT '接口的重要级别(如S,A,B,C)',
  `service`      VARCHAR(64)         NOT NULL DEFAULT '' COMMENT '接口所属服务(如mobile)',
  `status`       TINYINT(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(如1:存在, 0:不存在)',
  `created_time` INT(11) UNSIGNED    NOT NULL DEFAULT 0 COMMENT '创建时间',
  `updated_time` INT(11) UNSIGNED    NOT NULL DEFAULT 0 COMMENT '更新时间',
 
  UNIQUE INDEX uniq_idx_path (`path`),
  INDEX idx_level (`level`),
  INDEX idx_service (`service`),
  PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8 COMMENT ='接口配置';

CREATE TABLE IF NOT EXISTS `api_alarm_config`
(
  `id`           INT(11) UNSIGNED    NOT NULL AUTO_INCREMENT,
  `service`      varchar(64)         default '' not null comment '分级所属服务',
  `level`        VARCHAR(2)          NOT NULL DEFAULT '' COMMENT '接口的重要级别(如S,A,B,C)',
  `watcher_id`   VARCHAR(256)         NOT NULL DEFAULT '' COMMENT 'watcherID',
  `rule`         TEXT                NULL COMMENT '报警规则',
  `status`       TINYINT(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(如1:存在, 0:不存在)',
  `created_time` INT(11) UNSIGNED    NOT NULL DEFAULT 0 COMMENT '创建时间',
  `updated_time` INT(11) UNSIGNED    NOT NULL DEFAULT 0 COMMENT '更新时间',
  UNIQUE INDEX uniq_idx_watcher_id (`watcher_id`),
  INDEX idx_level (`level`),
  INDEX idx_service (`service`),
  PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8 COMMENT ='报警配置';

4、操作平台

开发Web平台,所有操作都在此Web平台进行,主要包括如下 1、自动生成接口,手动添加接口 2、编辑接口的分级类别 3、为S、A、B、C、四种不同的级别添加统一性报警

5、报警实现

使用Kibana工具的Watcher监控器实现报警,即创建不同的watcher,通过ES匹配日志,最终实现接口的报警

image

在使用API创建watcher的过程中,注意watcher账号权限的问题,如果权限低即使创建成功也无法正常报警

6、报警与操作平台的接入

通过Watcher监控器的API实现在操作平台的自动创建和编辑,把所有操作都收敛到操作平台端,避免了操作来源分散的问题。如下图可以为不同级别的服务添加统一性的报警规则(使用的是ES匹配语法)。

image

7、包括哪些分级内容

1、接口分级

对业务整个接口系统划分为S、A、B、C四类级别接口

2、错误分级

有了接口级别是不够的,有时接口中的某个操作异常会引发大面积故障,这种情况就需要对此异常设置S级别的错误

3、报警分级

随着错误级别的不同,采用不同的报警级别,如S级错误可以使用短信、电话等报警方式

8、重要结果(实现了统一报警)

通过此平台,最终可以实现 接口分级、错误分级、报警分级 共3种分级内容 。虽然是三种,但底层都是基于 Watcher 实现 ,而 Watcher 基于 ES 查询匹配日志实现 。

所以归根到底 ,目前实现了一种统一报警的方式( 业务打日志 + API Notice ),通过如下两步骤即可实现 ① 业务抛出异常日志 ② 在API Notice平台进行接口分级配置

image

五、最终实现

最终实现接口分级的API Notice平台,请见开源项目API Notice,使用方法和效果如下图所示

1、第一步,先添加接口,可以选择手动添加和自动添加,并设置服务级别 2、如果需要对此级别的服务报警规则进行调整,调整即可,不需要再有额外的操作

image