8 カスタムLLDルール

概要

完全にカスタムなLLDルールを作成し、任意のタイプのエンティティ(例えば、データベースサーバー上のデータベースなど)をディスカバリすることも可能です。

そのためには、見つかったオブジェクトとオプションでそのプロパティを指定するJSON文字列を返すカスタムアイテムを作成する必要があります。エンティティごとのマクロの数に制限はありません。組み込みのディスカバリルールでは1つまたは2つのマクロ(例えば、ファイルシステムディスカバリでは2つ)が返されますが、より多くのマクロを返すことも可能です。

必要なJSON文字列のフォーマットは、例で示すのが最も分かりやすいです。たとえば、古いZabbix 1.8エージェント(vfs.fs.discoveryキーをサポートしていないもの)を実行しているが、それでもファイルシステムをディスカバリする必要があるとします。 以下は、Linuxでマウントされているファイルシステムをディスカバリし、ファイルシステム名とタイプの両方を含むJSONで出力する簡単な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を使用して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";

その出力例(見やすく整形済み)を以下に示します。

[
    { "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返り値のデータ制限を参照してください。