[comment]: # ({123e70fa-eeab68d4})
# 5 ディスカバリのプロトタイプ

[comment]: # ({/123e70fa-eeab68d4})

[comment]: # ({51188e33-7301878f})
#### 概要

ディスカバリプロトタイプは、「親」ディスカバリルール内にある**ネストされた低レベルディスカバリ**ルールであり、独自のアイテム、トリガーなどを持つオブジェクトの多層ディスカバリを作成できます。例えば、データベースサーバー上のすべてのデータベースインスタンスをディスカバリし、次に各インスタンスのテーブルスペースをディスカバリし、次に各テーブルスペースのテーブルをディスカバリしたい場合などです。

ディスカバリプロトタイプには、独自のアイテム、トリガー、グラフ、ホスト、ディスカバリプロトタイプがあります。*ネスト*タイプを指定した場合、ネストされたディスカバリプロトタイプは親ルールと同じJSON値を使用します。

ディスカバリプロトタイプのネストレベルに制限はありません。

[comment]: # ({/51188e33-7301878f})

[comment]: # ({a64573d7-6ccd77a1})
#### 設定

ディスカバリプロトタイプを作成するには:

- 既存のディスカバリルールの行で *Discovery prototypes* をクリックします

![](../../../../assets/en/manual/discovery/low_level_discovery/discovery_prototypes.png){width="600"}

- *Create discovery prototype* をクリックします

![](../../../../assets/en/manual/discovery/low_level_discovery/discovery_prototype.png){width="600"}

