日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/6/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从无到有写一个运维APP(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


前言:理論上應(yīng)該是一周一篇的說,但上一周回湖南浪去了,so~~~~,再者這并不是公司項(xiàng)目,全是自己臨時(shí)起意,所以業(yè)余時(shí)間寫寫~~~更新也許不會(huì)太快。


? 下面是個(gè)人的一些思路以及大概每篇文章的內(nèi)容,也許并不規(guī)范,為了不讓這篇文章看起來太干,所以第三部分放一些所謂的干貨,通過Python交互elasticsearch,zabbix獲取需要的數(shù)據(jù)并可視化,這也主要是為了后面做準(zhǔn)備。


本文內(nèi)容:

? 一: 系列文章目錄

? 二: 所謂流程

? 三: 通過Python查詢elasticsearch,zabbix數(shù)據(jù)(怎么可視化這些數(shù)據(jù),另起一篇文章)


(一)

系列文章目錄

Blog系列文章目錄:

?環(huán)境設(shè)定()

??環(huán)境配置

??小試牛刀

?流程文檔()

??具體需求

??具體實(shí)現(xiàn)方法

??Python?訪問API并簡(jiǎn)單可視化

?頁面設(shè)定()

??左右滑動(dòng)菜單

??二級(jí)三級(jí)導(dǎo)航

??數(shù)據(jù)保存

?API解析()

??angular http方法解析

??數(shù)據(jù)綁定

??mvc說明

??循環(huán)遍歷

??{{ret|upper}}管道過濾

??數(shù)據(jù)獲取? ? ? ? ? ? ? ? ??

?數(shù)據(jù)可視化()

??bower安裝chart.js

??bower安裝Elasticsearch.js

?成品()

??全文總結(jié)

??細(xì)節(jié)優(yōu)化

??代碼優(yōu)化

? ?v1.0

(二 )

所謂流程


連接方式:

??VPN或者內(nèi)網(wǎng)訪問或者公網(wǎng)訪問

?

傳輸方式:

??http協(xié)議

? JSON格式數(shù)據(jù)傳輸


APP基于:

??功能實(shí)現(xiàn):AngularJS

??UI框架:ionic

??其他:JavaScript,H5

?

服務(wù)端API

??Zabbix API

??Elasticsearch API

??

Zabbix API內(nèi)容:

???host --> item --> item data

????????

elasticsearch API內(nèi)容

???index --> type --> filed

???search methods:

??????search wildcard pattern

???聚合

??????????????????

可視圖形:

???趨勢(shì)圖

???柱狀圖

???餅狀圖

? ?counts(顯示數(shù)量)?

?

環(huán)境配置:

??SDK,NDK,JAVA,ionic,cordova,node.js,AngularJS

??JS下載:bower install chart.js elasticsearch.js,zabbix.js

?

頁面設(shè)定:

??搜索框

???搜索當(dāng)前顯示頁面(主機(jī),item,類Kibana搜索框)

?

??左側(cè)滑動(dòng)頁面內(nèi)容:

????日志(elasticsearch)

????????日志總量走勢(shì)圖(柱狀)

????????訪問IP數(shù)

????????type總量

? ? ?????自定義搜索(可能不在v1.0)

??????????時(shí)間

??????????type

??????????搜索字段

??????????過濾條件

? ? ? ? ? ? ? ? ? ? ? ? ? ?

????監(jiān)控(zabbix)? ? ? ? ? ? ? ? ? ? ? ? ? ?

????????主機(jī)

??????????監(jiān)控項(xiàng)(時(shí)間選項(xiàng))

????????事件

??????????事件項(xiàng)(時(shí)間選項(xiàng))

?

??底部菜單欄:

? ? ? ? ? ?主頁(主要顯示頁面)

? ? ? ? ? ? ??設(shè)置(IP,用戶名等內(nèi)容)

???????????收藏(收藏的可視化圖形)

?

數(shù)據(jù)可視化

??chart.js

?

實(shí)現(xiàn)過程

??日志(elasticsearch)

????請(qǐng)求內(nèi)容:Request Body search

??????Query

??????Size

??????Fileds

??????????????????????????????????????

??????Aggregation

????????sum

????????value count

? ? ? ? ? 待定

? ? ? ??

訪問方法:AngularJS? http get請(qǐng)求

?

主要功能:

? ??一:通過手機(jī)APP實(shí)時(shí)查看監(jiān)控情況(趨勢(shì)圖,事件v1.0)

? ??二:通過手機(jī)APP實(shí)時(shí)查看日志情況(日志總量,自定義搜索,常用顯示圖v1.0)

? ??三:遠(yuǎn)程執(zhí)行命令(暫不放在此系列文章內(nèi)v2.0)

? ? ?四:收發(fā)郵件(暫不放在此系列文章內(nèi)v2.0)


(三)

Python查詢elasticsearch,zabbix數(shù)據(jù)

? ? elasticsearch提供現(xiàn)成的Python庫(kù),所以就用官方的了,至于其他非官方的也沒看出有多好用,就不提了。

安裝elasticsearch 庫(kù)

1 pip?install?elasticsearch

然后導(dǎo)入及初始設(shè)定

1 2 3 4 from?elasticsearch?import?Elasticsearch ????? IP?=?"你的IP"??##IP格式:http://10.10.10.1:9200 es?=?Elasticsearch([IP])

? ??

然后通過一個(gè)實(shí)際的例子來說明

比如我們要查詢2016年01月31號(hào)的nginx的訪問日志,并且響應(yīng)碼是404

我想大多數(shù)人的索引(index)都是logstash-2016.01.01(具體情況具體說明)

因?yàn)槭?016年01月31日,所以對(duì)應(yīng)的索引是logstash-2016.01.31

