前言:理论上应该是一周一篇的说,但上一周回湖南浪去了,so~~~~,再者这并不是公司项目,全是自己临时起意,所以业余时间写写~~~更新也许不会太快。
下面是个人的一些思路以及大概每篇文章的内容,也许并不规范,为了不让这篇文章看起来太干,所以第三部分放一些所谓的干货,通过Python交互elasticsearch,zabbix获取需要的数据并可视化,这也主要是为了后面做准备。
本文内容:
一: 系列文章目录
二: 所谓流程
三: 通过Python查询elasticsearch,zabbix数据(怎么可视化这些数据,另起一篇文章)
(一)
系列文章目录
Blog 系列文章目录:
环境设定 ( 一 )
环境配置
小试牛刀
流程文档 ( 二 )
具体需求
具体实现方法
Python 访问 API 并简单可视化
页面设定 ( 三 )
左右滑动菜单
二级三级导航
数据保存
API 解析 ( 四 )
angular http 方法解析
数据绑定
mvc 说明
循环遍历
{{ret|upper}} 管道过滤
数据获取
数据可视化 ( 五 )
bower 安装 chart.js
bower 安装 Elasticsearch.js
成品 ( 六 )
全文总结
细节优化
代码优化
v1.0
(二 )
所谓流程
连接方式:
VPN 或者内网访问或者公网访问
传输方式:
http 协议
JSON 格式数据传输
APP 基于:
功能实现: AngularJS
UI 框架: ionic
其他: JavaScript,H5
服务端 API :
Zabbix API
Elasticsearch API
Zabbix API 内容:
host --> item --> item data
elasticsearch API内容 :
index --> type --> filed
search methods:
search wildcard pattern
聚合
可视图形:
趋势图
柱状图
饼状图
c ounts 图 ( 显示数量 )
环境配置:
SDK,NDK,JAVA,ionic,cordova,node.js,AngularJS
JS 下载 :bower install chart.js elasticsearch.js,zabbix.js
页面设定:
搜索框
搜索当前显示页面 ( 主机, item ,类 Kibana 搜索框 )
左侧滑动页面内容:
日志 (elasticsearch)
日志总量走势图 ( 柱状 )
访问 IP 数
各 type 总量
自定义搜索 ( 可能不在 v1.0)
时间
type
搜索字段
过滤条件
监控 (zabbix)
主机
监控项 ( 时间选项 )
事件
事件项 ( 时间选项 )
底部菜单栏:
主页(主要显示页面)
设置 (IP, 用户名等内容 )
收藏 ( 收藏的可视化图形 )
数据可视化
chart.js
实现过程
日志 (elasticsearch) :
请求内容 :Request Body search
Query
Size
Fileds
Aggregation
sum
value count
待定
访问方法 :AngularJS http get 请求
主要功能 :
一: 通过手机 APP 实时查看监控情况 ( 趋势图,事件v1.0 )
二:通过手机 APP 实时查看日志情况 ( 日志总量,自定义搜索,常用显示图v1.0 )
三:远程执行命令 ( 暂不放在此系列文章内v2.0 )
四:收发邮件 (暂不放在此系列文章内v2.0)
(三)
Python查询elasticsearch,zabbix数据
elasticsearch提供现成的Python库,所以就用官方的了,至于其他非官方的也没看出有多好用,就不提了。
安装elasticsearch 库
pip install elasticsearch
然后导入及初始设定
from elasticsearch import Elasticsearch IP = "你的IP" ##IP格式:http://10.10.10.1:9200 es = Elasticsearch([IP])
然后通过一个实际的例子来说明
比如我们要查询2016年01月31号的nginx的访问日志,并且响应码是404
我想大多数人的索引(index)都是logstash-2016.01.01(具体情况具体说明)
因为是2016年01月31日,所以对应的索引是logstash-2016.01.31
然后在构造查询语句,查询语句如下
body = { "size":10, "query": { "filtered": { "query": { "query_string": { "query": "*", "analyze_wildcard": True } }, "filter": { "bool": { "must": [ { "query": { "match": { "http_status": { "query": "404", "type": "phrase" } } } }, { "query": { "match": { "_type": { "query": "nginx", "type": "phrase" } } } } ], "must_not": [] } } } } }
再通过python执行
如上所示,通过index="logstash-2016.01.31"指定索引,选择所有索引可以index="logstash*",至于其他匹配方式参考官方文档,然后body=body,指向的body就是我们上面构造的查询语句。
基本讲解
上面主要是两个字典
1,size:10 ###查询结果的数量,kibana默认数值是500
2,query:filtered filtered又嵌入了其他字典
值得注意的是,上面的语句也许你并不能直接使用,因为根据自己elk解析的日志字段并不相同,所以具体情况具体分析,比如上面的http_status,nginx字段
猛地一看,还真有点吓人,这怎么写?
告诉大家一个取巧的办法,当然前提你得会用Kibana,如果点鼠标都不会的话,我也无能为力。
下面是通过kibana查询的结果
1:设置查询的时间段
2:要查询的关键字
3,4:就是我们设置的条件了
现在我们通过kibana过滤出我们想要的结果了,可是有什么用呢?我要的查询语句,又不是kibana上的结果。
so~~~
查询语句出来了,有木有~~~
具体做法就是点击上一副图中的5,然后点击request,下面的框就是我们,想要的结果了(我会告诉你,上面构造的查询结果就是这样得出来的吗?~~)
当然了,只是简单的复制,其实有很大的局限性,而且需要删除一些我们不需要的部分,所以还是得瞧瞧官方的说明文档。
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
注:注意对应的Elasticsearch版本
然后再来获取一下zabbix的历史数据
官方API说明文档,参考: https://www.zabbix.com/documentation/2.4/manual/api/reference
通过查询官方文档,我们得出的思路是,先得到主机对应的hostid,然后得到对应主机的item_id,item_id就是我们想要的监控项,得到监控项的id,我们就可以通过这个id查询所对应的历史数据
主要步骤:
一: API验证
二:获取hostid
三:获取itemid
四:获取对应的历史数据
一:API验证
注:千万,千万不要用urllib,不是它多么的不堪,而是跟requests这个库相比,urllib显得太不人性化,太不优雅了,这里主要也是用requests
首先导入相应的库,requests,arrow需要通过pip安装
import requests import json import arrow from pprint import pprint
然后是一些信息的设定
ZABIX_ROOT = 'http://你的IP/zabbix' url = ZABIX_ROOT + '/api_jsonrpc.php' user = "用户名" passwd = "密码"
###构造登录需要提交的数据
auth_data = json.dumps( { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "%s" %user, "password": "%s" %passwd }, "id": 0 })
###http头部信息
headers = { 'content-type': 'application/json', }
打印一下获取的验证令牌
###获取Token
auth_ret = requests.post(url, data=auth_data, headers=headers) print auth_ret.json() auth_id = auth_ret.json()["result"] print 'Auth ID' print auth_id
二:获取主机hostid
###我们定义一个host_data函数,传入auth_id
def host_data(auth_id): data = json.dumps( { "jsonrpc":"2.0", "method":"host.get", "params":{ "output":["hostid","name"], "filter":{"host":""} }, "auth":"%s" %auth_id, "id":1, }) return data
##打印hostid
host_ret = requests.post(url, data=host_data(auth_id), headers=headers) host_ret = host_ret.json()["result"] print 'data response' pprint(host_ret)
三:获取itemid
### 我们构造一个item_data函数,传入auth_id,以及hostid
def item_data(auth,hostid): data = json.dumps( { "jsonrpc":"2.0", "method":"item.get", "params":{ "output":["itemid","key_"], "hostids":"%s" %hostid, }, "auth":"%s" %auth, "id":1, }) return data
###打印itemid
item_ret = requests.post(url, data=item_data(auth_id,10084), headers=headers) ###至于怎么传入hostid,自行for语句吧 item_ret = item_ret.json()["result"] pprint(item_ret)
四:获取itemid历史数据
###构造history_data函数,传入auth_id,item_id,历史数据的个数,似乎默认一分钟一条,自行一天=60分钟x24小时
def history_data(auth,itemid,limit,his=0): data = json.dumps( { "jsonrpc":"2.0", "method":"history.get", "params":{ "output":"extend", "history":his, "sortfield": "clock", "sortorder": "DESC", "itemids":"%s" %itemid, "limit":limit }, "auth":"%s" %auth, "id":1, }) return data
###打印结果
history_ret = requests.post(url, data=history_data(auth_id,26816,10), headers=headers) history_ret = history_ret.json()["result"] pprint(history_ret)
现在基本就ok了,不过一会发现clock对应的时间是unix时间戳
所以需要转换一下,这里我们有arrow这个库,比自带的datetime又人性化了许多
简单讲解一下arrow
获取当前时区时间
arrow.now().to("local") <Arrow [2016-01-31T11:36:51.801000+08:00]>
将Unix时间戳转换为可阅读时间
arrow.get(1454211116) Out[35]: <Arrow [2016-01-31T03:31:56+00:00]>
其实你会发现zabbix返回的时间不是当前时区,所以需要转换,如下
arrow.get(1454211116).to("local") Out[36]: <Arrow [2016-01-31T11:31:56+08:00]>