持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
引子
前文《Zabbix 5.0 监控实战(一)服务器的基本性能指标监控》中我们使用了开箱即用的模板,这些模板丰不丰富?好不好用?满不满足基本指标的监控需求?答案无疑是肯定的。不过,出于各种各样的原因,可能我们就是想要创建一套自己的模板,比如一套更为整洁、清爽,更符合使用者审美的模板。
本篇主要介绍如何从 0 到 1 ,配置一套完全自定义的模板(主机群组、主机在前文中已经创建,本篇不再赘述)。
1 创建模板
进入菜单:【Configuration】 -> 【Template】,再点击右上角的【Create template】:
Zabbix 要求一个模板必须至少隶属于一个主机群组,这里填写完模板名称后还需要选择主机群组:
由于我们想要创建一个清爽的模板,这里就不再关联已有的任何模板了。
2 创建应用集
应用集不是必须的,创建应用集能够对后续的监控项进行合理的归类分组。
选择刚刚新建的模板,点击模板名称右侧的【Applications】,再点击右上角的【Create application】,输入应用集名称即可:
这里我们为基础模板创建 4 类基础的应用集:CPU、Memory、Network 和 Hard Disk 。
3 创建监控项
监控项的配置最为复杂,所需填写的信息项很多都很有讲究,对于新接触 Zabbix 的人来说其实是很难上手的。笔者认为最好的上手方式,就是直接去借鉴开箱即用的模板中的监控项配置。虽然是 CV 大法,但重要的是我们在自己动手实践的这个过程中,去体会、理解,最终掌握所实践的知识。
说回到配置页面,我们先整体上看一下配置监控项所需要填写的信息,点击模板名称右侧的【Items】,再点击右上角的【Create item】:
3.1 关键信息项说明
3.1.1 类型
Zabbix 5.0 可以选择 17 种监控项 Type(类型),这里仅介绍本文涉及到的 3 种,可以满足基本的监控要求:
(1)Zabbix agent:默认的监控项类型,此类监控项与 Zabbix Agent 进行通信进而获取监控数据。通信是过程由 Zabbix Server 向 Agent 索要数据,也称作被动模式。
(2)Zabbix agent (active):同样与 Zabbix Agent 进行通信进而获取监控数据,但通信过程是由 Agent 主动上报数据给 Zabbix Server ,也称作主动模式。
我们来细谈一下 Zabbix agent 的被动模式与主动模式的区别与优缺点:
-
被动模式是默认的工作模式,我们可以看到开箱即用的模板中,绝大多数的监控项都是此类型。
-
被动模式的优点就是配置简单,在 Zabbix Agent 安装完成后,即可使用。而主动模式则需要更多额外的配置才能使用:
-
安装 Zabbix Agent 的主机,其
zabbix_agentd.conf
中需要配置ServiceActive
,指向 Zabbix Server 的 IP 地址; -
安装 Zabbix Agent 的主机,其
zabbix_agentd.conf
中还需要配置Hostname
,在 Zabbix Server 配置页面中添加主机时,主机的名称必须与这个值保持一致,才能使Zabbix agent (active)
类型的监控项生效。
-
-
在大多数的快速检查的情况下,主动模式的性能更好,主动模式下, Zabbix Server 不需要向 Agent 去索取监控值,而这个索取的过程中 Zabbix Server 需要等待 Agent 上的脚本执行完成。不过在监控数据能够快速返回的情况下,其实使用默认的被动模式,也不会有太大问题。
-
当一个监控项需要执行一个较慢的脚本来获取监控数值时,此时就不应使用被动模式了,而是应该使用主动模式, Agent 执行脚本的耗时就不要让 Zabbix Server 一同承受了。
注意:
当一个主机上只有Zabbix agent (active)
类型的监控项,而没有Zabbix agent
类型的监控项时,该主机的 ZBX 图标是不会亮起的:
(3)Dependent item(从属监控项):从属监控项,可以基于一个现有的监控项,在其获取到新的监控值时,根据主项的值,自动计算得到从属监控项的值。从属监控项仅可以依赖于一个监控项,不过这个被依赖的监控项可以同样是一个从属监控项(这种依赖最大不可以超过三层)。
举个例子,我们有一个监控项 CPU IDLE TIME ,它能够获取 CPU 的空闲时间比率,如果我们想要监控 CPU 的利用率,就可以使用 【 100% - CPU 空闲时间比率 】 这样的方式,在 Zabbix Server 得到空闲率的同时计算得到利用率。
3.1.2 键值
Key(键值)是一个在单主机内唯一的标识。
我们这样理解键值,键值会告诉 Zabbix Server 或 Agent 去执行某一个命令,或引导它们去执行某一个脚本,从而获取到监控值。
不同的监控项,其支持的值也是有差异的。当我们的监控项是 Zabbix Agent
或 Zabbix agent (active)
类型时,可用的键值通过官方文档快速获取。
当我们的监控项是 Dependent item
类型时,键值由我们自行定义就好。
3.1.3 数据类型与单位
-
Type of information(信息类型):包含了整数、浮点数、短字符、日志、长文本,我们常用整数与浮点数。
-
Units(单位):这一项不是必录的,当我们设置了单位, Zabbix 会将所得到的数据进行转换,使其匹配我们所设置的单位。
3.1.4 更新间隔与保留时长
-
Update interval(更新间隔):每隔多长时间检索一次监控项的新值。
-
History storage period(历史数据保留时长):历史监控数据保留多久。
-
Trend storage period(趋势数据保留时长):趋势数据保留多久。
什么是趋势数据?
Zabbix 为每一个监控项保留其每小时内的最大值 / 最小值 / 平均值 / 统计值,这些数据就是趋势数据,它们用来形成趋势图形和历史图形。
这三个指标的配置十分重要,因为它们涉及到产生数据的体量,也就是涉及到数据库存储所需的磁盘空间。如果随意的将更新间隔设置的很小,保留数据的时间又很长,则很有可能会撑爆数据库。
这里我们细谈一下用于支撑 Zabbix Server 的数据库的磁盘需求:
数据库磁盘空间 = 配置文件数据 + 历史数据 + 趋势数据 + 事件数据
-
配置文件数据:这部分大小固定,在 10M 左右。
-
历史数据:大致的计算公式如:监控项总数 / 秒级更新频率 * 秒级保留时间 * 每个监控值的大小 ,其中数值类型的值大概占 90 个字节,而长文本、日志类型的值,可以按大约 500 个字节计算。
-
趋势数据:趋势数据的更新频率是固定的,因此计算公式为:监控项总数 / 3600 * 秒级保留时间 * 每个监控值的大小 。
-
事件数据:上篇中我们使用了自动发现、自动注册功能,这样的功能就会产生相应的事件,事件数据所需磁盘空间的计算公式为:每秒产生事件数 * 秒级保留时间 * 每个事件的大小 ,其中每一个事件大约需要 170 字节的磁盘空间。每秒产生事件数是无法预估的,我们在估算数据库所需磁盘空间时,可以按最坏的情况估算事件数据,即每秒产生 1 个事件。
3.2 实操
3.2.1 最普通的监控项
了解了上面的一些基础概念,我们就可以创建出最普通的监控项了。我们创建以下 Zabbix agent
类型的监控项(更新间隔统一设置为 1m ):
名称 | 描述 | 键值 | 数据类型 | 单位 | 所属应用集 |
---|---|---|---|---|---|
Available memory | 可用内存 | vm.memory.size[available] | 整数 | B | Memory |
Avaliable memory in % | 可用内存率 | vm.memory.size[pavailable] | 浮点数 | % | Memory |
Total memory | 内存总量 | vm.memory.size[total] | 整数 | B | Memory |
CPU idle time | CPU 空闲时间比率 | system.cpu.util[,idle] | 浮点数 | % | CPU |
CPU iowait time | CPU IO 等待时间比率 | system.cpu.util[,iowait] | 浮点数 | % | CPU |
CPU system time | CPU 系统时间比率 | system.cpu.util[,system] | 浮点数 | % | CPU |
CPU user time | CPU 用户时间比率 | system.cpu.util[,user] | 浮点数 | % | CPU |
Hard disk utilization on / | 根目录硬盘空间使用率 | vfs.fs.size[/,pused] | 浮点数 | % | Hard Disk |
Total capacity on / | 根目录总硬盘空间 | vfs.fs.size[/,total] | 整数 | B | Hard Disk |
Uesd capacity on / | 根目录已使用硬盘空间 | vfs.fs.size[/,used] | 整数 | B | Hard Disk |
3.2.2 带有预处理的监控项
下面我们来创建两个稍微特殊一点的监控项,它们还是 Zabbix agent
类型:
名称 | 描述 | 键值 | 数据类型 | 单位 | 所属应用集 |
---|---|---|---|---|---|
Network incoming on eno0 | 网卡入口流量速率 | net.if.in[eno0,bytes] | 整数 | bps | Network |
Network outcoming on eno0 | 网卡出口流量速率 | net.if.out[eno0,bytes] | 整数 | bps | Network |
因为我们需要得到的是流量速率,也就是一个差值,此时我们就需要对获取的监控数据进行预处理,在监控项创建页面中,点击【Preprocessing】选项卡,然后增加 1 条预处理规则,这里直接选择【Change per second】,就可以让我们的监控项存储差值了:
3.2.3 从属监控项
接下来再复杂一点点,我们创建两个类型为 Dependent item
的监控项,这跟创建 Zabbix agent
类型的监控项时,所需填写的信息有一点点区别:
-
此时键值直接录入而不在可选;
-
需要选择一个主监控项;
-
从属监控项不能设置更新间隔,它的更新间隔同主监控项。
我们创建以下两个从属监控项:
名称 | 描述 | 键值 | 主监控项 | 数据类型 | 单位 | 所属应用集 |
---|---|---|---|---|---|---|
CPU utilization | CPU 使用率 | system.cpu.util | CPU idle time | 浮点数 | % | CPU |
Memory utilization | 内存使用率 | vm.memory.utilization | Avaliable memory in % | 浮点数 | % | Memory |
这两个监控项都是基于主监控项进行简单的减法计算,计算的规则需要写在预处理中,预处理规则选择 JavaScript
类型,参数设置为 return (100 - value)
:
3.2.4 确认监控项生效
监控项创建完毕后,我们将模板挂载至某一主机上,稍等一会,然后进入菜单:【Monitoring】 -> 【Hosts】,点击该主机的【Latest data】链接,看到每一个监控项都收到了数据,就可以确认监控项已经生效了(注意,从属监控项的数据不会在此体现):
4 创建触发器
触发器能够通过一个或多个监控项来评估主机某一方面的状态(普通信息、警告、一般严重、十分严重、灾难等)。
我们基于 CPU 使用率来创建一个触发器,点击模板名称右侧的【Triggers】,再点击右上角的【Create trigger】:
-
Name:指定了触发器的名称,同时也是发生问题时的提示语;
-
Severity(严重性):包含未分类、普通信息、警告、一般严重、十分严重、灾难 6 种状态,每种状态对应着不同的颜色;
-
Expression(表达式):点击右侧的【 Add 】按钮,新增逻辑表达式:
-
Item(监控项):选择作为逻辑判断条件基础的监控项,这里是 CPU 使用率;
-
Function(函数):这里我们选择
min()
取最小值; -
Last of (T)(最后一段时间内的所有值或最后几个值):这里我们设置为最后 3 个值;
-
Result(结果):这里设置为
> 80
,连起来的语义就是 CPU 利用率的最后 3 个值中的最小值大于 80 。
这样我们就创建了一个简单的触发器,相似的,我们还可以创建以下触发器:
当监控指标达到了触发器所设置的逻辑条件时,我们可以在监控大屏( Dashboard )中看到相应的告警信息:
5 创建图形
接下来创建图形,来展示监控数据。点击模板名称右侧的【Graphs】,再点击右上角的【Create graph】可以进入到图形创建界面。
5.1 Normal(普通图形)
普通图形是使用最广泛的图形,也就是折线图。
以 CPU 利用率为例,我们看一下配置:
像百分率这样的监控数据,我们将 Y 轴的最小、最大值设置为固定的 0 和 100 ( X 轴为时间轴,不能被手动设置),监控项的折线可以更改样式,这里我们先使用最普通的 Line
看一下效果:
再配置一张网络流量图:
此时 Y 轴的最小、最大值根据实际的监控数据自动计算,再将折线样式修改为 Gradient line
渐变线,效果如下图:
5.2 Stacked(堆叠图)
堆叠图会以填充区域的形式展现,多个指标堆叠在一起。
CPU 的详细使用情况,适合以堆叠图展示:
图形效果如下:
5.3 Pie(饼图)
饼图适合展示只关心当前状况而不关系历史趋势的监控项,比如硬盘使用状况:
这里注意总量指标的类型要设置为 Graaph sum
,饼图效果如下:
5.4 Exploded(分解饼图)
分解饼图跟饼图的配置没有什么区别,只是在图形展示上有些不一样而已:
6 创建聚合图形
聚合图形就是将多个图形放在 m 行 * n 列的一屏中进行展示,详细的步骤在上篇中已经讲解过了,本篇不再赘述。
结语
自己配置了一大堆,回头看看开箱即用的模板,是真香啊!