InfulxDb+grafana监控Windows运行状态

1,240 阅读9分钟

看一下效果图: 在这里插入图片描述

InfulxDb

官方网站: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库也封装了一些常用的命令,只需调用函数即可执行相应的功能,当然查询语句还是要自己写的。

具体方法请参考官方文档:influxdb-python.readthedocs.io/en/latest/i…

grafana

安装

如果是Windows,直接下载可执行文件安装即可(我没试过就不详细说了),下载地址:grafana.com/grafana/dow…

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虽然有可执行文件,但体验不怎么样,需要付费升级商业版。

官方下载地址:portal.influxdata.com/downloads/ 如果访问慢的地址: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,下载路径:portal.influxdata.com/downloads/。

添加grafana图表

既然数据库里有数据了,那么接下来我们通过grafana展示一下数据。 图表就不自己建了,我们也使用现成的(后面提一下怎么自己构建图表)。公开的图表下载地址: grafana.com/grafana/das…

如果需要其他图表可以自己更改筛选条件,在网页的左边就有选项

这里面有几个现成的图表,我们随便选择一个复制链接,比如第二个:grafana.com/grafana/das…

接着打开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面板能使用这个功能。 在这里插入图片描述 图片来自:www.jianshu.com/p/2b230390f…

其他我就不介绍了,因为我也不会。最后说一点:页面右上角有一个刷新的图表,可以刷新数据,也可以选择自动刷新的时间间隔。

自建数据

前面使用了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:lanzous.com/icdysif

我的图表json(可以点击+号 import,粘贴json导入),注意修改json中DataSource,我的是InfluxDB。有点大,放文件了:lanzous.com/icdz81e