自动化运维监控展示三剑客:Telegraf+Influxdb+ Grafana。
Telegraf 收集数据:是一个用 Go 编写的代理程序,可收集系统和服务的统计数据,并写入到 InfluxDB 数据库。内存占用小,通过插件系统可轻松添加支持其他服务的扩展。
Influxdb存储数据: 是一个开源的分布式时序、时间和指标数据库,使用 Go 语言编写,无需外部依赖。
Grafana:展示数据。

infludb中存储的是时间序列数据,比如说某个时间点系统负载、服务耗时等信息,时间序列数据可以包含多个值。关于什么是时间序列数据,简单来来说就是数据是和一个时间点关联的,结合mysql中的记录与id关系来看就是时间序列数据的主键就是时间点(timestrap)。
infludb中的一条数据至少包括measurement(对应mysql中表概念)、timestamp、至少一个k-v结构的field,再加上0个或者多个k-v结构的tag。对比mysql来看,measurement就是一张表,其主键是timestamp时间戳,tag和field对应就是表中列,tag和field都是k-v接口,k对应列的名字,v对应该列存储的值,tag和field不同的是,tag是有索引的而field没有(如果查询条件为tag则会扫描所有查询到的数据),对于mysql表的有索引列和无索引列。注意mysql中的表需要提前定义结构,而influxdb中的measurement无需提前定义,其null值也不会被存储。

points的数据结构:

下载地址:https://docs.influxdata.com/influxdb/v2.4/install/?t=Windows

打开cmd,切换到influxdb目录,运行,如下图


http://localhost:8086/

输入下面初始用户名、密码、org、bucket。

就可以进入下面页面了。

访问influxdb需要token,可以到如下位置找到


下面代码利用point写入。首先pip install influxdb-client
from datetime import datetime
import time
from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS
# You can generate an API token from the "API Tokens Tab" in the UI
token = "z-6hRtR4VeNQZCVQGmvOm5I-NHdxXC-lo4GwIDDt2fIX_vvVnZjDhZYtkJMF01BTZs_SqqunX6Tr7KXVYDyZZA=="
org = "test"
bucket = "test1"
with InfluxDBClient(url="http://localhost:8086", token=token, org=org) as client:
write_api = client.write_api(write_options=SYNCHRONOUS)
for i in range(30):
point = Point("mem").tag("host", "host1").field("used_percent", 23.43234543+i).time(datetime.utcnow(), WritePrecision.NS)
write_api.write(bucket, org, point)
time.sleep(1)
client.close()
我们在上节通过python写到influxdb的名为mem的measurement. 如下图filter中选择的men。就可以在上面看到数据了。

下载:https://grafana.com/grafana/download?platform=windows

下载后直接运行安装。
默认端口号为3000,但有可能与其他端口号冲突,启动不了,可在defaults.ini中修改为其他。我改成了8087.

打开cmd,到安装目录:C:\Program Files\GrafanaLabs\grafana\bin,运行grafana-server.exe启动。

我用chrome访问报错“If you’re seeing this Grafana has failed to load its application files”

尝试修改serve_from_sub_path=true,allow_embedding = true都不起作用。最后下载了firefox,可以使用。http://localhost:8087/

输入默认的账号密码:admin\admin. 重置完密码可以使用:

选择首页的DATA SOURCES. 接着选择influxdb。

Influxdb 2 需要使用Flux查询语言,不是influxQL(influxdb 1使用这个,类似sql).

输入url:http://localhost:8086

输入org、token、bucket。测试成功。

新建New dashboard,然后输入查询语句,展示下图。
FLux查询语句如下:
from(bucket: "test1")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "mem")
|> filter(fn: (r) => r._field == "used_percent")

在influx官网可以下载telegraf。地址:https://www.influxdata.com/get-influxdb/。

Windows版直接解压缩即可:

我直接修改telegraf.conf里的influxdb_v2不行,后台报“[outputs.influxdb] Failed to write metric (will be dropped: 401 Unauthorized):”。
所以,现在influxdb里新建telegraf配置,然后覆盖telegraf.conf解决的。
第一步,loaddata选择telegraf,然后create configuration。

第二步,选择system。

第3步,给配置随便起个名字。

第4步,点击finish。

第5步,点击刚刚建立的配置。

全量负责下面配置

第6步,将上面的配置直接全量覆盖telegraf的telegraf.conf。并修改token。


上面集成完influxdb后,就可以启动telegraf了。支持cmd里运行telegraf即可。

如2.7节讲的,在data explorer中可以查看

点击上图的SCRIPT EDITOR可以查看flux查询语言,会在grafana中使用。

from(bucket: "telegraf_test")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "cpu")
|> filter(fn: (r) => r["_field"] == "usage_system")
|> filter(fn: (r) => r["cpu"] == "cpu-total")
|> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
|> yield(name: "mean")
我尝试import现有的模板,始终不展示数据,或者顶多展示个CPU,故我直接新建dashboard了,然后采用flux语言自己查数据。
如下图新建dashboard。

新建一个panel

将上一节的flux语言copy到下图相应位置,就可以了。然后save。

保存后如下图。

类似的,可以再加个内存的。
