zabbix系列:(二)zabbix监控项(items)基础

admin 2021年01月17日 3,130次浏览

  ---------------  最后编辑时间:2022年7月26日 --------------- 

zabbix中的监控项(items)主要是对目标设备的各项指标数据进行采集,处理,是监控系统中的核心部分,本文将简单介绍监控项的配置管理

1、item 基础

1.1、监控项的含义

监控项(items)就是监控指标获取数据的方式、数据类型、更新数据时间间隔、历史数据保留时间、趋势数据保留时间、监控项的分组等指标

1.2、zabbix5.0 LTS 支持的监控方式

此处仅对部分常用监控方式做简单介绍,此处没有介绍的监控方式和具体 key 的配置,请点击相关监控方式,参见官方文档

(1)、Zabbix agent

agent 用于从 zabbix-agent 采集数据,其工作方式包括被动模式和主动模式两种,在实际使用过程中,建议使用主动模式,这样的好处是减小服务器的开销

Zabbix agent 支持的 key

  • 网卡流量

    # 网络冲突数量
    net.if.collisions[if]
    # 网络接口列表,用于低级发现
    net.if.discovery
    # 网卡流入量统计
    net.if.in[if,<mode>]
    # 网卡流出量统计
    net.if.out[if,<mode>]
    # 网卡的进出流量统计信息的总和
    net.if.total[if,<mode>]
    
  • 网络连接相关

    # 检查此TCP端口是否处于监听状态
    net.tcp.listen[port]
    # 检查是否可以将TCP连接到指定的端口
    net.tcp.port[<ip>,port]
    # 检查服务是否正在运行并接受TCP连接
    net.tcp.service[service,<ip>,<port>]
    # 检测TCP服务性能
    net.tcp.service.perf[service,<ip>,<port>]
    # 检测UDP端口是否处于监听状态
    net.udp.listen[port]
    # 检查服务是否正在运行并能响应UDP请求
    net.udp.service[service,<ip>,<port>]
    # 检测UDP服务的性能
    net.udp.service.perf[service,<ip>,<port>]
    # 检查DNS服务是否开启
    net.dns[<ip>,name,<type>,<timeout>,<count>,<protocol>]
    # 执行一个DNS查询
    net.dns.record[<ip>,name,<type>,<timeout>,<count>,<protocol>]
    
  • 进程相关

    # 系统支持的打开文件的最大数量
    kernel.maxfiles
    # kernel.maxproc
    kernel.maxproc
    # 进程CPU利用率百分比
    proc.cpu.util[<name>,<user>,<type>,<cmdline>,<mode>,<zone>]
    # 用户进程使用的内存
    proc.mem[<name>,<user>,<mode>,<cmdline>,<memtype>]
    # 进程数量
    proc.num[<name>,<user>,<state>,<cmdline>,<zone>]
    
  • CPU 和内存相关

    # 检测到的CPU/CPU内核列表
    system.cpu.discovery
    # 设备中断数
    system.cpu.intr
    # CPU负载
    system.cpu.load[<cpu>,<mode>]
    # CPU的数量
    system.cpu.num[<type>]
    # 上下文交换的数量
    system.cpu.switches
    # CPU利用率
    system.cpu.util[<cpu>,<type>,<mode>,<logical_or_physical>]
    # 交换(从设备到内存)统计
    system.swap.in[<device>,<type>]
    # 交换(从内存到设备)统计
    system.swap.out[<device>,<type>]
    # 交换空间大小(以字节为单位)或百分比(total)
    system.swap.size[<device>,<type>]
    # 内存总大小
    vm.memory.size[<mode>]
    
  • 硬盘 I/O 相关

    # 磁盘读取统计信息
    vfs.dev.read[<device>,<type>,<mode>]
    # 磁盘写入统计信息
    vfs.dev.write[<device>,<type>,<mode>]
    # inode数量
    vfs.fs.inode[fs,<mode>]
    
  • 文件系统相关

    # 文件checksum校验
    vfs.file.cksum[file]
    # 检索文件的内容
    vfs.file.contents[file,<encoding>]
    # 检测文件是否存在
    vfs.file.exists[file,<types_incl>,<types_excl>]
    # 文件的MD5校验
    vfs.file.md5sum[file]
    # 查找文件中的字符串
    vfs.file.regexp[file,regexp,<encoding>,<start line>,<end line>,<output>]
    # 在文件中查找字符串
    vfs.file.regmatch[file,regexp,<encoding>,<start line>,<end line>]
    # 文件大小
    vfs.file.size[file]
    # 文件时间信息
    vfs.file.time[file,<mode>]
    # 挂载的文件系统及其类型的列表
    vfs.fs.discovery
    # 以字节或占总磁盘空间的百分比表示的磁盘空间
    vfs.fs.size[fs,<mode>]
    # 目录数量统计
    vfs.dir.count[dir,<regex_incl>,<regex_excl>,<types_incl>,<types_excl>,<max_depth>,<min_size>,<max_size>,<min_age>,<max_age>,<regex_excl_dir>]
    
  • 操作系统相关

    # 系统启动时间
    system.boottime
    # 机架信息
    system.hw.chassis[<info>]
    # CPU信息
    system.hw.cpu[<cpu>,<info>]
    # 列出PCI或者USB设备
    system.hw.devices[<type>]
    # 列出MAC地址
    system.hw.macaddr[<interface>,<format>]
    # 系统时间
    system.localtime[<type>]
    # 在主机上运行指定的命令
    system.run[command,<mode>]
    # 系统信息
    system.stat[resource,<type>]
    # 软件架构信息
    system.sw.arch
    # 操作系统信息
    system.sw.os[<info>]
    # 列出已安装的软件包
    system.sw.packages[<package>,<manager>,<format>]
    # 系统相关信息
    system.uname
    # 系统正常运行时间(以秒为单位)
    system.uptime
    # 已登录用户数
    system.users.num
    
  • web 性能相关

    # 获取网页内容
    web.page.get[host,<path>,<port>]
    # 整个网页的加载时间
    web.page.perf[host,<path>,<port>]
    # 在网页上查找字符串
    web.page.regexp[host,<path>,<port>,regexp,<length>,<output>]
    
  • 硬件信息

    # 获取硬件传感器数据
    sensor[device,sensor,<mode>]
    
  • 日志监控

    # 日志文件监控中匹配行的计数
    log.count[file,<regexp>,<encoding>,<maxproclines>,<mode>,<maxdelay>,<options>,<persistent_dir>]
    # 支持日志循环的日志文件监控
    logrt[file_regexp,<regexp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>,<persistent_dir>]
    # 支持日志循环的日志文件监控中匹配行的计数
    logrt.count[file_regexp,<regexp>,<encoding>,<maxproclines>,<mode>,<maxdelay>,<options>,<persistent_dir>]
    
  • windows 相关

    # 事件日志监控
    eventlog[name,<regexp>,<severity>,<source>,<eventid>,<maxlines>,<mode>]
    # 网卡列表
    net.if.list
    # Windows性能计数器的值
    perf_counter[counter,<interval>]
    # Windows性能计数器的值(英文)
    perf_counter_en[counter,<interval>]
    # Windows性能计数器的对象实例列表
    perf_instance.discovery[object]
    # Windows性能计数器的对象实例列表
    perf_instance_en.discovery[object]
    # 关于特定流程的各种信息
    proc_info[process,<attribute>,<type>]
    # Windows服务列表
    service.discovery
    # 关于服务的信息
    service.info[service,<param>]
    # 服务列表
    services[<type>,<state>,<exclude>]
    # 执行WMI查询并返回第一个选定的对象
    wmi.get[<namespace>,<query>]
    # 执行WMI查询并返回完整的响应
    wmi.getall[<namespace>,<query>]
    # 虚拟内存大小
    vm.vmemory.size[<type>]
    

