7 カスタムLLDルール

概要

データベースサーバー上のデータベースなど、あらゆる種類のエンティティを検出する、完全にカスタマイズされたLLDルールを作成することもできます。

そのためには、検出されたオブジェクトと、オプションでそれらのプロパティを指定するJSON文字列を返すカスタムアイテムを作成する必要があります。エンティティあたりのマクロの数に制限はありません。組み込みの検出ルールは1つまたは2つのマクロ(たとえば、ファイルシステム検出の場合は2つ)を返しますが、それ以上の数を返すことも可能です。

Example

必要な JSON 文字列形式は、例を挙げるとわかりやすいでしょう。古い Zabbix 1.8 エージェント("vfs.fs.discovery"をサポートしていないエージェント)を実行しているものの、ファイルシステムを検出する必要がある場合を考えてみましょう。マウントされたファイルシステムを検出し、ファイルシステム名と種類を含む JSON 形式で出力する、Linux 用のシンプルな Perl スクリプトを以下に示します。このスクリプトを使用する方法の一つは、キー"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マクロ名と一致する必要がありますが、代わりにJSONPath {#FSNAME}$.fsname および {#FSTYPE}$.fstype を使用してLLDマクロ値を抽出することもできます。これにより、以下のスクリプトが可能になります。

#!/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"を指定できます。

カスタムLLDルールでは、マクロ名FSNAME/FSTYPEを使用する必要はありません。任意の名前を使用できます。JSONPathを使用する場合、LLD行は配列要素となり、オブジェクトになることもありますが、別の配列や値になることもあります。

ユーザーパラメータを使用する場合、戻り値は16MBに制限されることに注意してください。 詳細については、LLD 戻り値のデータ制限 を参照してください。