Sūtīt datus uz Zabbix serveri vai starpniekserveri

zabbix_utils ļauj sūtīt vienumu vērtības uz trapper vienumu Zabbix serverī vai starpniekserverī (līdzīgi kā Zabbix sender).

Varat sūtīt vienu vērtību, vairākas vērtības vai pat mērķēt uz vairākiem Zabbix klasteriem.

Datus var sūtīt sinhronā vai asinhronā režīmā:

  • Sinhronajā režīmā jūsu Python skripts nosūta vērtības un pirms turpināšanas gaida atbildi; tas ir piemērots vienkāršām, secīgām un paredzamām darbībām.
  • Asinhronajā režīmā skripts nosūta vērtības, negaidot katru atbildi, tādējādi ļaujot citām darbībām turpināties 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 izmanto līdzīgus principus. Papildu piemēri ir pieejami GitHub repozitorijā zabbix_utils.

Importēšana

Lai izmantotu zabbix_utils vienumu vērtību sūtīšanai, importējiet savā skriptā Sender klasi:

from zabbix_utils import Sender

Lai sūtītu vairākas vērtības, varat importēt arī ItemValue klasi:

from zabbix_utils import Sender, ItemValue

Nosūtīt vienu vērtību

Lai nosūtītu vienuma vērtību:

  1. Izveidojiet Sender instanci, norādot sava Zabbix servera vai starpniekservera IP adresi un portu.
  2. Izsauciet send_value() metodi Sender instancē, izmantojot šādu formātu:
sender_instance.send_value('host', 'item.key', 'value', optional_timestamp, optional_nanoseconds)

Piemēram, lai nosūtītu 1 uz service.status trapper vienumu hostā Linux server:

sender = Sender(server='127.0.0.1', port=10051)
response = sender.send_value('Linux server', 'service.status', 1)
Noklusējuma IP adreses neizmantošana

Ja serverim, kurā darbojas jūsu skripts, ir vairākas IP adreses, varat norādīt source_ip, ko Sender izmantos, sūtot vērtības uz Zabbix serveri vai starpniekserveri:

sender = Sender(
    server='127.0.0.1',
    port=10051,
    source_ip='10.10.7.1'
)
Timeout izmantošana

Jūs varat iestatīt atbildes timeout parametrā Sender, lai noteiktu, cik ilgi jūsu skriptam jāgaida atbilde no Zabbix servera vai starpniekservera, pirms pārtraukt gaidīšanu:

sender = Sender(
    server='127.0.0.1',
    port=10051,
    timeout=30
)
Aģenta konfigurācijas faila izmantošana

Varat ļaut zabbix_utils nolasīt Server vai ServerActive parametrus no lokāla Zabbix aģenta vai aģenta 2 konfigurācijas faila. Šādos gadījumos, veidojot Sender instanci, nav nepieciešams norādīt savienojuma parametrus:

sender = Sender(
    use_config=True,
    config_path='/etc/zabbix/zabbix_agent2.conf'
)

Ja ServerActive satur vienu vai vairākus Zabbix klasterus ar vairākām servera instancēm, Sender nosūta datus uz pirmo pieejamo serveri katrā klasterī. Ja ServerActive nav iestatīts, tiek izmantota adrese no Server ar noklusējuma portu (10051).

Šifrēšanas izmantošana

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

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

sender = Sender(
    server='127.0.0.1',
    port=10051,
    socket_wrapper=psk_wrapper
)
Atbilde vienai vērtībai

Atbildi, ko atgriež Zabbix serveris vai starpniekserveris, apstrādā bibliotēka un atgriež kā TrapperResponse objektu:

print(response)
# {"processed": 1, "failed": 0, "total": 1, "time": "0.000123", "chunk": 1}

print(response.processed)
# 1

print(response.failed)
# 0

print(response.total)
# 1
Asinhronais režīms

Asinhronais režīms ļauj jūsu Python skriptam sūtīt vērtības, negaidot atbildi no Zabbix serveris vai starpniekserveris. Tas var padarīt jūsu skriptu efektīvāku, ja tam nepieciešams nosūtīt daudzas vērtības vai ja dažu vērtību nosūtīšana aizņem ilgu laiku.

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

  • Importējiet Python asyncio moduli (vispirms jāinstalē nepieciešamās atkarības).
  • Importējiet AsyncSender Sender vietā.
  • Rakstiet kodu async funkcijā.
  • Izmantojiet await, izsaucot send_value() metodi.

Piemēram, lai, izmantojot asinhrono režīmu, nosūtītu vienu vērtību:

# 1. Import asyncio for asynchronous mode, and AsyncSender from zabbix_utils:
import asyncio
from zabbix_utils import AsyncSender