(2)、Simple checks

该监控方式是 zabbix-server 主动发起的对外请求,请求的源地址是 zabbix-server 的 IP 地址,目标地址为远程主机 IP 地址,因此我们就可以不安装任何 agent,就可以对一些常见的服务协议进行监控

该监控方式支持 TCP、UDP、VMware 的数据获取,而在 TCP、UDP 中对常见的服务进行了预定义,默认情况下,IP 地址为 item 所在主机的 IP 地址

  • Simple checks 支持的 key

    # 通过ICMP ping,检测主机的可访问性
    icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
    # 丢失数据包的百分比
    icmppingloss[<target>,<packets>,<interval>,<size>,<timeout>]
    # ICMP ping响应时间
    icmppingsec[<target>,<packets>,<interval>,<size>,<timeout>,<mode>]
    # 检测服务是否正在运行并且接受TCP连接
    net.tcp.service[service,<ip>,<port>]
    # 检测TCP服务性能
    net.tcp.service.perf[service,<ip>,<port>]
    # 检测服务是否正在运行并响应UDP请求
    net.udp.service[service,<ip>,<port>]
    # 检测UDP服务的性能
    net.udp.service.perf[service,<ip>,<port>]
    

(3)、Log file monitoring(日志监控)

  • 5.0版本中,该监控项在 ”zabbix agent(active)“ 类型下

  • zabbix-agent 支持对日志文件的监控,可以对日志文件的关键字进行监控,然后告警。日志监控支持普通的日志文件,也支持日志轮询、切割的文件,当日志中出现所指定的关键字时,可以给用户发送告警信息

  • 为使日志监控正常运行,必须满足以下条件:

    • zabbix-agent 必须运行,且工作在主动模式下
    • 日志的 item 必须设置,且必须指定文件名
    • zabbix-agent 必须有读取日志的权限
  • 日志监控中,有 log、log.count、logrt、logrt.coun 四个 key,其中 log 是普通日志文件,logrt 支持轮询日志监控,这两个 key 的返回值都是日志;带 count 的 key,监控的是日志中匹配关键字行数的统计,返回值是整数

  • 日志监控语法

    log[/PATH/file_name,<regpxp>,<encoding>,<maxlines>,<mode>,<output>,<maxdelay>,<options>]
    
    # file_name:含绝对路径的日志文件
    # regpxp:匹配的正则表达式
    # encoding:linux编码UTF-8,Windows编码ANSI
    # maxlines:每次给zabbix-server发送日志的最大行数
    # mode:all表示匹配所有日志,skip表示跳过已存在的日志数据,只匹配新日志数据
    # output:匹配输出的正则表达式
    # maxdelay:以秒为单位的最大延迟
    
  • 日志监控,需要配置对应的 trigger(触发条件)

