7 自定义LLD规则

概述

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

为此,应创建一个自定义监控项,该监控项返回一个 JSON 字符串,其中指定发现到的对象,并可选地包含这些对象的一些属性。 每个实体的宏数量不受限制 - 内置发现规则通常只返回一个或两个宏(例如,文件系统发现返回两个宏),而自定义规则可以返回更多。

示例

所需的 JSON 字符串格式最好通过一个示例来说明。
假设我们正在运行一个旧版 Zabbix 1.8 agent(不支持 vfs.fs.discovery),但我们仍然需要发现文件系统。
下面是一个用于 Linux 的简单 Perl 脚本,它可以发现已挂载的文件系统,并以 JSON 格式输出,同时包含文件系统名称和类型。
一种使用方式是将其作为带有键 vfs.fs.discovery_perlUserParameter

#!/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-9A-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 返回值的数据限制