8 カスタムLLDルール

概要

完全にカスタムのLLDルールを作成し、あらゆる種類のエンティティをディスカバリすることも可能です。例えば、データベースサーバー上のデータベースなどです。

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

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

その後、ディスカバリルールの Filter フィールドで、マクロとして "{#FSTYPE}"、正規表現として "rootfs|ext3" を指定できます。

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

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