(4)、Calculated items(计算型监控)

  • 计算型监控方式是在 zabbix-server 端对历史数据进行统计分析的一个功能,经过计算后的指标值,如果配置了该 item 的 trigger,则可以触发告警阈值进行告警

  • 在计算型监控中,最关键的两个指标,分别是 key 和 Formula(计算表达式),监控表达式引用的指标必须存在,且能正常采集到数据

  • 计算表达式语法

    func(<key>|<hostname:key>,<parameter1>,<parameter2>,...)
    
  • 相关参数说明

    • func:支持 trigger 函数 last, min, max, avg, count, etc
    • key:Formula 中的 key 是需要被计算的目标监控指标,建议将 key 放到双引号中,以避免不正确的解析
    • parameter(s):表达式所需要的参数
  • 示例:计算磁盘剩余的百分比

    100*last("vfs.fs.size[/,free]")/last("vfs.fs.size[/,total]")
    

(5)、SNMP agent checks

详见:zabbix系列:(四)SNMP监控方式简介与实战

(6)、SNMP traps

详见:zabbix系列:(四)SNMP监控方式简介与实战

(7)、SSH checks

SSH 监控方式,支持 SSH 密码访问,也支持密钥访问目标机器,和普通的 SSH 命令方式相同,通过 SSH 协议链接到远程主机,然后执行相关命令,其配置步骤如下:

  • zabbix-server 配置密钥存放路径

    [root@localhost ~]# vi /etc/zabbix/zabbix_server.conf
    SSHKeyLocation=/etc/zabbix/.key
    
  • 生成配置 ssh rsa 密钥

    [root@localhost ~]# mkdir -p /var/lib/zabbix/.ssh
    [root@localhost ~]# chown -R zabbix:zabbix /var/lib/zabbix/.ssh
    [root@localhost ~]# sudo -u zabbix ssh-keygen -t rsa -b 2048
    Generating public/private rsa key pair.
    Enter file in which to save the key (/var/lib/zabbix/.ssh/id_rsa): 
    ## 对密钥加密的密码
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    ## 密钥文件的生成情况
    Your identification has been saved in /var/lib/zabbix/.ssh/id_rsa.
    Your public key has been saved in /var/lib/zabbix/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:rR1F4pdB2kaah7fCxTYTbR13bPaxeexxuxbluJKTg zabbix@localhost.localdomain
    The key's randomart image is:
    +---[RSA 2048]----+
    |        o oo*o ++|
    |       . = @.++.O|
    |      . o * #. B=|
    |       o o O +.o+|
    |      . S = .   .|
    |       . o o     |
    | .    . . .      |
    |E .  + .         |
    | . .o o          |
    +----[SHA256]-----+
    
  • 分发密钥到被监控主机

    [root@localhost ~]# sudo -u zabbix ssh-copy-id root@192.168.137.20
    
  • 测试 SSH 密钥

    [root@localhost ~]# sudo -u zabbix ssh root@192.168.137.20 'nmcli'
    

