7 自定义 LLD 规则

概述

还可以创建一个完全自定义的 LLD 规则,来发现任何类型的实体—例如,数据库服务器上的数据库。

为此,应该创建一个返回 JSON 的自定义监控项,定义已发现的对象和它们的一些属性(可选)。每个实体的宏数量不受限制——虽然内置的发现规则返回一个或两个宏(例如,两个用于文件系统发现) ,但是可以返回更多的宏。

示例

所需的 JSON 格式最好用一个示例来说明。假设我们正在运行一个旧版本的代理 Zabbix Agent1.8(一个不支持”vfs.fs.discovery”的代理版本) ,但是我们仍然需要能够自动发现文件系统。 下面是一个可以在 Linux 上执行的 Perl 脚本,它发现已挂载的文件系统并输出 JSON,其中包括文件系统名称和类型。使用它的方式是通过设置UserParameter的键值为”vfs.fs.discovery_perl”:

  1. #!/usr/bin/perl
  2. $first = 1;
  3. print "[\n";
  4. for (`cat /proc/mounts`)
  5. {
  6. ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
  7. print "\t,\n" if not $first;
  8. $first = 0;
  9. print "\t{\n";
  10. print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
  11. print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
  12. print "\t}\n";
  13. }
  14. print "]\n";

LLD宏名称支持字符 0-9 , A-Z , _ , . 名称不支持小写字母。

下面显示了其输出的示例(为清晰起见,重新格式化了)。用于自定义发现检查的 JSON 必须遵循相同的格式。

  1. [
  2. { "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
  3. { "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
  4. { "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
  5. { "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
  6. { "{#FSNAME}":"/dev/pts", "{#FSTYPE}":"devpts" },
  7. { "{#FSNAME}":"/lib/init/rw", "{#FSTYPE}":"tmpfs" },
  8. { "{#FSNAME}":"/dev/shm", "{#FSTYPE}":"tmpfs" },
  9. { "{#FSNAME}":"/home", "{#FSTYPE}":"ext3" },
  10. { "{#FSNAME}":"/tmp", "{#FSTYPE}":"ext3" },
  11. { "{#FSNAME}":"/usr", "{#FSTYPE}":"ext3" },
  12. { "{#FSNAME}":"/var", "{#FSTYPE}":"ext3" },
  13. { "{#FSNAME}":"/sys/fs/fuse/connections", "{#FSTYPE}":"fusectl" }
  14. ]

在前面的示例中,要求键值与原型中使用的 LLD 宏名称匹配,另一种方法是使用 JSONPath 提取 LLD 宏值 {#FSNAME} → $.fsname 和 {#FSTYPE} → $.fstype,因此也可以使用这样的脚本:

  1. #!/usr/bin/perl
  2. $first = 1;
  3. print "[\n";
  4. for (`cat /proc/mounts`)
  5. {
  6. ($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
  7. print "\t,\n" if not $first;
  8. $first = 0;
  9. print "\t{\n";
  10. print "\t\t\"fsname\":\"$fsname\",\n";
  11. print "\t\t\"fstype\":\"$fstype\"\n";
  12. print "\t}\n";
  13. }
  14. print "]\n";

下面显示了其输出的示例(为清晰起见,重新格式化了)。用于自定义发现检查的 JSON 必须遵循相同的格式。

  1. [
  2. { "fsname":"/", "fstype":"rootfs" },
  3. { "fsname":"/sys", "fstype":"sysfs" },
  4. { "fsname":"/proc", "fstype":"proc" },
  5. { "fsname":"/dev", "fstype":"devtmpfs" },
  6. { "fsname":"/dev/pts", "fstype":"devpts" },
  7. { "fsname":"/lib/init/rw", "fstype":"tmpfs" },
  8. { "fsname":"/dev/shm", "fstype":"tmpfs" },
  9. { "fsname":"/home", "fstype":"ext3" },
  10. { "fsname":"/tmp", "fstype":"ext3" },
  11. { "fsname":"/usr", "fstype":"ext3" },
  12. { "fsname":"/var", "fstype":"ext3" },
  13. { "fsname":"/sys/fs/fuse/connections", "fstype":"fusectl" }
  14. ]

然后,在发现规则的”过滤器”字段中,我们可以将 “{#FSTYPE}” 指定为宏并定义正则表达式 “rootfs|ext3”。

对于自定义 LLD 规则,您不必使用宏名称 FSNAME/FSTYPE,您可以自由使用任何您喜欢的名称。如果使用 JSONPath,那么 LLD 原始数据将作为一个数组元素对象,也可以是另一个数组或值。

注意,如果使用用户自定义参数监控项,返回值限制为16MB。有关更多详细信息,请参见 LLD 返回值的数据限制.