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:
- Izveidojiet
Senderinstanci, norādot sava Zabbix servera vai starpniekservera IP adresi un portu. - Izsauciet
send_value()metodiSenderinstancē, 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
asynciomoduli (vispirms jāinstalē nepieciešamās atkarības). - Importējiet
AsyncSenderSendervietā. - Rakstiet kodu
asyncfunkcijā. - Izmantojiet
await, izsaucotsend_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:
- Sagatavojiet
ItemValueobjektu masīvu, kur katrs izmanto to pašu formātu kā metodesend_value(). - Izveidojiet
Senderinstanci, norādot sava Zabbix servera vai starpniekservera IP adresi un portu. - Izsauciet metodi
send()(metodessend_value()vietā)Senderinstancē, 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:
- Sagatavojiet Zabbix kopu masīvu. Ja kopai ir vairāki mezgli, vērtība tiks nosūtīta uz katras kopas pirmo pieejamo mezglu.
- Izveidojiet
Sender, norādot savu Zabbix kopu masīvu. - Izsauciet
send_value()metodiSenderinstancei, 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