
zabbix文档细读
概述
Hosts and templates within a host group are not in any way linked to each other.
主机组内的主机和模板之间没有任何关联
模板直接链接到各个主机
预处理:数据存储到数据库之前进行转换
事件标签如何生成(??)
问题更新:添加评论,确认,改变严重性,手动关闭
escalation(升级)如何实现的
web scenario:通过一个或多个HTTP请求以检查网站可用性
item prototype:低级发现后,变量会自动替换为实际发现的参数
主机,主机组
克隆:保留host参数,以及模板链接(来自链接的所有实体)
在host配置页面,每个interface最右侧都有一个default单选按钮,当有多个同类型的接口存在时来指定选择哪一个做默认接口
为什么一个主机需要有多个interface,在有多个同类型的interface时需要指定默认interface
监控项需要指定通过什么接口来获取数据,多个接口会提供更多选择
tag:
此主机的所有problem将会用此处主机级的tag来标记
User macros, {INVENTORY.*} macros, {HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {HOST.PORT} and {HOST.ID} macros 支持在tag中使用
macros:
在主机配置页的macros栏可以编辑模板级以及全局级宏
inventory:
disabled - 禁用inventory填充
manual - 手动
automatically - 自动
encryption:与主机加密连接
连接到主机 - 无加密,PSK,证书
连接自主机 - 默认无加密
issuer - 允许的证书颁发者,空则为所有CA都接受
subject - 空表示接受所有CA签名的有效证书
PSK identity - 预共享密钥身份字符串,以未加密的方式通过网络传输,以告知接收方使用哪个 PSK。
PSK - 预共享密钥(十六进制字符串)
Apply permissions and tag filters to all subgroups
将相同级别的权限/标签过滤器应用于所有嵌套主机组。对于可能已将不同权限分配给嵌套主机组的用户组,将强制执行父主机组的权限级别。一次性选项,不会保存在数据库中。(???)
当创建已有父主机组的子主机组时,子主机组直接继承父主机组权限
为已有子主机组创建父主机组时,父主机组的权限不会被子主机组影响
这里的权限和标签过滤器,是指用户组对主机组的权限设置和标签设置,一般来说,一个用户组设置对主机组01读写,则主机组01/子组01不继承读写权限,仍然为none,现在去主机组01的设置里勾选应用于所有嵌套主机组,更新后,这个用户组的权限里主机组01的子组也都变为读写,这是个一次性的更改,这个勾选框在更新后重置为未勾选状态
Inventory
如果主机inventory信息中包含一个以 'http' 或 'https' 开头的 URL,则在Inventory部分将生成一个可点击的链接。
Item
flexible interval - 重叠期间使用最小间隔,flexible period之外使用默认interval
如果灵活间隔设置为 '0',则在灵活间隔期间不会对该项进行轮询,并在该期间结束后根据默认更新间隔恢复轮询
Scheduling intervals - 度时间间隔被用来指定一个独立的检查计划,该计划是并行执行的
md<filter>wd<filter>h<filter>m<filter>s<filter>
filter> 用于指定其前缀(天、小时、分钟、秒)的值,定义为: [<from>[-<to>]][/<step>][,<filter>]
关于间隔的关系没搞清楚,如果update interval是5m;flexible interval是1m,period是1-7,08:00-12:00;scheduling interval是wd1-7h11-13。那最后表现出来的间隔应该是什么样的?
预处理
预处理由 Zabbix server或proxy完成
任何预处理步骤失败,则该监控项将变为不受支持,除非已配置“自定义失败错误处理”
xml path
从xml数据中提取值或片段(server必须支持 libxml 编译)
需要注意custom on fail选框
JSON Path
从 JSON 数据中提取值或片段
需要注意custom on fail选框
Custom multiplier
将值乘以指定的整数或浮点值
使用此选项将以 KB、MBps 等接收的值转换为 B、Bps。否则 Zabbix 将无法正确设置前缀(K、M、G 等)
Note that if the item type of information is Numeric (unsigned), incoming values with a fractional part will be trimmed (i.e. '0.9' will become '0') before the custom multiplier is applied.
Simple change
计算当前值与前一个值之间的差
对于测量不断增长的值非常有用。如果当前值小于前一个值,Zabbix 将丢弃该差异(不存储任何内容)并等待另一个值。
Change per second
对于收集不断增长的值的每秒速度非常有用 (value-prev_value)/(time-prev_time)
此计算可能产生浮点数,建议将“信息类型”设置为数值(浮点)
Javascript
可用的 JavaScript 长度取决于所使用的数据库
In range
定义范围,值应该在这个范围内,必须至少存在一个值
Matches regular expression
必须匹配的正则表达式
Does not match regular expression
不能匹配
Check for error in JSON
检查位于 JSONpath 的应用程序级错误消息。如果成功且消息不为空,则停止处理;否则,继续处理在此预处理步骤之前的值。请注意,这些外部服务错误将原样报告给用户,不会添加预处理步骤信息。解析无效的 JSON 时不会报告错误。
Check for error in XML
检查位于 XPath 的应用程序级错误消息。如果成功且消息不为空,则停止处理;否则,继续处理在此预处理步骤之前的值。请注意,这些外部服务错误将原样报告给用户,不会添加预处理步骤信息。
Check for error using a regular expression
使用正则表达式检查应用程序级别的错误消息。如果成功且消息不为空,则停止处理;否则,继续使用此预处理步骤之前的值进行处理。请注意,这些外部服务错误会原样报告给用户,而不添加预处理步骤信息。
Prometheus pattern
使用查询从 Prometheus 指标中提取所需数据
Prometheus to JSON Prometheus
将所需的 Prometheus 指标转换为 JSON
prometheus???
值的处理流程
从数据源收集原生数据,此时,数据包括ID,时间戳,值
????
基于套接字的进程间通信机制将数据从数据gatherer传递到预处理manager。在这一点上,数据收集器继续收集数据,而无需等待预处理管理器的响应。
执行预处理
预处理manager的本地缓存中的历史数据装入历史缓存
数据流停止,直到下一个历史缓存的同步
规范数据,存入数据库
值的预处理
值通过基于socket的进程间通信机制传给预处理manager
将值放入队列
等待可用的预处理worker
发送任务给可用worker
处理完成(成功或失败),预处理值返回传回manager
manager将其转换格式,将结果放回队列。如果当前监控项有从属,则从属监控项也会入队列,在主监控项之后。
JSONPath
JSONPath用 . 分割段,每个段可以是单词,也可以是[ ]结构,当出现[ ]时,前面的 . 可以不写
$.object.name
$.object.['name']
$.[?(@.name == 'Object')]['name']
$.[?(@.price > 10)].length()
[1 : 3]表示数组第2项到第3项,左闭右开,从0开始
$..name返回所有名为name的属性的值
$:根 @:当前对象
当使用到宏时,如果宏值带有"", \这些特殊符号,需要在宏外加上""
$.["{#MACRO}"].value
JS
暂时没学习JS,这里仿佛在强调输入应该为字符串,输出也应该为字符串
CSV to JSON
第一个参数允许设置自定义分隔符,没设置就使用CSV第一行的Sep=来分隔,也没有就用逗号
第二个参数允许设置引用符号
如果选中“带标题行”复选框,则标题行的值将被解释为列名。在这种情况下,列名必须是唯一的,并且数据行不应包含比标题行更多的列
如果未选中“带标题行”复选框,则标题行将被解释为数据。列名将自动生成(1,2,3,4...)
Nr,Item name,Key,Qty
1,active agent item,agent.hostname,33
"2","passive agent item","agent.version","44"
3,"active,passive agent items",agent.ping,55
有标题行:
[
{
"Nr":"1",
"Item name":"active agent item",
"Key":"agent.hostname",
"Qty":"33"
},
{
"Nr":"2",
"Item name":"passive agent item",
"Key":"agent.version",
"Qty":"44"
},
{
"Nr":"3",
"Item name":"active,passive agent items",
"Key":"agent.ping",
"Qty":"55"
}
]
无标题行:
[
{
"1":"Nr",
"2":"Item name",
"3":"Key",
"4":"Qty"
},
{
"1":"1",
"2":"active agent item",
"3":"agent.hostname",
"4":"33"
},
{
"1":"2",
"2":"passive agent item",
"3":"agent.version",
"4":"44"
},
{
"1":"3",
"2":"active,passive agent items",
"3":"agent.ping",
"4":"55"
}
]
历史与趋势
历史保留每个收集的值,而趋势则在每小时的基础上保留平均信息,因此对资源的需求较少
其保留长时间的历史记录,不如保留更长时间的趋势数据
趋势设置为0,则完全不计算或存储趋势
趋势是使用与原始值相同的数据类型计算和存储的。因此,无符号数据类型值的平均值计算会被四舍五入,值区间越小,结果的精度就越低。例如,如果项目的值为 0 和 1,则平均值将是 0,而不是 0.5。此外,重启服务器可能会导致当前小时无符号数据类型平均值计算的精度损失
可加载模块
使用user parameters扩展zabbix功能的方法每次都会分叉一个新进程,影响性能。
可加载模块有许多好处。出色的性能和实现任何逻辑的能力是非常重要的,但也许最重要的优势是能够开发、使用和共享 Zabbix 模块。这有助于无故障维护,并帮助更轻松地交付新功能,而不依赖于 Zabbix 核心代码库。
这到底啥玩意
Windows performance counters
觉得在windows系统上有挺强的能力,是否真的好用且高效呢?
值映射
使用范围:前台,通知
指定值映射的地方:item配置中的"Show Value"
支持的key
>>>
The Items supported by platform (zabbix.com)
<<<
>>>
Windows-specific item keys (zabbix.com)
<<<
简单检测
支持简单检测的key有:
icmpping[<target>,<packets>,<interval>,<size>,<timeout>]
icmppingloss[<target>,<packets>,<interval>,<size>,<timeout>]
icmppingsec[<target>,<packets>,<interval>,<size>,<timeout>,<mode>]
net.tcp.service[service,<ip>,<port>]
net.tcp.service.perf[service,<ip>,<port>]
net.udp.service[service,<ip>,<port>]
net.udp.service.perf[service,<ip>,<port>]
日志监测???
日志时间格式:
23480:20100328:154718.045 Zabbix agent started
则格式为ppppp:yyyyMMdd:hhmmss
M为月,m为分
server和agent用两个计数器来跟踪被监控日志的大小(大小计数器)和最后被修改的时间(时间计数器)
agent内部使用inode号码(UNIX/GNU/Linux),文件索引(Windows)和前512日志文件字节的MD5校验和,用来改善日志文件被截断和轮换时的决策???
这三项由agent内部搜集,不会传给server,并且在agent停止时丢失
如果对于logrt()有多个匹配的日志文件,且agent正在追踪其中最新的日志文件,而当这个文件被删除时,会记录告警信息。Zabbix agent ignores log files with modification time less than the most recent modification time seen by the agent for the logrt[] item being checked. ???
agent会从上次结束的点开始读取日志文件
已经解析了的字节数(大小计数器)以及最后修改的时间(时间计数器)都存储在zabbix 数据库中,并且发给agent以确保agent在刚刚启动或者接收到了之前被禁用或不支持的项目时,从此点开始读取日志。
如果大小计数器不为0,而logrt或logrt.count里没有匹配的文件,则大小计数器会被重置为0,使得之后出现文件时从开头读取。
当日志文件大小小于大小计数器时,计数器被重置为0
如果有多个相同最后修改时间的文件,agent就会尝试分析所有这些文件,并避免遗漏数据或重复读取数据。当出现多个这样的文件时,agent会按字典降序处理。
agent每隔一段时间处理一次日志文件的新记录
为了找到所需字符串,zabbix会处理10倍于MaxLinesPerSecond的新行
log和log.count限制为agent发送缓冲区的1/2大小,即使其中没有非日志项???
因此,为了一个连接中发送的maxlines值,agent的BufferSize至少为2倍maxlines
在没有日志项时,所有agent代理缓存区用于非日志项,当出现日志值时,会替换较旧的非日志值,直到1/2
对于超过256KB的日志文件记录,仅对其前256kB进行正则表达式匹配,其余被忽略,当agent被停止时,内部状态丢失,长记录文件可能会在agent重启后以不同方式处理
文件名中只支持logrt的正则表达式,目录正则不被支持
在unix平台上,预期找到的日志文件的目录不存在,则logrt[]会变为NOTSUPPORTED,而在windows上不会
logrt[]项缺少日志文件不意味着它是NOTSUPPORTED,这个错误会被记录为warnings放入agent的日志文件中,但这样也并不意味着该项为NOTSUPPORTED
在agent日志文件中可以找出为什么变为NOTSUPPORTED,zabbix可以监控agent的日志,debuglevel = 4或5
maxdelay:
有时一些应用程序会写大量日志,如果经过慎重判断,可以通过设置maxdelay来跳过一些日志
如果maxdelay>0,则每次检测都会计算出一个估计延迟,来分析完成剩余记录需要多长时间,如果没有超过maxdelay,照常分析,如果超过了,就会跳过部分日志,使得剩余日志的延迟小于maxdelay
这个位置是大概的,因为跳转后会将位置调整为当前行的开头
copytruncate:
这是个啥???
使用了copytruncate选项的logrt假设日志文件具有不同记录,因此初始块的MD5校验和(最多前512字节)将会是不同的。若两个初始块的MD5校验和相同的文件意味着一个是原件,一个是副本。有copytruncate选项的logrt致力于正确处理日志文件副本而不报告重复项。
agent和server的通信失败时的操作:
agent发送缓冲区的指定日志区域有空闲时,如果失败,日志监控结果会积累在缓冲区,减轻短暂的通信故障
若通信故障较长:
停止log和logrt检查,通信恢复后并且缓冲区出现可用空闲时,在之前停止的位置恢复检查,这样就没有匹配行丢失
log.count和longrt.count在maxdelay=0时停止,行为与上类似,但是会影响count结果,例如,一个检查在日志文件中计数 100 行匹配,但由于缓冲区中没有空闲槽,检查被停止。当通信恢复时,代理再次计数相同的 100 行匹配和 70 行新的匹配。代理现在发送计数 = 170,仿佛它们是在一次检查中找到的
log.count和logrt.count在maxdelay>0,如果没有产生跳跃,行为与上同,如果发生了跳跃,则跳跃后的位置被保留,但计数结果被丢失
calculated
在type栏选择calculated,是一种类型
在“formula”字段中输入计算定义。实际上,公式和key之间没有任何联系。
如果用户宏用于引用函数参数或常量,则将在公式中展开用户宏。如果引用函数、主机名、项目键、项目键参数或运算符,则不会展开用户宏
与触发器表达式不同,Zabbix 根据计算型监控项的更新间隔处理计算,而不是在接收到新值时处理。
其一大特点是,支持多个监控项数值的计算(trigger能否做到?自己想一下?)
计算型监控项进行计算,trigger进行判断
SSH
无需agent???,且server必须配置为支持SSH2(libssh)
1.密码认证 2.认证密钥文件
密钥文件需要对server配置项进行修改,设置公钥,私钥放置的绝对路径
SSHKeyLocation=/home/zabbix/.ssh
external checks
外部检查是由 Zabbix server或proxy通过运行 shell 脚本或二进制文件执行的检查。
server会从配置文件中ExternalScripts参数指定的目录查找脚本并执行
访问权限和环境变量需要在wrapper脚本中处理
运行脚本会降低性能
aggregate checks
直接数据库查询收集来自监控项的聚合信息
无需agent
groupfunc["host group","item key",itemfunc,timeperiod]
主持的groupfunc有:grpavg,grpmax,grpmin,grpsum
可以包含多个主机组,指定父主机组会包含其嵌套的所有主机组
itemfuc有:avg,count,last,max,min,sum
//主机组 'MySQL 服务器' 的平均处理器负载
grpavg["MySQL Servers","system.cpu.load[,avg1]",last]
JMX
检索特定jmx计数器,server需要查询zabbix java网关,使用JMX management API来查询应用程序
key:jmx[],内部两个参数,object name - MBean 的对象名称??? attribute name - MBean 属性名称
jmx[com.example:Type=Hello,weight]
jmx[com.example:Type=Hello,apple.weight]
jmx endpoint:可以指定自定义 JMX 端点。确保 JMX 端点连接参数与 JMX 接口匹配???
监控一个boolean计数器,信息类型需要设为无符号数,然后添加bool转十进制的预处理步骤
ODBC
不直接连接数据库,使用ODBC中设置的接口和驱动
使用开源unixODBC
配置unixODBC
需要安装unixODBC以及对应数据库的驱动
key:
db.odbc.select[<unique short description>,<dsn>,<connection string>]
db.odbc.get[<unique short description>,<dsn>,<connection string>]
dsn:数据源名称 connection string:连接描述
二选一,都是描述连接的,若同时存在,采用connection string
数据源:
[test]
Description = MySQL test database
Driver = mysql
Server = 127.0.0.1
User = root
Password =
Port = 3306
Database = zabbix
db.odbc.get[MySQL 示例,,"Driver=/usr/local/lib/libmyodbc5a.so;Database=master;Server=127.0.0.1;Port=3306"]
dependent items
依赖监控项的间隔必须和主监控项的间隔一致
可通过预处理从主数据中提取依赖所需数据
最多允许3层依赖关系
从模板继承的主监控项的依赖监控项将不会导出到xml???
在依赖项预处理中配置提取所需部分
plugins???
限制agent检测
默认情况下,所有system.run[*]都是禁用的
若要允许远程命令,为特定的命令添加AllowKey=system.run[<command>,*]
禁止特定的远程命令,在 AllowKey=system.run[*] 参数之前添加 DenyKey 参数和 system.run[] 命令
因为system.run[*]默认禁用,所以可以不添加denyrule的情况下添加allowkey,但其它情况下不能只有allowkey
AllowKey 和 DenyKey 规则不影响 HostnameItem、HostMetadataItem、HostInterfaceItem 配置参数???