成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 psutil 和 MongoDB 做系統(tǒng)監(jiān)控

Genng / 2422人閱讀

摘要:大綱我們需要監(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)行 topds 來(lái)找出發(fā)生了什么。我想要一個(gè)有最新圖表的 web 頁(yè)面可以看一眼,每臺(tái)服務(wù)器一個(gè)頁(yè)面。

整個(gè)工作流遵循以下三個(gè)步驟:

獲取系統(tǒng)數(shù)據(jù)存入 MongoDB(使用 psutilcron

設(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("/")
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,
            }
Part 3: Display the Data with jqplot

HTML Page

HTML 頁(yè)是非常簡(jiǎn)單的。

在樣式表中讀取.

編寫一個(gè) div 保存每個(gè)圖表。這以下的示例中我僅僅展示了 cpu_user 數(shù)據(jù)。該模式對(duì)于其他變量是一樣的。

加載 javascript。

你可以把 javascript 從 psmonitor.js 中直接放入頁(yè)面,或者是以一個(gè)文件的形式調(diào)用它(如示例那樣):





Load Monitoring





    
閱讀需要支付1元查看
<