InfulxDb+grafana監控Windows運行狀態

看一下效果圖:
在這裏插入圖片描述

InfulxDb

官方網站:https://portal.influxdata.com/downloads/

docker

docker pull influxdb 安裝influxdb數據庫
docker pull quay.io/influxdb/chronograf:1.8.4 chronograf可視化工具(非必要,只是可以web訪問,類似PHPMySQL)

docker run -d -p 8086:8086 -v /var/lib/influxdb:/var/lib/influxdb --name influxdb influxdb啓動influxdb,其中-v參數表示將docker內的文件夾映射到本地,冒號前爲本地路徑,冒號後爲docker內路徑。-p表示映射端口,建議不使用默認的8086端口,比如-p 2222:8086

Windows

chronograf Windows可執行文件下載地址
influxdb Windows可執行文件下載地址

Windows運行很簡單:influxd.exe -config influxdb.conf(注意不是少打了一個b)
當然運行之前可以修改influxdb.conf配置文件,主要修改字段:

bind-address = "0.0.0.0:8088" 
[meta]
  dir = "G:/Grafana/influxdb/meta"

[data]
  dir = "G:/Grafana/influxdb/data"
  wal-dir = "G:/Grafana/influxdb/wal"
[http]
  auth-enabled = true # 開啓http密碼驗證

不過linux還是建議docker安裝,Windows可以選擇可執行文件,也可以docker,就看你是不是Windows10專業版了(因爲Windows10專業版安裝docker很簡單)。

創建管理員用戶

啓動influxdb後,運行influxdb(windows先在cmd下cd到下載的influx.exe所在目錄然後輸入influx.exe)命令,輸入一下命令即可
create user admin with password ‘admin’ with all privileges
注意修改admin賬號和密碼兩個的值, 如果不是管理員無法操作數據庫,不知道怎麼處理,那就直接使用管理員吧

開啓http auth驗證

只需要按上面的配置文件修改就行,這裏說一下如何修改docker內的文件,直接看命令( 命令中的influxdb:爲docker啓動時-name指定的名稱,也可以是容器ID):
docker cp ./influxdb.conf influxdb:/etc/influxdb/influxdb.conf
當然這個命令也支持將docker內的文件拷貝出來
docker cp influxdb:/etc/influxdb/influxdb.conf ./influxdb.conf

python influxdb

influxdb的語句其實和MySQL的差不多。而且python庫也封裝了一些常用的命令,只需調用函數即可執行相應的功能,當然查詢語句還是要自己寫的。

具體方法請參考官方文檔:https://influxdb-python.readthedocs.io/en/latest/include-readme.html

grafana

安裝

如果是Windows,直接下載可執行文件安裝即可(我沒試過就不詳細說了),下載地址:https://grafana.com/grafana/download?platform=windows

docker運行:
docker run -d -p 3000:3000 --name=grafana -v grafana-storage:/var/lib/grafana grafana/grafana
命令中grafana-storage爲本地文件夾路徑:比如也放在/var/lib/grafana

docker更新grafana:

docker pull grafana/grafana   #重新pull最新版本
docker stop my-grafana-container   # 停止已運行容器
docker rm my-grafana-container   # 刪除舊容器

使用

瀏覽器訪問IP:端口進入登錄頁面,IP看你運行在哪了,端口默認3000。用戶名密碼都是admin,第一次登錄會提示修改密碼。

進入頁面後默認大概是這樣的:(開始是沒有添加data source)
在這裏插入圖片描述
我們先添加一下data source(數據來源),點擊左邊像設置(Configuration)一樣按鈕,然後點擊data sources,之後點擊add data source。選擇influxdb之後進入:
在這裏插入圖片描述

name任意,主要看http的URL是influxdb的IP和端口,然後是InfluxDB Details這一欄,需要填寫database(數據庫),User(用戶名),password(密碼),http method任意,get和post都行,我選的是post。然後點擊save & test,如果顯示綠色的提示說明保存測試成功,如果是紅色的則數據庫連接有誤。

添加數據

grafana的準備工作就做完了,接着就需要往數據庫中保存數據了。現成的工具有telegraf、collectd等。telegraf有exe可執行文件,用起來感覺還不錯。而collectd主要是Linux用的,Windows雖然有可執行文件,但體驗不怎麼樣,需要付費升級商業版。

官方下載地址:https://portal.influxdata.com/downloads/
如果訪問慢的地址:https://lanzous.com/icdvnhg

啓動:telegraf.exe -config telegraf.conf
注意啓動之前修改配置文件,看一些主要修改字段:

[[outputs.influxdb]]
	urls = ["http://127.0.0.1:8086"]  # influxdb的鏈接
	database = "telegraf"    # 數據庫名,不存在的話默認會自動創建
 	username = "" # influxdb配置的用戶名和密碼
    password = ""

運行之後可以使用chronograf來看一下數據庫裏面有沒有數據,也可以直接命令行進入數據庫。(chronograf很簡單就不多贅述了)

進入數據庫的命令:influx -host 127.0.0.1 -port 8086 -username admin -password admin(注意修改後面的參數值),Windows需要下載可執行文件influx.exe,下載路徑:https://portal.influxdata.com/downloads/。

添加grafana圖表

既然數據庫裏有數據了,那麼接下來我們通過grafana展示一下數據。
圖表就不自己建了,我們也使用現成的(後面提一下怎麼自己構建圖表)。公開的圖表下載地址:
https://grafana.com/grafana/dashboards?collector=Telegraf&dataSource=influxdb&direction=asc&orderBy=name&search=Windows

如果需要其他圖表可以自己更改篩選條件,在網頁的左邊就有選項

