概述
RedAlert(https://github.com/alibaba/RedAlert,以下简称RA)是神马搜索引擎团队打造的一个基于指标的监控服务,承担着神马搜索、推荐、广告等业务中上万个服务进程的异常报警。现在有各种开源的监控系统,比如Ganglia,Graphite等,可以收集各个应用的核心指标,然后通过可视化界面展示在web上。RA的开源版本可以从Ganglia,Graphite和Amonitor等系统中读取出收集的系统核心指标,并根据设置的规则报警,针对其他的数据源,RA提供了一系列的API,可以自定义自己的数据源信息,然后集成到RA系统中,从而实现监控报警。本文主要介绍如何从Ganglia或者是其他的系统中提取应用的指标,从而实现在RA中进行报警的功能。
使用Ganglia作为数据源
RA默认是支持Ganglia,Graphite作为数据源的,因此只需要安装完成后,在RA web上配置好即可。
安装Ganglia
安装的步骤可以参考ganglia官方网站(http://ganglia.info/),安装完成后,可以根据自己的需要配置好自己的cluster信息,机器信息,以及自己应用需要汇报的指标都可以汇报到Ganglia的server上。
安装Red Alert和Red Alert Web
具体安装步骤可以参考蔡迥航文档(RA安装与使用)。
在Red Alert Web上配置Ganglia作为数据源
如上图所示,首先在RedAlert web中需要配置四个参数,第一个是Server的地址,我们这里使用的是Ganglia是通过读取rrd文件来获取监控数据的,这里可以随便设置一个值,第二个是别名,配置一个相关的名字。第三个是Fetcher的类型,Ganglia在系统中对应的Fetcher是RRDMetricFetcher,最后一个参数是配置Ganglia rrd文件的根路径,这里配置我们安装好的路径地址{"rrd_root":"/var/lib/ganglia/rrds/"}。需要注意的是,这里使用的是json格式。然后保存就可以增加成功了,然后发布配置就可以将Ganglia作为一项数据源发布到RA Server上了。
增加报警项
在上一个步骤(配置Ganglia作为数据源)完成后,我们在新增策略的页面就可以选择我们的Ganglia的指标了,如上图所示是RA从我们刚刚配置的Ganglia中获取到的Metric树,然后增加策略就可以通过RA进行报警了。
自定义数据源实现
RA是通过以收集Ganglia,Graphite等系统的metrics作为系统的输入从而实现报警功能的。默认是支持了Ganglia,Graphite这些的数据获取的,当我们使用的是系统默认不支持的平台的时候,RA提供了自定义数据源的方式来获取自定义的数据。
在RA中定义了一些通用的Fetcher API来定义这些接口,当用户使用了一个新的数据源系统来获取数据的时候,只需要实现这些API接口就可以实现报警功能。API接口见
https://github.com/alibaba/RedAlert/blob/master/RAServer/ra/fetcher/MetricFetcher.h
用户在实现自己的API之后,需要在Factory中注册自己的函数,参考文件https://github.com/alibaba/RedAlert/blob/master/RAServer/contrib/fetcher/MetricFetcherFactory.cpp
在增加好Fetcher名字之后,就可以在RA web中进行配置相关的信息,具体使用可以参考上面Ganglia的配置使用。
RedAlert获取数据API
Metric Fetcher API
Red Alert 主要的fetcher api如下所示:
typedef std::map<std::string, std::string> OptionMap;
class MetricFetcher {
public:
virtual bool init(const OptionMap &options) = 0;
virtual void close() = 0;
virtual MetricNodePtr allocTree(int64_t start = -1, int64_t end = -1) = 0;
virtual MetricNodePtr retrieve(const MetricNodePtr &root, int64_t start, int64_t end, int64_t step);
protected:
virtual bool attachDataNode(const MetricPath& path, int64_t start, int64_t end, int64_t step);
}
下面逐个介绍各个API的具体含义。
MetricFetcher::init()
Red Alert 调用Init函数来进行初始化,通过传人一个string map类型的参数(通过RA web进行输入),进行初始化这个MetricFetcher..
MetricFetcher::close()
Red Alert 调用 close()函数来关闭这个MetricFetcher。在MetricFetcher中应该在该函数中释放自己申请的资源。
MetricFetcher::allocTree(start, end)
一般通过监控系统收集的Metric 数据都是有层次的,在Red Alert 中组织这些Metric数据是通过一个树形的结构,也称作Metric树。allocTree(start, end) 返回的结果是这个Metric树的根节点,start, end 是收集的时间间隔,这一段时间中生成的所有的Metric,以树形的方式组织起来。然后,Red Alert 可以通过retrieve() 函数来获取到整棵树上面的节点的数据。如下图所示,是一颗在我们系统中的Metric树。
MetricFetcher::retrieve()
MetricFetcher::retrieve(root, start, end, step) 返回的是带有数据的一颗树,如下图所示,上面的每一个节点都是MetricData 的一个实例,上面都带有时间段的数据 [start, start + step, start + 2 * step, ..., end]。该函数有一个默认的实现是通过遍历树调用attachDataNode函数的方式来实现,用户可以只实现retrieve函数,或者只实现attachDataNode函数。
MetricFetcher::attachDataNode()
默认的retrieve() 是通过调用attachDataNode的方式来获取整棵树的节点数据。在大多数的场景下,我们只需要实现attachDataNode(const MetricPath& path, int64_t start, int64_t end, int64_t step)就可以了。 attachDataNode的第一个参数是Metric的路径,如上图中所示,MetricPath一个路径对应于(Root/Main Index/Worker/Searcher/CPU/DataNode@host1),通过在这个路径所对应的MetricNode 上附加DataMetric的信息,即完成了这个Metric上面数据的附加。RA会遍历整棵树来获取所有的Metric Data。
相关链接:
- RedAlert:https://github.com/alibaba/RedAlert
- Ganglia:http://ganglia.info/
- Graphite:http://graphiteapp.org/