Table of Contents

7 自定义LLD规则

概述

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

为此,应创建一个自定义 监控项,它返回一个 JSON string,以指定 发现 objects 以及可选的 - 它们的某些属性。数量为 每个实体的宏数量不受限制 - 而内置的发现规则 返回一个或两个宏(例如,文件系统使用两个宏) 发现),可以返回更多。

示例

所需JSON string格式的最佳说明方式是通过示例。假设我们 正在运行旧版Zabbix 1.8 agent(该版本不支持 "vfs.fs.discovery",但我们仍需发现file系统。以下是 一个用于Linux的简单Perl脚本,用于发现已挂载的file系统 输出为JSON格式,其中包含file系统名称和类型。一种方法是 因为它将作为键为"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-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宏相匹配 原型中使用的名称,另一种方法是提取LLD宏值 使用JSONPath {#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"  }
       ]

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

您无需在自定义监控项中使用宏名称 FSNAME/FSTYPE LLD规则允许您自由使用任意名称。对于JSONPath的情况 当使用 array 时,LLD 行将是一个可以是 object 的元素,但 它也可以是另一个array或某个值。

请注意,如果使用用户参数,返回值限制为16MB。 更多详情,请参阅返回值数据限制