然后在構(gòu)造查詢語句,查詢語句如下

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執(zhí)行

? ??

??如上所示,通過index="logstash-2016.01.31"指定索引,選擇所有索引可以index="logstash*",至于其他匹配方式參考官方文檔,然后body=body,指向的body就是我們上面構(gòu)造的查詢語句。

基本講解

? ?上面主要是兩個(gè)字典

? ? 1,size:10 ?###查詢結(jié)果的數(shù)量,kibana默認(rèn)數(shù)值是500

? ? 2,query:filtered ?filtered又嵌入了其他字典 ??

? ?值得注意的是,上面的語句也許你并不能直接使用,因?yàn)楦鶕?jù)自己elk解析的日志字段并不相同,所以具體情況具體分析,比如上面的http_status,nginx字段


? 猛地一看,還真有點(diǎn)嚇人,這怎么寫?

? 告訴大家一個(gè)取巧的辦法,當(dāng)然前提你得會(huì)用Kibana,如果點(diǎn)鼠標(biāo)都不會(huì)的話,我也無能為力。

? 下面是通過kibana查詢的結(jié)果

????

1:設(shè)置查詢的時(shí)間段

2:要查詢的關(guān)鍵字

3,4:就是我們?cè)O(shè)置的條件了

現(xiàn)在我們通過kibana過濾出我們想要的結(jié)果了,可是有什么用呢?我要的查詢語句,又不是kibana上的結(jié)果。

so~~~

查詢語句出來了,有木有~~~

??具體做法就是點(diǎn)擊上一副圖中的5,然后點(diǎn)擊request,下面的框就是我們,想要的結(jié)果了(我會(huì)告訴你,上面構(gòu)造的查詢結(jié)果就是這樣得出來的嗎?~~)

? ?當(dāng)然了,只是簡(jiǎn)單的復(fù)制,其實(shí)有很大的局限性,而且需要?jiǎng)h除一些我們不需要的部分,所以還是得瞧瞧官方的說明文檔。

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

??注:注意對(duì)應(yīng)的Elasticsearch版本


然后再來獲取一下zabbix的歷史數(shù)據(jù)

? 官方API說明文檔,參考:https://www.zabbix.com/documentation/2.4/manual/api/reference

? 通過查詢官方文檔,我們得出的思路是,先得到主機(jī)對(duì)應(yīng)的hostid,然后得到對(duì)應(yīng)主機(jī)的item_id,item_id就是我們想要的監(jiān)控項(xiàng),得到監(jiān)控項(xiàng)的id,我們就可以通過這個(gè)id查詢所對(duì)應(yīng)的歷史數(shù)據(jù)


主要步驟:

? ? 一: API驗(yàn)證

? ? 二:獲取hostid

? ? 三:獲取itemid

? ? 四:獲取對(duì)應(yīng)的歷史數(shù)據(jù)


一:API驗(yàn)證

??注:千萬,千萬不要用urllib,不是它多么的不堪,而是跟requests這個(gè)庫(kù)相比,urllib顯得太不人性化,太不優(yōu)雅了,這里主要也是用requests


首先導(dǎo)入相應(yīng)的庫(kù),requests,arrow需要通過pip安裝

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


然后是一些信息的設(shè)定

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


###構(gòu)造登錄需要提交的數(shù)據(jù)

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', }


打印一下獲取的驗(yàn)證令牌

###獲取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


二:獲取主機(jī)hostid

###我們定義一個(gè)host_data函數(shù),傳入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

### 我們構(gòu)造一個(gè)item_data函數(shù),傳入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歷史數(shù)據(jù)

###構(gòu)造history_data函數(shù),傳入auth_id,item_id,歷史數(shù)據(jù)的個(gè)數(shù),似乎默認(rèn)一分鐘一條,自行一天=60分鐘x24小時(shí)

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


###打印結(jié)果

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)


現(xiàn)在基本就ok了,不過一會(huì)發(fā)現(xiàn)clock對(duì)應(yīng)的時(shí)間是unix時(shí)間戳

所以需要轉(zhuǎn)換一下,這里我們有arrow這個(gè)庫(kù),比自帶的datetime又人性化了許多

簡(jiǎn)單講解一下arrow

獲取當(dāng)前時(shí)區(qū)時(shí)間

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

將Unix時(shí)間戳轉(zhuǎn)換為可閱讀時(shí)間

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

其實(shí)你會(huì)發(fā)現(xiàn)zabbix返回的時(shí)間不是當(dāng)前時(shí)區(qū),所以需要轉(zhuǎn)換,如下

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




本文轉(zhuǎn)自 youerning 51CTO博客,原文鏈接:http://blog.51cto.com/youerning/1740152

總結(jié)

以上是生活随笔為你收集整理的从无到有写一个运维APP(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。