這裏面有幾個現成的圖表,我們隨便選擇一個複製鏈接,比如第二個:https://grafana.com/grafana/dashboards/1902

接着打開grafana的網頁端,點擊左邊的+好後點擊import:
在這裏插入圖片描述
Grafana.com Dashboard這一欄中填剛纔複製的地址,第二欄空着不管他,點擊導入,
在這裏插入圖片描述
folder應該只有一個選項,選擇他就行,telegraf選擇開始添加的數據庫。

接着就可以看到telegraf保存的系統狀態了,不過有很多圖表可能沒數據,原因就需要你自己一個一個看了,可能是圖表查詢語句錯了,也可能telegraf沒有保存相應的數據。

自建圖表

還是點擊左邊的加號,創建dashboard,
在這裏插入圖片描述
左邊的add query是使用默認的Graph面板(panel),而右邊則是選擇面板。面板有很多,具體參考官方文檔。更簡單的做法是參考你前面導入的圖表,看一下他們的查詢語句和一些配置就知道該怎麼做了,如果裏面有一些選項不知道是幹什麼用的,點一下看看有什麼變化可能就明白了。

我們直接點擊add query,進入:
在這裏插入圖片描述

1、Query

填寫查詢語句的,Query後面是數據庫的名稱(也就是前面添加的data source)。下面的就是查詢語句了,簡單說一下:

FROM default select measurement WHERE default默認就行,當然你選擇另外一個autogen也一樣,這是由於influxdb數據庫的原因,influxdb直接查詢數據庫下的某個measurement需要這樣寫:select * from 數據庫名.autogen.measurement名。當然更常用的是使用如下語句查詢, 這樣就可以省略autogen:

use 數據庫名
select * from measurement名

其中measurement類似於表一樣,如果數據庫配置正確的話,點擊select measurement 應該會出現所有的表。

第二行的SELECT很明顯就是選擇字段了,第二個是選擇聚合函數,值得注意的是,如果不選擇聚合函數,即使數據庫裏有數據,圖表也不會顯示。GROUP BY一般默認即可,當然也可以自己修改,FORMAT AS也是默認的,ALIAS BY表示取別名,當你添加了兩個以上的查詢語句時,用於顯示Legend來區分。

2、Visualization

圖表的一些設置,這個不好細說,另外我也剛接觸只會皮毛就不獻醜了。如果不知道某個選項什麼作用,點一下看看有什麼變化吧。也可以參考公開的圖表怎麼設置的。

3、General

修改標題和描述用的

4、Alert

告警,應該是監控值有沒有異常,如果有則發送郵件到指定郵箱(需提前配置發件郵箱),當然不一定是郵件還有其他類型。沒用過,不知道怎麼發送。而且使用了變量的圖表還無法使用這個功能,會出現Template variables are not supported in alert queries,只有Graph面板能使用這個功能。
在這裏插入圖片描述
圖片來自:https://www.jianshu.com/p/2b230390f37e

其他我就不介紹了,因爲我也不會。最後說一點:頁面右上角有一個刷新的圖表,可以刷新數據,也可以選擇自動刷新的時間間隔。

自建數據

前面使用了telegraf來將Windows的一些狀態保存在數據庫,現在我們說一下另一個神器的使用:AIDA64,至於這個有多神我就不描述了。雖然它功能十分強大,但現在只使用它的系統監控功能,先看一下AIDA的設置:
在這裏插入圖片描述
它可以將監控信息保存在文件,也可以發送到郵箱,甚至顯示到桌面的任務欄等。當然這些我都沒用過,我使用的是它將數據實時保存在共享內存中(在外部程序這個選項中),我們可以將所需要的數據勾選,然後通過編程語言來將共享內存中的數據同步到數據庫,這裏我使用的是Python。軟件設置只需要在外部程序選項中勾選允許共享內存,另外可以選擇性勾選需要的數據,也可以簡單粗暴的全部勾選。

Python代碼:

import re
import time
from datetime import datetime
from influxdb import InfluxDBClient
from ctypes import windll, c_char_p, c_int

tvid = '12345678'  # 用於grafana區分機器


message = windll.kernel32.OpenFileMappingW
message.restype = c_int

client = InfluxDBClient(host='', port=8086, username='', password='', database='')

handle = message(1, False, "AIDA64_SensorValues")

if handle:
    view = windll.kernel32.MapViewOfFile
    view.restype = c_char_p
    while True:
        xml = view(handle, 1, 0, 0, 256)
        re_ = r'<id>(.*?)</id><label>(.*?)</label><value>(.*?)</value>'
        data = {}
        data['tvid'] = tvid
        for i in re.findall(re_, xml.decode()):
            try:
                data[i[0].lower()] = int(i[2])
            except ValueError:
                try:
                    data[i[0].lower()] = float(i[2])
                except ValueError:
                    data[i[0].lower()] = i[2]
        d = {
            "measurement": "windows",
            "time": datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'),
            "tags": {
                'tvid': tvid
            },
            "fields": data
         }  
        if not client.write_points([d]):
            break
        time.sleep(4.99)
            
else:
    print(0)

其他可以默認,注意修改InfluxDBClient的參數。

查看共享內存有沒有數據:

from ctypes import windll, c_char_p, c_int

message = windll.kernel32.OpenFileMappingW

message.restype = c_int

handle = message(1, False, "AIDA64_SensorValues")

if handle:
    view = windll.kernel32.MapViewOfFile
    view.restype = c_char_p
    print(view(handle, 1, 0, 0, 256))
else:
    print(0)

分享一下我用的AIDA64:https://lanzous.com/icdysif

我的圖表json(可以點擊+號 import,粘貼json導入),注意修改json中DataSource,我的是InfluxDB。有點大,放文件了:https://lanzous.com/icdz81e

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章