7 カスタムLLDルール

概要

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

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

必要な JSON 文字列の形式は、例で示すのが最も分かりやすいでしょう。
古い Zabbix 1.8 エージェント(vfs.fs.discovery をサポートしていないもの)を実行しているとしますが、それでもファイルシステムを検出する必要があります。
以下は、マウント済みファイルシステムを検出し、ファイルシステム名とタイプの両方を含む JSON を出力する、Linux 用の簡単な Perl スクリプトです。
これを UserParameter として、キー vfs.fs.discovery_perl で使用する方法があります。

#!/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 の行はオブジェクトになり得る配列要素ですが、別の配列や値であることもできます。

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