欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2025/6/15 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 从无到有写一个运维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执行

    

  如上所示,通过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安装

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


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


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


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


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

总结

以上是生活随笔为你收集整理的从无到有写一个运维APP(二)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。