Skip to content

Commit

Permalink
Switch to official Zabbix Python API (#131674)
Browse files Browse the repository at this point in the history
  • Loading branch information
kruton authored Dec 20, 2024
1 parent 7e6392f commit b391dfe
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 20 deletions.
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -1742,6 +1742,7 @@ build.json @home-assistant/supervisor
/tests/components/youless/ @gjong
/homeassistant/components/youtube/ @joostlek
/tests/components/youtube/ @joostlek
/homeassistant/components/zabbix/ @kruton
/homeassistant/components/zamg/ @killer0071234
/tests/components/zamg/ @killer0071234
/homeassistant/components/zengge/ @emontnemery
Expand Down
26 changes: 13 additions & 13 deletions homeassistant/components/zabbix/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@
from urllib.error import HTTPError
from urllib.parse import urljoin

from pyzabbix import ZabbixAPI, ZabbixAPIException, ZabbixMetric, ZabbixSender
import voluptuous as vol
from zabbix_utils import ItemValue, Sender, ZabbixAPI
from zabbix_utils.exceptions import APIRequestError

from homeassistant.const import (
CONF_HOST,
Expand Down Expand Up @@ -42,6 +43,7 @@

DEFAULT_SSL = False
DEFAULT_PATH = "zabbix"
DEFAULT_SENDER_PORT = 10051

TIMEOUT = 5
RETRY_DELAY = 20
Expand Down Expand Up @@ -86,7 +88,7 @@ def setup(hass: HomeAssistant, config: ConfigType) -> bool:
try:
zapi = ZabbixAPI(url=url, user=username, password=password)
_LOGGER.debug("Connected to Zabbix API Version %s", zapi.api_version())
except ZabbixAPIException as login_exception:
except APIRequestError as login_exception:
_LOGGER.error("Unable to login to the Zabbix API: %s", login_exception)
return False
except HTTPError as http_error:
Expand All @@ -104,7 +106,7 @@ def setup(hass: HomeAssistant, config: ConfigType) -> bool:

def event_to_metrics(
event: Event, float_keys: set[str], string_keys: set[str]
) -> list[ZabbixMetric] | None:
) -> list[ItemValue] | None:
"""Add an event to the outgoing Zabbix list."""
state = event.data.get("new_state")
if state is None or state.state in (STATE_UNKNOWN, "", STATE_UNAVAILABLE):
Expand Down Expand Up @@ -145,14 +147,14 @@ def event_to_metrics(
float_keys.update(floats)
if len(float_keys) != float_keys_count:
floats_discovery = [{"{#KEY}": float_key} for float_key in float_keys]
metric = ZabbixMetric(
metric = ItemValue(
publish_states_host,
"homeassistant.floats_discovery",
json.dumps(floats_discovery),
)
metrics.append(metric)
for key, value in floats.items():
metric = ZabbixMetric(
metric = ItemValue(
publish_states_host, f"homeassistant.float[{key}]", value
)
metrics.append(metric)
Expand All @@ -161,7 +163,7 @@ def event_to_metrics(
return metrics

if publish_states_host:
zabbix_sender = ZabbixSender(zabbix_server=conf[CONF_HOST])
zabbix_sender = Sender(server=conf[CONF_HOST], port=DEFAULT_SENDER_PORT)
instance = ZabbixThread(zabbix_sender, event_to_metrics)
instance.setup(hass)

Expand All @@ -175,10 +177,8 @@ class ZabbixThread(threading.Thread):

def __init__(
self,
zabbix_sender: ZabbixSender,
event_to_metrics: Callable[
[Event, set[str], set[str]], list[ZabbixMetric] | None
],
zabbix_sender: Sender,
event_to_metrics: Callable[[Event, set[str], set[str]], list[ItemValue] | None],
) -> None:
"""Initialize the listener."""
threading.Thread.__init__(self, name="Zabbix")
Expand Down Expand Up @@ -208,12 +208,12 @@ def _event_listener(self, event: Event[EventStateChangedData]) -> None:
item = (time.monotonic(), event)
self.queue.put(item)

def get_metrics(self) -> tuple[int, list[ZabbixMetric]]:
def get_metrics(self) -> tuple[int, list[ItemValue]]:
"""Return a batch of events formatted for writing."""
queue_seconds = QUEUE_BACKLOG_SECONDS + self.MAX_TRIES * RETRY_DELAY

count = 0
metrics: list[ZabbixMetric] = []
metrics: list[ItemValue] = []

dropped = 0

Expand Down Expand Up @@ -243,7 +243,7 @@ def get_metrics(self) -> tuple[int, list[ZabbixMetric]]:

return count, metrics

def write_to_zabbix(self, metrics: list[ZabbixMetric]) -> None:
def write_to_zabbix(self, metrics: list[ItemValue]) -> None:
"""Write preprocessed events to zabbix, with retry."""

for retry in range(self.MAX_TRIES + 1):
Expand Down
6 changes: 3 additions & 3 deletions homeassistant/components/zabbix/manifest.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"domain": "zabbix",
"name": "Zabbix",
"codeowners": [],
"codeowners": ["@kruton"],
"documentation": "https://www.home-assistant.io/integrations/zabbix",
"iot_class": "local_polling",
"loggers": ["pyzabbix"],
"loggers": ["zabbix_utils"],
"quality_scale": "legacy",
"requirements": ["py-zabbix==1.1.7"]
"requirements": ["zabbix-utils==2.0.1"]
}
2 changes: 1 addition & 1 deletion homeassistant/components/zabbix/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import logging
from typing import Any

from pyzabbix import ZabbixAPI
import voluptuous as vol
from zabbix_utils import ZabbixAPI

from homeassistant.components.sensor import (
PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA,
Expand Down
6 changes: 3 additions & 3 deletions requirements_all.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1723,9 +1723,6 @@ py-sucks==0.9.10
# homeassistant.components.synology_dsm
py-synologydsm-api==2.5.3

# homeassistant.components.zabbix
py-zabbix==1.1.7

# homeassistant.components.atome
pyAtome==0.1.1

Expand Down Expand Up @@ -3084,6 +3081,9 @@ youtubeaio==1.1.5
# homeassistant.components.media_extractor
yt-dlp[default]==2024.12.13

# homeassistant.components.zabbix
zabbix-utils==2.0.1

# homeassistant.components.zamg
zamg==0.3.6

Expand Down

0 comments on commit b391dfe

Please sign in to comment.