近期公司上线一套深信服的超融合平台进行私有云的建设,上线后已经将原有的多台服务器迁移至平台,系统运行平稳。对监控就提上日程,如何进行监控,深信服超融合本身提供监控,可以从平台方面进行。主机安装agent进行监控(可能存在疏漏,安装agent复杂),或者使用平台自身的监控。
平台监控
通常设备提供SNMP接口,可以获取到设备的基本状态信息,深信服超融合平台也提供SNMP功能,进过一番配置后,使用snmpwalk遍历后,能够获取的状态非常有限,相较于需要监控的目标,粒度度太粗,无法满足需求,只好作罢。 查询发现深信服超融合平台提供API,可以进行监控。平台与监控主机相关的API如下: API请求/vapi/extjs/cluster/vms?group_type=group获取的返回值
{
"success":1,
"data":[
{"owner":"ad","name":"ji","direct_vm_num":1,"path":"61394df39524",
"data":[{"hstatus":1,"hostname":"10.250.x.x","cfgstorage":null,"ostype":"other64","pid":"7949",
"mhz":2401,"lifespan":"-1","vmtype":"vm","mem_used":2422394880,"os_installed":1,"diskread":0,
"diskwrite_operations":1,
"mem_total":17179869184,
"name":"MAD2.0","urgent":0,"acenter":0,"diskwrite":9830,
"label":"","diskread_operations":0,
"disk_used":"7301444403",
"netin_packet":51,
"status":"running",
"ha":1,"netout":0,
"netout_packet":0,"vtool_installed":0,"node":"cluster","groupname":"ji",
"vmid":1774086864344,"vmpexp":0,"alert":"0",
"cpu_ratio":"0.03","netin":8148,
"vmgroup":"61394df39524",
"disk_total":85899345920,"running":1,"nets":[],
"io_ratio":"0.08",
"host":"host-50af736f4a92","logo":"0",
"mem_ratio":"0.14","vnetdev":"","cpus":2}],
"id":"61394df39524","type":"group","vm_num":1},
}
根据api文档,可以满足监控需求。
Zabbix直接请求API
zabbix提供HTTP情况用于监控,可以进行设置,采用模拟的方式进行配置,配置好对应的请求头即可获取:
配置后发现请求头无法使用,深信服使用了反CSRF机制,请求中需要带上API操作时都要在请求头部带上Cookie和CSRFPreventionToken
使用程序代理
使用一段时间后发现过一段时间(不超过1天)就无法获取情况,经分析,平台安全机制采用会话过期机制,必须重新获取新的cookie及新的CSRFPreventionToken。因此采用nginx固定配置的方式无法进行,需要进行编码。 深信服超融合平台API请求过程如下:
1. GET /vapi/json/public_key获取公钥。
-
用公钥把管理员密码加密
-
使用API: POST /vapi/json/access/ticket,参数中密码使用上面加密后的密码。
-
在上面获取的ticket前面加上“LoginAuthCookie=”,就构成了识别用户身份的一段Cookie,后续在使用其他API操作时都要在请求头部带上Cookie和CSRFPreventionToken。
-
调用API发送请求
为解决使用zabbix访问深信服超融合平台API,故可以使用多种语言实现,为部署方便等因数,采用go实现,主要代码如下:
func NewHostReverseProxy(target *url.URL) *httputil.ReverseProxy {
director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
if _, ok := req.Header["Cookie"]; !ok {
// explicitly disable User-Agent so it's not set to default value
req.Header.Set("Cookie", "LoginAuthCookie="+ticket)
req.Header.Set("CSRFPreventionToken", csrf)
}
}
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
return &httputil.ReverseProxy{Director: director, Transport: tr}
}
代码写的比较粗糙,可以访问github查看,仅供参考
Zabbix监控模版
直接使用api,获取数据情况,将获取的信息实用pre进行json数据分析
其他监控指标配置为依赖项
使用预处理分析json从而获取监控值
后续
经过多次尝试,充分利用zabbix的功能实现对深信服超融合平台监控,本文中的方法可以用于其他需要认证的复杂api监控情况,对于zabbix应充分挖掘其机制,持续优化模版,简化配置工作。 此外,本文方法可用于webservice、rpc等场景,提供API转换功能,扩展zabbbix的使用范围,用于业务指标、第三方API数据的监控。
github地址: https://github.com/bbqi/hci-api-proxy