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

(二 )

所谓流程


连接方式:

  ***或者内网访问或者公网访问

 

传输方式:

  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 库

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执行

    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安装

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

wKioL1atiQ6C2dwuAAARofGMsM4396.png


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

wKiom1atiOmBwMwKAABfxZS4T0Y737.png


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

wKiom1atiRGTK7VfAACXJIYKTvE383.png


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

wKioL1atiYWAScJ6AAAuu3Do6mQ156.png


现在基本就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]>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值