# 2. Define the main async function where all data sending operations (must await) will be executed:
async def main():
    sender = AsyncSender(server='127.0.0.1', port=10051)
    response = await sender.send_value('Linux server', 'service.status', 1)

    # 3. Print the response returned by Zabbix server or proxy:
    print(response)

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

Vairāku vērtību nosūtīšana

Lai nosūtītu vairākas vērtības:

  1. Sagatavojiet ItemValue objektu masīvu, kur katrs izmanto to pašu formātu kā metode send_value().
  2. Izveidojiet Sender instanci, norādot sava Zabbix servera vai starpniekservera IP adresi un portu.
  3. Izsauciet metodi send() (metodes send_value() vietā) Sender instancē, norādot objektu masīvu ar nosūtāmajām vērtībām.

Piemēram, lai nosūtītu piecas vērtības uz dažādiem hostiem:

items = [
    ItemValue('server-de', 'service.status', 'up', 1770887205, 100),
    ItemValue('server-fr', 'service.status', 'up', 1770887205, 100),
    ItemValue('server-uk', 'service.status', 'up', 1770887205, 100),
    ItemValue('server-nl', 'service.status', 'up', 1770887205, 100),
    ItemValue('server-pl', 'service.status', 'up', 1770887205, 100),
]

sender = Sender(server='127.0.0.1', port=10051)
response = sender.send(items)
Pielāgota gabala lieluma izmantošana

Ja jums ir jānosūta vairāk vērtību, nekā trapera vienums var pieņemt vienā pieprasījumā, varat tās sadalīt gabalos.

Pēc noklusējuma gabala lielums ir 250 vērtības. To var mainīt, iestatot parametru chunk_size, veidojot Sender instanci.

Piemēram, lai nosūtītu piecas vērtības trīs gabalos (2-2-1), iestatiet parametru chunk_size uz 2:

items = [
    ItemValue('server-de', 'service.status', 'up'),
    ItemValue('server-fr', 'service.status', 'up'),
    ItemValue('server-uk', 'service.status', 'up'),
    ItemValue('server-nl', 'service.status', 'up'),
    ItemValue('server-pl', 'service.status', 'up'),
]

sender = Sender(server='127.0.0.1', port=10051, chunk_size=2)
response = sender.send(items)
Sūtīt vērtības uz vairākām Zabbix kopām

Lai sūtītu vērtības uz vairākām Zabbix kopām:

  1. Sagatavojiet Zabbix kopu masīvu. Ja kopai ir vairāki mezgli, vērtība tiks nosūtīta uz katras kopas pirmo pieejamo mezglu.
  2. Izveidojiet Sender, norādot savu Zabbix kopu masīvu.
  3. Izsauciet send_value() metodi Sender instancei, izmantojot to pašu formātu kā send_value() metodei.

Piemēram, lai nosūtītu vērtību uz pirmo pieejamo mezglu katrā kopā:

zabbix_clusters = [
    ['zabbix.cluster1.node1', 'zabbix.cluster1.node2:10051'],
    ['zabbix.cluster2.node1:10051', 'zabbix.cluster2.node2', 'zabbix.cluster2.node3']
]

sender = Sender(clusters=zabbix_clusters)
response = sender.send_value('Linux server', 'service.status', 1)
Atbilde vairāku vērtību gadījumā

Pēc noklusējuma Sender atgriež apkopotu rezultātu par vērtību nosūtīšanu visos hostos vai klasteros:

print(response)
# {"processed": 2, "failed": 0, "total": 2, "time": "0.000108", "chunk": 2}

Ja jums nepieciešama detalizētāka informācija, varat pārbaudīt rezultātus katram klasterim un katram gabalam, izmantojot atribūtu response.details:

print(response)
# {"processed": 2, "failed": 0, "total": 2, "time": "0.000108", "chunk": 2}

if response.failed == 0:
    print(f"Vērtība veiksmīgi nosūtīta {response.time}")
else:
    print(response.details)
    # {
    #     127.0.0.1:10051: [
    #         {
    #             "processed": 1,
    #             "failed": 0,
    #             "total": 1,
    #             "time": "0.000051",
    #             "chunk": 1
    #         }
    #     ],
    #     zabbix.example.local:10051: [
    #         {
    #             "processed": 1,
    #             "failed": 0,
    #             "total": 1,
    #             "time": "0.000057",
    #             "chunk": 1
    #         }
    #     ]
    # }

    for node, chunks in response.details.items():
        for resp in chunks:
            print(f"Apstrādāti {resp.processed} no {resp.total} mezglā {node.address}:{node.port}")
            # Apstrādāti 1 no 1 mezglā 127.0.0.1:10051
            # Apstrādāti 1 no 1 mezglā zabbix.example.local:10051