(8)、其他监控方式

内部检测用于监控zabbix自身性能数据,可以监控 zabbix-server 和 zabbix-proxy,选择监控方式为 ”Zabbix internal“,添加相应的 item key 即可完成监控

聚合型监控是指将已经存储在数据库中的监控指标数据进行二次统计计算,从而形成新的监控指标

2、添加监控项

监控项可以存在于模板(template)中,也可以存在于主机(host)中。存在于模板中的监控项可以被重复引用,存在于主机中的监控项只能用于当前主机

2.1、监控项添加示例

配置方法:【configuration】 —> 【hosts】| 【template】 —> 选择需要添加监控项的主机或者模板 —> 在屏幕上方选择【items】 —> 【create item】

添加监控项

2.2、监控项各字段解释

  • Name:监控项名称
  • Type:监控项的默认类型,不同的监控类型,有不同的key配置参数
  • Key:item 的 key,自定义的 key 不显示,需要手动输入;系统自带的key可以通过【select】按钮选择,对于同一个主机而言,key 必须是唯一的
  • Host interface:选择主机的接口,在配置了多种监控方式或者多个 IP 地址监控时,可以通过主机接口来选择
  • Type of information:将采集到的数据转换为指定格式后,再存入数据库中
    • numeric(unsigned):64位无符号整数
    • numeric(float):浮点数
    • character:字符型
    • log:日志文件
    • text:文本
  • Units:数据单位符号,在单位符号前面加 ! 则不做单位转换
  • Update interval:数据更新间隔时间,设置为 0 时,监控项不通过 key 更新数据
  • Custom intervals:创建一个非常规的数据更新间隔时间,如果同时设置了update interval 和 custom interval,则以 custom interval 的时间为准,其他时间还是按默认更新时间采集;如果设置为 0,则在此时间段内,不更新数据
  • History storage period:历史数据保存时间
  • Trend storage period:趋势数据保存时间
  • Show value:对监控项数据进行图形显示
  • New application:将监控项添加到一个新的 application中
  • Applications:将监控项添加到一个现有的 application中
  • Populates host inventory field:将监控项添加到资产管理组中
  • Description:备注信息
  • Enabled:启用该监控项

3、自定义监控参数

  • 用户自定义参数,仅支持 agent 方式,对于其他方式不支持
  • 用户自定义参数需要添加到 agent 配置文件 /etc/zabbix/zabbix_agentd.conf

