[comment]: # ({a9abad39-e12f7cb4})

# 7 カスタムLLDルール

[comment]: # ({/a9abad39-e12f7cb4})

[comment]: # ({dee5ac37-c6cb7a14})

### 概要

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

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

[comment]: # ({/dee5ac37-c6cb7a14})

[comment]: # ({ddf73092-124235ad})

### Example

必要な JSON 文字列形式は、例を挙げるとわかりやすいでしょう。古い Zabbix 1.8 エージェント（"vfs.fs.discovery"をサポートしていないエージェント）を実行しているものの、ファイルシステムを検出する必要がある場合を考えてみましょう。マウントされたファイルシステムを検出し、ファイルシステム名と種類を含む JSON 形式で出力する、Linux 用のシンプルな Perl スクリプトを以下に示します。このスクリプトを使用する方法の一つは、キー"vfs.fs.discovery\_perl"を持つ UserParameter として使用することです。

``` {.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";
```

::: noteimportant
LLDマクロ名に使用できる記号は、**0-9**、**A-Z**、**\_**、**.** です。
小文字は名前に使用できません。
:::

出力例（わかりやすいようにフォーマットを変更）を以下に示します。カスタム検出チェック用のJSONも同じ形式に従う必要があります。

``` {.javascript}
[
    { "{#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マクロ値を抽出することもできます。これにより、以下のスクリプトが可能になります。

``` {.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";
```

出力例（分かりやすくするためにフォーマットを変更）を以下に示します。カスタム検出チェック用のJSONも同じ形式に従う必要があります。

``` {.javascript}
[
    { "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"を指定できます。

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

ユーザーパラメータを使用する場合、戻り値は16MBに制限されることに注意してください。
詳細については、[LLD 戻り値のデータ制限](/manual/discovery/low_level_discovery/notes#data-limits-for-return-values) を参照してください。

[comment]: # ({/ddf73092-124235ad})
