摘要:大綱我們需要監(jiān)控兩臺(tái)服務(wù)器來(lái)確保它們是正常的,運(yùn)行期間沒(méi)有內(nèi)存和磁盤使用率問(wèn)題。連接,在收到每個(gè)請(qǐng)求服務(wù)器的數(shù)據(jù)后,給每個(gè)對(duì)應(yīng)的服務(wù)器響應(yīng)格式化的數(shù)據(jù)。
注:原文地址 psutil and MongoDB for System Monitoring
這篇入門文章描述了怎樣創(chuàng)建一系列的圖表來(lái)監(jiān)控一臺(tái)或多臺(tái)服務(wù)器的負(fù)載。使用 Python(psutil 和 bottle),MongoDB 和 jquery。不管你使用什么樣的數(shù)據(jù)庫(kù)或 WEB 框架,思路都是一樣的。
在最后,你將有一個(gè) web 頁(yè)面為每臺(tái)服務(wù)器展示圖表,圖表中顯示了 cpu, memory, 和 disk usage。
大綱Part 0: Get the Tools
Part 1: Get the Data
About the MongoDB Collection.
The Data Gathering Code
Part 2: Set up the bottle Server
Part 3: Display the Data with jqplot
The HTML Page
The JavaScript (jqplot) Code
我們需要監(jiān)控兩臺(tái) FreeBSD 服務(wù)器來(lái)確保它們是正常的,運(yùn)行期間沒(méi)有內(nèi)存和磁盤使用率問(wèn)題。 為了這篇文章的目的,這兩臺(tái)服務(wù)器的名字是 example01 和 example02。
注意:這些恰好是相同的機(jī)器運(yùn)行 MongoDB 副本集,它們中的一臺(tái)運(yùn)行 web 服務(wù)。沒(méi)有理由它們必須是相同的機(jī)器 - 你完全可以讓 MongoDB 運(yùn)行在一臺(tái)不同的服務(wù)器上,而不是你想監(jiān)控的其中一臺(tái)。這對(duì)于 web 服務(wù)也是一樣的 - 可以在任何服務(wù)器上,不是必須得在你監(jiān)控的其中一臺(tái)服務(wù)器上。
我不想登錄每臺(tái)服務(wù)器,然后運(yùn)行 top 或 ds 來(lái)找出發(fā)生了什么。我想要一個(gè)有最新圖表的 web 頁(yè)面可以看一眼,每臺(tái)服務(wù)器一個(gè)頁(yè)面。
整個(gè)工作流遵循以下三個(gè)步驟:
獲取系統(tǒng)數(shù)據(jù)存入 MongoDB(使用 psutil 和 cron)
設(shè)置一個(gè) Web 服務(wù)器來(lái)查詢 MongoDB 的數(shù)據(jù)(使用 bottle)
編寫一個(gè)簡(jiǎn)單的 Web 頁(yè)面來(lái)展示這些數(shù)據(jù)(jqplot + AJAX)
你可以在 GitHub 工程 psmonitor 上獲取所有的代碼。在這篇文章中,我使用一些代碼片段。
在第一部分,你在一個(gè) cron 任務(wù)中使用 psutil Python 包每五分鐘寫系統(tǒng)信息到 MongoDB 的一個(gè) capped collection 中。這 5 分鐘是完全任意的 - 你可以選擇你喜歡的任意時(shí)段。我正在監(jiān)控的系統(tǒng),幾分鐘提供足夠細(xì)的粒度。這部分把數(shù)據(jù)存入 MongoDB。
在第二部分, bottle 應(yīng)用程序發(fā)出一個(gè)請(qǐng)求給 MongoDB,然后得到一個(gè) JSON 數(shù)據(jù)格式的響應(yīng)。這是在客戶端的 HTML 頁(yè)面和 MongoDB 數(shù)據(jù)直接創(chuàng)建了一個(gè)代理。
在第三部分,你有一個(gè) HTML 文件匹配到你想監(jiān)控的每臺(tái)服務(wù)器上。該文件加載 jqplot 并發(fā)出一個(gè) AJAX 請(qǐng)求給 bottle 應(yīng)用程序。這部分是波動(dòng)的原因 - 我們獲取存儲(chǔ)在 MongoDB 中的負(fù)載數(shù)據(jù)的時(shí)間序列圖表。
這個(gè)我們創(chuàng)建的其中一個(gè)圖表的示例:
你可以為你想要的任何數(shù)據(jù)創(chuàng)建圖表。我為每臺(tái)機(jī)器使用的圖表是:
cpu user percent
cpu system percent
cpu irq
cpu nice percent
disk space free
memory free
Part 0: Get the Tools以下的工具需要通過(guò)安裝來(lái)實(shí)現(xiàn),但是你可以使用一個(gè)不同的數(shù)據(jù)庫(kù)或是 Web 框架,如果你已經(jīng)有的話。
psutil 是一個(gè)非常好用的跨平臺(tái)的系統(tǒng)監(jiān)控工具,如果想了解更多,請(qǐng)移步至其項(xiàng)目主頁(yè),你可以通過(guò) pip 安裝它。
NoSQL 數(shù)據(jù)庫(kù) MongoDB 是一個(gè)開(kāi)源的文檔型數(shù)據(jù)庫(kù)。如果你有自然適合 JSON 結(jié)構(gòu)的數(shù)據(jù),MongoDB 會(huì)是一款非常適合存儲(chǔ)數(shù)據(jù)的工具。對(duì)我來(lái)說(shuō),它已經(jīng)成為了首選的工具,當(dāng)我隨時(shí)發(fā)現(xiàn)需要存儲(chǔ) JSON 格式數(shù)據(jù)的時(shí)候。有趣的是,我越使用它,越能找到新的用途。MongoDB 的文檔型結(jié)構(gòu)是驚人的有用,并且可以為許多信息類型提供 map 。
bottle Web 框架是一個(gè)用 Python 寫的沒(méi)有任何依賴的小型框架。你可以通過(guò) pip 安裝它。你可以使用包括開(kāi)發(fā)服務(wù)器讓事情繼續(xù),稍后把它放在一個(gè)不同的后端服務(wù)器。我把我的放在 Apache 服務(wù)器,一旦我得到我希望他們的。我稍后將寫一篇文章關(guān)于這個(gè)的設(shè)置。
jqplot jquery 插件使得生產(chǎn)圖表更容易,加上它們看起來(lái)也不錯(cuò),并且它們是統(tǒng)一的很容易的比較圖表。比如,當(dāng)一個(gè)進(jìn)程波動(dòng)起來(lái)的時(shí)候,在圖表中很容易看出來(lái),因?yàn)槟憧梢酝瑫r(shí)看到 cpu 和 內(nèi)存飆升,這兩個(gè)圖表是同樣的 X 軸位置。你可以使用這個(gè)插件做很多事情,這個(gè)練習(xí)僅僅只是皮毛。
Part 1: Get the Data當(dāng)我們想遵循這樣的模式創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu)的時(shí)候,在這步中你可以添加和刪除任何 psutil 支持的數(shù)據(jù)。終點(diǎn)是會(huì)看 jqplot 圖表的用戶,因此在你的腦海里保持?jǐn)?shù)據(jù)結(jié)構(gòu),jqplot 想要的是一個(gè)雙元素列表的列表,其中一個(gè)是時(shí)間,像這樣:
[[datetime1, y-value1], [datetime2, y-value2], and so on.]
那個(gè)結(jié)構(gòu)不是收集數(shù)據(jù)的最有效方式,但是記住你的初心是什么一直是很重要的。我們將收集數(shù)據(jù)并且改變數(shù)據(jù)結(jié)構(gòu)以便給 jqplot 需要的數(shù)據(jù)結(jié)構(gòu)。
當(dāng)?shù)谝徊轿也恢牢倚枰裁春褪褂檬裁?,我有更多一些測(cè)量。我認(rèn)為,隨著時(shí)間的流逝,我看到機(jī)器的實(shí)際需求將改變,并且它非常容易改變。
{ "server": servername, "datetime": datetime.now(), "disk_root": , "phymem":, "cpu": {"user":, "nice":, "system":, "idle":, "irq":,}, }
下面是 python 代碼從系統(tǒng)獲取數(shù)據(jù)(使用 psutil )到 MongoDB 數(shù)據(jù)庫(kù)。我在 MongoDB 中為每個(gè)被檢測(cè)到的機(jī)器創(chuàng)建了一個(gè)集合。
你可以在 MongoDB 中創(chuàng)建一個(gè)多帶帶的 document,包含了每臺(tái)機(jī)器的數(shù)據(jù);這個(gè)依賴于你的需求。因?yàn)槲蚁朊颗_(tái)機(jī)器有一個(gè)多帶帶的頁(yè)面,我用同樣的方式拆分?jǐn)?shù)據(jù)。如果你想把所有機(jī)器的圖表渲染到一個(gè)頁(yè)面中的話,你或許想讓所有機(jī)器的數(shù)據(jù)在一個(gè) document 中。
About the MongoDB Collection我有一個(gè)三個(gè)成員的 MongoDB 副本,設(shè)置名為 rs1。保存數(shù)據(jù)的機(jī)器恰巧是我監(jiān)控的服務(wù)器,example01 和 example02。這第三個(gè)是一個(gè)仲裁者,不保存數(shù)據(jù)。這些 mongoDB 服務(wù)器不需要監(jiān)控,它們可以在任何地方。
我有一個(gè)數(shù)據(jù)庫(kù) reports,我們將把新的 collections 放入這個(gè)數(shù)據(jù)庫(kù)。對(duì)于每臺(tái)機(jī)器,我將有一個(gè) collection 來(lái)包含它的負(fù)載數(shù)據(jù):1440 分每天,每 5 分組抽樣一次,并保存 2 天的數(shù)據(jù),我們需要 576 條記錄(documents)。
(1440/5)*2 = 576 records per server
我不確定我最后要使用多少數(shù)據(jù),因此我預(yù)估了 2k 每個(gè) document,我為每個(gè) document 預(yù)估一個(gè)比較大的大小, 因?yàn)檫@僅僅是個(gè)開(kāi)始,后面我需要收集更多的數(shù)據(jù),結(jié)果是 2k 真的是非??犊?,每個(gè)記錄的平均大小是 200 bytes 左右,但是我沒(méi)有包含任何的網(wǎng)絡(luò)數(shù)據(jù)(并且 disk space 是低耗的)。
576 documents @ 2048 bytes per doc = 1,179,648 bytes
對(duì)于每一臺(tái)機(jī)器需要監(jiān)控的機(jī)器,我創(chuàng)建了一個(gè)固定集合的最大大小上限 1179648 和一個(gè)最大的數(shù)量上限 576 documents:
use reports db.createCollection("example01", {capped:true, size:1179648, max:576}) db.createCollection("example02", {capped:true, size:1179648, max:576})
通過(guò)使用一個(gè)固定集合,我們將保證數(shù)據(jù)是以插入順序保存的,隨著時(shí)間流逝,老的 documents 會(huì)自動(dòng)刪除,因此我們始終有最新的 48 小時(shí)數(shù)據(jù)。
The Data Gathering Code首先,做必須的 imports 并且連接到 MongoDB 實(shí)例:
from datetime import datetime import psutil import pymongo import socket conn = pymongo.MongoReplicaSetClient( "example01.com, example02.com", replicaSet="rs1", ) db = conn.reports
現(xiàn)在為你想要的每一個(gè)數(shù)據(jù)調(diào)用 psutil:
def main(): cpu = psutil.cpu_times_percent() disk_root = psutil.disk_usage("/") phymem = psutil.phymem_usage()
創(chuàng)建一個(gè)字典包含你需要的時(shí)間序列結(jié)構(gòu)數(shù)據(jù)。
doc = dict() doc["server"] = socket.gethostname() doc["date"] = datetime.now() doc["disk_root"] = disk_root.free, doc["phymem"] = phymem.free doc["cpu"] = { "user": cpu.user, "nice": cpu.nice, "system": cpu.system, "idle": cpu.idle, "irq": cpu.irq }
最后,把這個(gè)字典作為一個(gè) document 添加進(jìn)匹配的 MongoDB 集合中。它將被轉(zhuǎn)換成一個(gè) BSON document 當(dāng)它被插入數(shù)據(jù)庫(kù)的時(shí)候,但是結(jié)構(gòu)是一樣的。
if doc["server"] == "example01.com": db.example01.insert(doc) elif doc["server"] == "example02": db.example02.insert(doc)
這里你有代碼來(lái)獲取數(shù)據(jù)并且存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)集合中。所有剩下的部分是運(yùn)行代碼自動(dòng)完成的。
在你想監(jiān)控的每臺(tái)服務(wù)器上設(shè)置一個(gè)定時(shí)任務(wù),每 5 分鐘運(yùn)行一次:
*/5 * * * * /path/to/psutil_script
每個(gè) MongoDB 集合包含 48 小時(shí)的系統(tǒng)性能數(shù)據(jù),隨你操弄。
Part 2: Set up the bottle Server創(chuàng)建一個(gè) bottle 應(yīng)用程序來(lái)查詢 MongoDB集合。
連接 MongoDB,在收到每個(gè)請(qǐng)求服務(wù)器的數(shù)據(jù)后,給每個(gè)對(duì)應(yīng)的服務(wù)器響應(yīng)格式化的數(shù)據(jù)。
from bottle import Bottle import pymongo load = Bottle() conn = pymongo.MongoReplicaSetClient( "example01.com, example02.com", replicaSet="rs1", ) db = conn.reports
這是一個(gè)路由,一個(gè) url 連接。當(dāng)一個(gè)請(qǐng)求進(jìn)來(lái),從 url 中獲取服務(wù)器的名字,然后創(chuàng)建并返回一個(gè)合適的數(shù)據(jù)結(jié)構(gòu)(jqplot 需要的)。
@load.get("/Part 3: Display the Data with jqplot") def get_loaddata(server): data_cursor = list() if server == "example02": data_cursor = db.example02.find() elif server == "example01": data_cursor = db.example01.find() disk_root_free = list() phymem_free = list() cpu_user = list() cpu_nice = list() cpu_system = list() cpu_idle = list() cpu_irq = list() for data in data_cursor: date = data["date"] disk_root_free.append([date, data["disk_root"]) phymem_free.append([date, data["phymem"]) cpu_user.append([date, data["cpu"]["user"]]) cpu_nice.append([date, data["cpu"]["nice"]]) cpu_system.append([date, data["cpu"]["system"]]) cpu_idle.append([date, data["cpu"]["idle"]]) cpu_irq.append([date, data["cpu"]["irq"]]) return { "disk_root_free": disk_root_free, "phymem_free": phymem_free "cpu_user": cpu_user, "cpu_irq": cpu_irq, "cpu_system": cpu_system, "cpu_nice": cpu_nice, "cpu_idle": cpu_idle, }
HTML Page
HTML 頁(yè)是非常簡(jiǎn)單的。
在樣式表中讀取.
編寫一個(gè) div 保存每個(gè)圖表。這以下的示例中我僅僅展示了 cpu_user 數(shù)據(jù)。該模式對(duì)于其他變量是一樣的。
加載 javascript。
你可以把 javascript 從 psmonitor.js 中直接放入頁(yè)面,或者是以一個(gè)文件的形式調(diào)用它(如示例那樣):
The JavaScript (jqplot) CodeLoad Monitoring
完整的代碼在 GitHub 工程中,但是這有 jqplot 代碼片段用來(lái)設(shè)置顯示數(shù)據(jù)。機(jī)器 example01 運(yùn)行的 web 服務(wù)器將返回 json 格式的負(fù)載數(shù)據(jù)。同樣,web 服務(wù)器可以運(yùn)行在任何機(jī)器上,在我的示例中,它發(fā)生在被我們監(jiān)控的服務(wù)器中的一臺(tái)。
每個(gè) plot 的代碼遵循了相同的模式:
發(fā)起一個(gè) AJAX 請(qǐng)求調(diào)用運(yùn)行著 bottle 應(yīng)用的服務(wù)器。
把你想圖表化的數(shù)據(jù)放入一個(gè)變量。
把這個(gè)變量傳遞給 jqplot。
代碼中的 url 包含了 example01 字符串:
url: "http://example01/load/example01"
example01 的第一個(gè)實(shí)例是 web 服務(wù)器的地址,因?yàn)樵摍C(jī)器上運(yùn)行著 bottle 應(yīng)用。第二個(gè)實(shí)例是我們想要數(shù)據(jù)的這臺(tái)服務(wù)器的名字。服務(wù)器名字(
$(document).ready(function(){ var jsonData = $.ajax({ async: false, url: "http://example01/load/example01", dataType:"json" }); var cpu_user = [jsonData.responseJSON["cpu_user"]]; $.jqplot("cpu_user", cpu_user, { title: "CPU User Percent: EXAMPLE01", highlighter: {show: true, sizeAdjust: 7.5}, cursor: {show: false}, axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer, tickOptions:{formatString:"%a %H:%M"}}}, series:[{lineWidth:1, showMarker: false}] }); });
該 javascript 劃分 CPU 用戶百分比;你可以用相同的方式添加另外的 plots,僅僅需要改變變量的名字和標(biāo)題。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/18727.html
摘要:大綱我們需要監(jiān)控兩臺(tái)服務(wù)器來(lái)確保它們是正常的,運(yùn)行期間沒(méi)有內(nèi)存和磁盤使用率問(wèn)題。連接,在收到每個(gè)請(qǐng)求服務(wù)器的數(shù)據(jù)后,給每個(gè)對(duì)應(yīng)的服務(wù)器響應(yīng)格式化的數(shù)據(jù)。 注:原文地址 psutil and MongoDB for System Monitoring 這篇入門文章描述了怎樣創(chuàng)建一系列的圖表來(lái)監(jiān)控一臺(tái)或多臺(tái)服務(wù)器的負(fù)載。使用 Python(psutil 和 bottle),Mon...
摘要:簡(jiǎn)介是一個(gè)跨平臺(tái)庫(kù),能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率包括內(nèi)存磁盤網(wǎng)絡(luò)等信息。它主要應(yīng)用于系統(tǒng)監(jiān)控,分析和限制系統(tǒng)資源及進(jìn)程的管理。它實(shí)現(xiàn)了同等命令行工具提供的功能,如等。 psutil簡(jiǎn)介 psutil是一個(gè)跨平臺(tái)庫(kù)(http://code.google.com/p/psutil/),能夠輕松實(shí)現(xiàn)獲取系統(tǒng)運(yùn)行的進(jìn)程和系統(tǒng)利用率(包括CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)等)信息。它主...
應(yīng)用電腦工作時(shí),有時(shí)不清楚什么軟件或過(guò)程會(huì)占有許多資源,造成開(kāi)展別的任務(wù)后發(fā)生減緩、卡屏的現(xiàn)象。因而,智能監(jiān)控系統(tǒng)資源就會(huì)變得至關(guān)重要。文中用Python撰寫了一臺(tái)超治好的RunCat監(jiān)控應(yīng)用系統(tǒng)軟件,所需要的可以了解一下 引言 大家好!我就是木木子,近來(lái)好懶了哈太熱了.jpg 有空來(lái)給大家升級(jí)一下啦!今天發(fā)布——跟這本文寫姊妹篇哈~ 應(yīng)用Mac電腦工作時(shí),有時(shí)不清楚什么軟件或過(guò)程會(huì)占...
摘要:通過(guò)這個(gè)平臺(tái),可以替你提供諸如配置檢查和優(yōu)化監(jiān)控報(bào)警等功能。首先,它的是獨(dú)立于運(yùn)行的,這意味著獲取各項(xiàng)指標(biāo)的能力會(huì)受到限制。其次,這個(gè)需要跟平臺(tái)通訊??偠灾?,只是將現(xiàn)存的監(jiān)控方式炒冷飯而已。所以我大可放心抬杠,無(wú)需擔(dān)心影響別人家的生意。 對(duì)于 Nginx Amplify 不了解的同學(xué),可以搜索一下,在 Nginx 官網(wǎng)上有介紹。簡(jiǎn)單來(lái)說(shuō),就是你可以在服務(wù)器上安裝一個(gè)開(kāi)源的 Pytho...
摘要:如果使用過(guò),如果有一顆的心的話,一定會(huì)覺(jué)得不但酷炫而且十分實(shí)用。不過(guò)如果想觀察一個(gè)程序從運(yùn)行開(kāi)始到結(jié)束的占用率怎么辦好辦,利用的異步觀察就行。 showImg(https://segmentfault.com/img/remote/1460000018718651?w=1456&h=426); 如果使用過(guò)glances,如果有一顆geek的心的話,一定會(huì)覺(jué)得不但酷炫而且十分實(shí)用。不過(guò)如...
閱讀 2657·2021-11-24 09:39
閱讀 1659·2021-11-24 09:38
閱讀 640·2021-11-22 14:44
閱讀 1896·2021-11-18 10:02
閱讀 2602·2021-11-18 10:02
閱讀 1167·2021-10-14 09:43
閱讀 4258·2021-09-29 09:35
閱讀 545·2021-07-30 15:30