[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Datu vākšana no Zabbix aģenta

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

[comment]: # ({1640c1a8-02f6ab0d})
#### Pārskats

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md) ļauj vākt datus no Zabbix aģenta (līdzīgi kā [Zabbix get](/manual/concepts/get)).

Datus var vākt sinhronā vai asinhronā režīmā:

-   Sinhronajā režīmā jūsu Python skripts pieprasa datus un gaida to saņemšanu, pirms turpināt darbu, kas ir piemēroti vienkāršām, secīgām un paredzamām darbībām.
-   Asinhronajā režīmā skripts pieprasa datus, negaidot katru atbildi, tādējādi ļaujot citām darbībām notikt paralēli; tas ir efektīvāk lēniem pieprasījumiem vai lielām datu paketēm.

Šīs lapas piemēri ir vērsti uz sinhrono režīmu, lai gan [asinhronais režīms](#asynchronous-mode) izmanto līdzīgus principus.
Papildu piemēri ir pieejami GitHub repozitorijā [zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples).

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

[comment]: # ({d16d4df7-8b91e8b3})
#### Importēšana

Lai izmantotu zabbix\_utils vienumu vērtību iegūšanai, importējiet `Getter` klasi savā Python skriptā:

```python
from zabbix_utils import Getter
```

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

[comment]: # ({9f0d96ac-7e0dc385})
#### Pieprasījuma dati

Lai pieprasītu vienuma vērtību:

1. Izveidojiet `Getter` instanci, norādot sava Zabbix aģenta IP adresi un portu.
2. Izsauciet `get()` metodi `Getter` instancē, norādot tā vienuma atslēgu, kuru vēlaties iegūt.

Piemēram, lai pieprasītu datus vienumam `system.uname`:

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

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

[comment]: # ({fa98bb55-b5e0ad53})
##### Nestandarta IP adreses izmantošana

Ja serverim, kurā darbojas jūsu skripts, ir vairākas IP adreses, varat norādīt `source_ip`, ko `Getter` izmantos, pieslēdzoties Zabbix aģentam:

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

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

[comment]: # ({edfacd5a-6bc440d9})
##### Taimauta izmantošana

Jūs varat iestatīt atbildes `timeout` objektam `Getter`, lai noteiktu, cik ilgi jūsu skriptam jāgaida atbilde no Zabbix aģenta, pirms pārtraukt gaidīšanu:

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

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

[comment]: # ({941d766e-6a0fc829})
##### Šifrēšanas izmantošana

`Getter` neietver iebūvētu šifrēšanas atbalstu, taču jūs varat to nodrošināt, izveidojot ietvaru, izmantojot trešo pušu bibliotēkas:

```python
def psk_wrapper(sock, tls):
    # ...
    # TLS PSK ietvara ieviešana ligzdai
    # ...

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

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

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

Atbilde no Zabbix aģenta tiek apstrādāta bibliotēkā un atgriezta kā `AgentResponse` objekts:

```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})
##### Asinhronais režīms

Asinhronais režīms ļauj jūsu skriptam vākt vērtības, negaidot, līdz katra no tām tiek saņemta.
Tas var padarīt jūsu skriptu efektīvāku, ja tam ir jāvāc daudzas vērtības vai ja dažu vērtību savākšana aizņem ilgu laiku.

Izmantojot asinhrono režīmu, salīdzinājumā ar sinhrono režīmu ir vairākas būtiskas atšķirības:

-   Importējiet Python `asyncio` moduli (vispirms jā[instalē](/devel/python/install) nepieciešamās atkarības).
-   Importējiet `AsyncGetter` `Getter` vietā.
-   Rakstiet savu kodu `async` funkcijā.
-   Izmantojiet `await`, izsaucot `get()` metodi.

Piemēram, lai savāktu vienu vērtību, izmantojot asinhrono režīmu:

```python
# 1. Import asyncio for asynchronous mode, and AsyncGetter from zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Define the main async function where all data requests will be executed:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Fetch the system.uname value from Zabbix agent (must await):
    response = await agent.get('system.uname')

    # 4. Print the value returned by Zabbix agent:
    print(response.value)

# 5. Run the async main() function using asyncio's event loop:
asyncio.run(main())
```

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