このフォームの設定項目は、通常の[low-level discovery](/manual/discovery/low_level_discovery#discovery-rule)と共通です。

開いたディスカバリプロトタイプフォームで *Type* に "Nested" を選択すると、ディスカバリルール（ディスカバリプロトタイプから）が、親のディスカバリルールと同じ JSON 値に含まれる JSON オブジェクトを基に生成されます。たとえば、元の JSON が [\<object A>, \<object B>] で、ネストされたディスカバリルールプロトタイプが 1 つある場合、object A と object B のデータをそれぞれ基に 2 つのディスカバリルールが生成されます。

この場合、ディスカバリプロトタイプは親ルールと同時に有効化されます。そのため、ネストされたルールでは前処理を使用して、親によってすでに取得された同じデータの別の「スライス」を処理できます。

親の LLD ルールの LLD マクロは、ネストされたディスカバリルールで利用できます。

[comment]: # ({/a64573d7-6ccd77a1})

[comment]: # ({919a3116-6802ce22})
##### 検出されたホストでのネストされたLLDルール

*ネスト*された低レベルディスカバリールールは、ホストプロトタイプに割り当てられたホストテンプレートで使用できます。検出されたホストに*ネスト*されたディスカバリールールが存在する場合、ホストの検出に使用されたJSONオブジェクトは、このホストのすべてのネスト型LLDルールにも送信されます。詳細は[例](#case-2)を参照してください。

ホストを作成したディスカバリールールのLLDマクロは、ネストされたディスカバリールールで利用できます。

[comment]: # ({/919a3116-6802ce22})

[comment]: # ({93b2a155-758102e8})
#### 例

次の複数レベルのJSONの例を受信することに基づいて、ディスカバリプロトタイプの考えられる適用例を示します。

```json
[
  {
    "database": "db1",
    "created_at": "2024-02-01T12:30:00Z",
    "encoding": "UTF8",
    "tablespaces": [
      { "name": "ts1", "max_size": "10GB" },
      { "name": "ts2", "max_size": "20GB" },
      { "name": "ts3", "max_size": "15GB" }
    ]
  },
  {
    "database": "db2",
    "created_at": "2023-11-15T08:45:00Z",
    "encoding": "UTF16",
    "tablespaces": [
      { "name": "ts1", "max_size": "5GB" },
      { "name": "ts2", "max_size": "25GB" },
      { "name": "ts3", "max_size": "30GB" }
    ]
  },
  {
    "database": "db3",
    "created_at": "2024-01-05T15:10:00Z",
    "encoding": "UTF8",
    "tablespaces": [
      { "name": "ts1", "max_size": "12GB" },
      { "name": "ts2", "max_size": "18GB" },
      { "name": "ts3", "max_size": "22GB" }
    ]
  }
]
```

[comment]: # ({/93b2a155-758102e8})

[comment]: # ({6e3cce0f-86523b7e})
###### ケース 1

データベースサーバー上のデータベースインスタンスを検出し、次に各インスタンスの tablespace を検出します。

1. データベースサーバーの検出に関連付けられたホストが少なくとも 1 つあります。

2. このホストに対して、*Discover databases and tablespaces* という名前の [LLD ルール](/manual/discovery/low_level_discovery#discovery-rule) を作成します。

3. このルールの *LLD Macros* タブに切り替え、マクロ `{#DB}=$.database` を追加します。

4. このルールに対して、*Active connections to {#DB}* という名前のアイテムプロトタイプを追加します（Type: Agent, Key: `db.connections[{#DB}]`）。

5. 各データベースに関連するアイテムが検出されます。

```bash
Active connections to db1, Active connections to db2, Active connections to db3.
```

6. このルールに対して、*Discover tablespaces for {#DB}* という名前の検出プロトタイプを作成します（Type: Nested, Key: `db.tablespace.discovery[{#DB}]`）。

7. この検出プロトタイプの *Preprocessing* タブに切り替え、ステップ `JSONPath=$.tablespaces` を追加します。

8. この検出プロトタイプの *LLD Macros* タブに切り替え、マクロ `{#TSNAME}=$.name` を追加します。

9. この検出プロトタイプに対して、*Size of tablespace {#TSNAME} for {#DB}* という名前のアイテムプロトタイプを作成します（Type: Agent, Key: `db.ts.size[{#DB}, {#TSNAME}]`）。

10. 各データベースの各 tablespace に関連するアイテムが検出されます。

```bash
Size of tablespace ts1 for db1, Size of tablespace ts2 for db1, Size of tablespace ts3 for db1,
Size of tablespace ts1 for db2, Size of tablespace ts2 for db2, Size of tablespace ts3 for db2,
Size of tablespace ts1 for db3, Size of tablespace ts2 for db3, Size of tablespace ts3 for db3.
```

キーは `db.ts.size[db1,ts1]`, `db.ts.size[db1,ts2]`, ... `db.ts.size[db3,ts3]` です。

[comment]: # ({/6e3cce0f-86523b7e})

[comment]: # ({9d626d0a-d5a6c33a})
###### ケース2

データベースサーバー上のデータベースインスタンスを検出済みホストとして表現して検出し、その後、各インスタンスの表領域を検出します。

1. データベースサーバーの検出に関連するホスト（ルートホスト）が少なくとも1つ必要です。

2. 各データベースの表領域を検出するためのテンプレートを作成します。

3. このテンプレートに、*{#DB} へのアクティブ接続* という名前のアイテムを作成します（タイプ: エージェント、キー: `db.connections[{#DB}]`）。

4. このテンプレートに、*表領域を検出* という名前の [LLDルール](/manual/discovery/low_level_discovery#discovery-rule) を作成します（タイプ: ネスト）。

5. このルールの *Preprocessing* タブに切り替え、ステップ `JSONPath=$.tablespaces` を追加します。

6. このルールの *LLD Macros* タブに切り替え、マクロ `{#TSNAME}=$.name` を追加します。

7. このルールのアイテムプロトタイプとして、*{#DB} の表領域 {#TSNAME} のサイズ* という名前のアイテムを作成します（タイプ: エージェント、キー: `db.ts.size[{#DB}, {#TSNAME}]`）。

8. ルートホストに戻り、このホストに *データベースと表領域を検出* という名前の [LLDルール](/manual/discovery/low_level_discovery#discovery-rule) を作成します。

9. このルールの *LLD Macros* タブに切り替え、マクロ `{#DB}=$.database` を追加します。

10. このルールに、*データベース {#DB} 用ホスト* という名前のホストプロトタイプを追加します。

11. このホストプロトタイプの *Macros* タブに切り替え、マクロ `{$DB}={#DB}` を追加します（手順3のアイテム名とキー用）。

12. 手順2のテンプレートをこのホストプロトタイプにリンクします。

13. 検出されたホストには、各データベースとその表領域に関連する検出済みアイテムが含まれます。

|ホスト|アイテム|
|----|------|
|*データベース db1 用ホスト*|db1 へのアクティブ接続<br>db1 の表領域 ts1 のサイズ<br>db1 の表領域 ts2 のサイズ<br>db1 の表領域 ts3 のサイズ|
|*データベース db2 用ホスト*|db2 へのアクティブ接続<br>db2 の表領域 ts1 のサイズ<br>db2 の表領域 ts2 のサイズ<br>db2 の表領域 ts3 のサイズ|
|*データベース db3 用ホスト*|db3 へのアクティブ接続<br>db3 の表領域 ts1 のサイズ<br>db3 の表領域 ts2 のサイズ<br>db3 の表領域 ts3 のサイズ|

[comment]: # ({/9d626d0a-d5a6c33a})