3.1、自定义参数格式

  • key格式

    key[参数1,参数2,…,参数N]

  • 参数格式

    UserParameter=key,command

    UserParameter=key,command $1 $2 … $9

3.2、自定义key中对特殊字符的处理

如果在自定义参数中存在特殊字符,zabbix 默认对这些参数是无法进行正常处理的,需要将 agent 配置文件中的参数设置为UnsafeUserParameters=1

3.3、key返回值

自定义参数可以返回文本和空值,如果返回的是一个无效值,则显示 ”ZBX_NOTSUPPORTED: Unsupported item key.“

3.4、自定义监控参数示例

# 获取系统版本号
UserParameter=get.os.type,cat /etc/redhat-release

3.5、测试自定义监控参数

  • 安装 zabbix_get

    系统默认没有安装 zabbix_get,因此需要自己手动安装

    [root@localhost ~]# yum -y install zabbix-get
    
  • zabbix_get 使用

    • 语法

      zabbix_get -s host-name-or-IP [-p port-number] [-I IP-address] -k item-key

    • 选项说明

      -s:远程 zabbix-agent 的 IP 地址或主机名

      -p:远程 zabbix-agent 的端口

      -I:本机出口 IP 地址,用于一台主机有多张网卡的环境

      -k:获取远程 zabbix-agent 数据所使用的 key

  • 测试自定义监控参数

    [root@localhost ~]# zabbix_get -s 127.0.0.1 -k get.os.type
    

4、监控项指标数据预处理

预处理是在 zabbix-server 接收到监控项数据后,对数据先处理再入库的过程,这就意味着客户端可以采集任何格式的数据,大大提高了数据处理的灵活性

4.1、预处理的流程

  • 采集到原始数据后,通过数据处理进程,首先将其存储到数据缓存区,这样确保了数据采集不会被阻塞,当数据缓存达到最大值时,将会给出缓存太小的告警信息,然后预处理进程开始工作
  • 预处理进程从数据缓存中获取将要处理的数据,再将处理后的结果放到历史数据缓存中
  • 数据同步进程会不断的对历史数据缓存中的数据进行处理,当达到出发阈值的条件时,就会触发告警动作,最后将数据存放到数据库中

4.2、预处理数据类型

常用数据类型如下:

  • Regular expression

    将该值与 < pattern > 正则表达式匹配,并用 < output > 替换该值

  • Trim

    将匹配到的字符串从开始到结束全部删除

  • Right trim

    将匹配到的字符串从右边开始删除

  • Left trim

    将匹配到的字符串从左边开始删除

  • XML XPath

    使用 XPath 功能从 XML 数据中提取值或片段

  • JSON Path

    使用 JSON Path 功能从 JSON 数据中提取值或片段

  • Custom multiplier

    对原数据进行乘法运算(倍数),通常用于处理改变原数值的单位

  • Simple change

    计算当前值和先前值之间的差值

  • Change per second

    计算每秒钟速度值的变化

  • Boolean to decimal

    将值从布尔格式转换为十进制

  • Octal to decimal

    将值从八进制格式转换为十进制格式

  • Hexadecimal to decimal

    将值从十六进制格式转换为十进制格式

更多数据类型参见:官方文档

5、配置宏(macros)

宏的作用是便于在模板、监控项、触发器中对数据进行变量引用,宏的名称为:**{名称}** ,例如 key 中使用宏 `net.tcp.service[ssh,{SSH_PORT}]`

  • 全局宏

    全局宏的作用范围:模板、主机,配置步骤:【Administration】 —> 【General】—> 【Macros】

  • 模板宏

    模板宏的作用范围:当前模板,配置步骤:【Configuration】 —> 【Templates】 —> 【模板名称】—> 【Macros】

  • 主机宏

    主机宏的作用范围:当前主机,配置步骤:【Configuration】 —> 【Hosts】 —> 【主机名称】—> 【Macros】

  • 监控项宏

    就是能在 item 中使用的宏,通常使用 “全局宏”

更多信息参见:官方文档