[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Zabbixエージェントからデータを収集する

[comment]: # ({/ded6a8cd-ebcec779})

[comment]: # ({1640c1a8-02f6ab0d})
#### 概要

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md)を使用すると、Zabbixエージェントからデータを収集できます（[Zabbix get](/manual/concepts/get)と同様）。

データは同期モードまたは非同期モードで収集できます。

-   同期モードでは、Pythonスクリプトがデータを要求し、続行する前にデータを待機します。これは、単純で順次的かつ予測可能な操作に適しています。
-   非同期モードでは、スクリプトは各応答を待たずにデータを要求し、他の操作を並行して実行できます。これは、遅いリクエストや大量のデータバッチに対してより効率的です。

このページの例は同期モードに焦点を当てていますが、[非同期モード](#asynchronous-mode)も同様のパターンに従います。
追加の例は、[zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples) GitHubリポジトリで利用できます。

[comment]: # ({/1640c1a8-02f6ab0d})

[comment]: # ({d16d4df7-8b91e8b3})
#### インポート

zabbix\_utilsを使用してアイテム値を収集するには、Pythonスクリプトで`Getter`クラスをインポートします。

```python
from zabbix_utils import Getter
```

[comment]: # ({/d16d4df7-8b91e8b3})

[comment]: # ({9f0d96ac-7e0dc385})
#### アイテム値のリクエスト

アイテム値をリクエストするには:

1. ZabbixエージェントのIPアドレスとポートを指定して、`Getter`インスタンスを作成します。
2. 取得したいアイテムのキーを指定して、`Getter`インスタンスで`get()`メソッドを呼び出します。

例えば、`system.uname`アイテムのデータをリクエストするには:

```python
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
```

[comment]: # ({/9f0d96ac-7e0dc385})

[comment]: # ({fa98bb55-b5e0ad53})
##### デフォルト以外のIPの使用

スクリプトを実行しているサーバーに複数のIPアドレスがある場合、Zabbixエージェントに接続する際に`Getter`が使用する`source_ip`を指定できます。

```python
agent = Getter(
    host='192.0.2.0',
    port=10050,
    source_ip='10.10.7.1'
)
```

[comment]: # ({/fa98bb55-b5e0ad53})

[comment]: # ({edfacd5a-6bc440d9})
##### タイムアウトの使用

Zabbixエージェントからの応答を待つ時間を制御するために、`Getter`に応答`timeout`を設定できます。

```python
agent = Getter(
    host='192.0.2.0',
    port=10050,
    timeout=30
)
```

[comment]: # ({/edfacd5a-6bc440d9})

[comment]: # ({941d766e-6a0fc829})
##### 暗号化の使用

`Getter`には組み込みの暗号化サポートはありませんが、サードパーティのライブラリを使用してラッパーを作成することで暗号化を提供できます。

```python
def psk_wrapper(sock, tls):
    # ...
    # ソケット用のTLS PSKラッパーの実装
    # ...

agent = Getter(
    host='192.0.2.0',
    port=10050,
    socket_wrapper=psk_wrapper
)
```

[comment]: # ({/941d766e-6a0fc829})

[comment]: # ({4eff4d20-9556e19b})
##### レスポンス

Zabbixエージェントからのレスポンスはライブラリによって処理され、`AgentResponse`オブジェクトとして返されます。

```python
print(response)
# {
#     "error": null,
#     "raw": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64",
#     "value": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64"
# }

print(response.value)
# Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64

print(response.error)
# None
```

[comment]: # ({/4eff4d20-9556e19b})

[comment]: # ({1d08bd49-abc52038})
##### 非同期モード

非同期モードでは、スクリプトが各値の到着を待たずに値を収集できます。
多くの値を収集する必要がある場合や、一部の値の収集に時間がかかる場合に、スクリプトをより効率的にすることができます。

非同期モードを使用する場合、同期モードと比較して重要な違いがあります。

-   Pythonの`asyncio`モジュールをインポートします（事前に[必要な依存関係](/devel/python/install)をインストールする必要があります）。
-   `Getter`の代わりに`AsyncGetter`をインポートします。
-   コードを`async`関数内に記述します。
-   `get()`メソッドを呼び出す際に`await`を使用します。

例えば、非同期モードで単一の値を収集するには:

```python
# 1. 非同期モード用にasyncio、zabbix_utilsからAsyncGetterをインポート:
import asyncio
from zabbix_utils import AsyncGetter

# 2. すべてのデータリクエストを実行するメインのasync関数を定義:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Zabbixエージェントからsystem.unameの値を取得（awaitが必要）:
    response = await agent.get('system.uname')

    # 4. Zabbixエージェントから返された値を表示:
    print(response.value)

# 5. asyncioのイベントループを使ってasync main()関数を実行:
asyncio.run(main())
```

[comment]: # ({/1d08bd49-abc52038})
