7 自定义LLD规则
概述
也可以创建一个完全自定义的 LLD 规则,用于发现任意类型的实体,例如数据库服务器上的数据库。
为此,应创建一个自定义监控项,该监控项返回一个 JSON 字符串,其中指定发现到的对象,并可选地包含这些对象的一些属性。 每个实体的宏数量不受限制 - 内置发现规则通常只返回一个或两个宏(例如,文件系统发现返回两个宏),而自定义规则可以返回更多。
示例
所需的 JSON 字符串格式最好通过一个示例来说明。
假设我们正在运行一个旧版 Zabbix 1.8 agent(不支持 vfs.fs.discovery),但我们仍然需要发现文件系统。
下面是一个用于 Linux 的简单 Perl 脚本,它可以发现已挂载的文件系统,并以 JSON 格式输出,同时包含文件系统名称和类型。
一种使用方式是将其作为带有键 vfs.fs.discovery_perl 的 UserParameter:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
LLD 宏名称允许使用的符号为 0-9、A-Z、_、.。
名称中不支持小写字母。
下面显示了其输出示例(为便于阅读已重新排版)。
自定义发现检查的 JSON 也必须遵循相同格式。
[
{ "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
{ "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
{ "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
{ "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
{ "{#FSNAME}":"/dev/pts", "{#FSTYPE}":"devpts" },
{ "{#FSNAME}":"/lib/init/rw", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/dev/shm", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/home", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/tmp", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/usr", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/var", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/sys/fs/fuse/connections", "{#FSTYPE}":"fusectl" }
]
在前面的示例中,要求键与原型中使用的 LLD 宏名称匹配;另一种方法是使用 JSONPath 提取 LLD 宏值:{#FSNAME} → $.fsname,{#FSTYPE} → $.fstype,从而使如下脚本成为可能:
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"fsname\":\"$fsname\",\n";
print "\t\t\"fstype\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
下面显示了其输出示例(为便于阅读已重新排版)。
自定义发现检查的 JSON 也必须遵循相同格式。
[
{ "fsname":"/", "fstype":"rootfs" },
{ "fsname":"/sys", "fstype":"sysfs" },
{ "fsname":"/proc", "fstype":"proc" },
{ "fsname":"/dev", "fstype":"devtmpfs" },
{ "fsname":"/dev/pts", "fstype":"devpts" },
{ "fsname":"/lib/init/rw", "fstype":"tmpfs" },
{ "fsname":"/dev/shm", "fstype":"tmpfs" },
{ "fsname":"/home", "fstype":"ext3" },
{ "fsname":"/tmp", "fstype":"ext3" },
{ "fsname":"/usr", "fstype":"ext3" },
{ "fsname":"/var", "fstype":"ext3" },
{ "fsname":"/sys/fs/fuse/connections", "fstype":"fusectl" }
]
然后,在发现规则的“Filter”字段中,我们可以将 {#FSTYPE} 指定为宏,并将 rootfs|ext3 指定为正则表达式。
对于自定义 LLD 规则,你不必使用 FSNAME/FSTYPE 这些宏名称,可以自由使用任何你喜欢的名称。
如果使用 JSONPath,那么 LLD 行将是一个数组元素,它可以是对象,也可以是另一个数组或一个值。
请注意,如果使用 user parameter,则返回值限制为 16 MB。
有关更多详细信息,请参见LLD 返回值的数据限制。