从无到有写一个运维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

   聚合

                  

可视图形:

   趋势图

   柱状图

   饼状图

   counts(显示数量) 

 

环境配置:

  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 库

1
pip  install  elasticsearch

然后导入及初始设定

1
2
3
4
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

然后在构造查询语句,查询语句如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  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执行

    wKiom1athh-wQghvAAC5L2_NSOU068.png

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

    wKioL1ath_6And10AAFxtsWi43A781.png

1:设置查询的时间段

2:要查询的关键字

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

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

so~~~

wKioL1atiCLAwny6AACQ3uSZ_go756.png

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

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

1
2
3
4
import  requests
import  json
import  arrow
from  pprint  import  pprint


然后是一些信息的设定

1
2
3
4
ZABIX_ROOT  =  'http://你的IP/zabbix'
url  =  ZABIX_ROOT  +  '/api_jsonrpc.php'
user  =  "用户名"
passwd  =  "密码"


###构造登录需要提交的数据

1
2
3
4
5
6
7
8
9
10
auth_data  =  json.dumps(
{
     "jsonrpc" "2.0" ,
     "method" "user.login" ,
     "params" : {
     "user" "%s"  % user,
     "password" "%s"  % passwd
},
"id" 0
})


###http头部信息

1
2
3
headers  =  {
     'content-type' 'application/json' ,
}


打印一下获取的验证令牌

###获取Token

1
2
3
4
5
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

wKioL1atiQ6C2dwuAAARofGMsM4396.png


二:获取主机hostid

###我们定义一个host_data函数,传入auth_id

1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
2
3
4
host_ret  =  requests.post(url, data = host_data(auth_id), headers = headers)
host_ret  =  host_ret.json()[ "result" ]
print  'data response'
pprint(host_ret)

wKiom1atiOmBwMwKAABfxZS4T0Y737.png


三:获取itemid

### 我们构造一个item_data函数,传入auth_id,以及hostid

1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
2
3
item_ret  =  requests.post(url, data = item_data(auth_id, 10084 ), headers = headers)   ###至于怎么传入hostid,自行for语句吧
item_ret  =  item_ret.json()[ "result" ]
pprint(item_ret)

wKiom1atiRGTK7VfAACXJIYKTvE383.png


四:获取itemid历史数据

###构造history_data函数,传入auth_id,item_id,历史数据的个数,似乎默认一分钟一条,自行一天=60分钟x24小时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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


###打印结果

1
2
3
history_ret  =  requests.post(url, data = history_data(auth_id, 26816 , 10 ), headers = headers)
history_ret  =  history_ret.json()[ "result" ]
pprint(history_ret)

wKioL1atiYWAScJ6AAAuu3Do6mQ156.png


现在基本就ok了,不过一会发现clock对应的时间是unix时间戳

所以需要转换一下,这里我们有arrow这个库,比自带的datetime又人性化了许多

简单讲解一下arrow

获取当前时区时间

1
2
arrow.now().to( "local" )
<Arrow [ 2016 - 01 - 31T11 : 36 : 51.801000 + 08 : 00 ]>

将Unix时间戳转换为可阅读时间

1
2
arrow.get( 1454211116 )
Out[ 35 ]: <Arrow [ 2016 - 01 - 31T03 : 31 : 56 + 00 : 00 ]>

其实你会发现zabbix返回的时间不是当前时区,所以需要转换,如下

1
2
arrow.get( 1454211116 ).to( "local" )
Out[ 36 ]: <Arrow [ 2016 - 01 - 31T11 : 31 : 56 + 08 : 00 ]>




本文转自 youerning 51CTO博客,原文链接:http://blog.51cto.com/youerning/1740152
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值