转载

从无到有写一个运维APP(二)

前言:理论上应该是一周一篇的说,但上一周回湖南浪去了,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执行

从无到有写一个运维APP(二)

如上所示,通过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查询的结果

从无到有写一个运维APP(二)

1:设置查询的时间段

2:要查询的关键字

3,4:就是我们设置的条件了

现在我们通过kibana过滤出我们想要的结果了,可是有什么用呢?我要的查询语句,又不是kibana上的结果。

so~~~

从无到有写一个运维APP(二)

查询语句出来了,有木有~~~

具体做法就是点击上一副图中的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

从无到有写一个运维APP(二)

二:获取主机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)

从无到有写一个运维APP(二)

三:获取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)

从无到有写一个运维APP(二)

四:获取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)

从无到有写一个运维APP(二)

现在基本就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]>
原文  http://youerning.blog.51cto.com/10513771/1740152
正文到此结束
Loading...