从无到有写一个运维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(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置BGP本地优先级
- 下一篇: 外链站内跳转代码