Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to official Zabbix Python API #131674

Merged
merged 4 commits into from
Dec 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CODEOWNERS
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
Loading