Add support for v7 (#1835)

* Add support for v7

* Bump version
This commit is contained in:
Zoltán Bedi
2024-06-10 14:53:15 +02:00
committed by GitHub
parent 7664a75617
commit aecdb4bbee
8 changed files with 478 additions and 29 deletions

View File

@@ -1,5 +1,9 @@
# Change Log # Change Log
## [4.5.0] - 2024-06-10
- Add support for Zabbix version 7
## [4.4.9] - 2024-04-30 ## [4.4.9] - 2024-04-30
- Fix: Improve compatibility with the scenes framework (#1822) - Fix: Improve compatibility with the scenes framework (#1822)

View File

@@ -1,12 +1,12 @@
FROM python:2.7 FROM python:3.12-slim-bullseye
ENV ZBX_API_URL=http://zabbix-web:8080 ENV ZBX_API_URL=http://zabbix-web:8080
ENV ZBX_API_USER="Admin" ENV ZBX_API_USER="Admin"
ENV ZBX_API_PASSWORD="zabbix" ENV ZBX_API_PASSWORD="zabbix"
ENV ZBX_CONFIG="zbx_export_hosts.xml" ENV ZBX_CONFIG="zbx_export_hosts.json"
ENV ZBX_BOOTSTRAP_SCRIPT="bootstrap_config.py" ENV ZBX_BOOTSTRAP_SCRIPT="bootstrap_config.py"
RUN pip install pyzabbix RUN pip install zabbix_utils
ADD ./bootstrap_config.py /bootstrap_config.py ADD ./bootstrap_config.py /bootstrap_config.py
ADD ${ZBX_CONFIG} /${ZBX_CONFIG} ADD ${ZBX_CONFIG} /${ZBX_CONFIG}

View File

@@ -1,27 +1,20 @@
import os import os
from time import sleep from zabbix_utils import ZabbixAPI
from pyzabbix import ZabbixAPI, ZabbixAPIException
zabbix_url = os.environ['ZBX_API_URL'] zabbix_url = os.environ['ZBX_API_URL']
zabbix_user = os.environ['ZBX_API_USER'] zabbix_user = os.environ['ZBX_API_USER']
zabbix_password = os.environ['ZBX_API_PASSWORD'] zabbix_password = os.environ['ZBX_API_PASSWORD']
print(zabbix_url, zabbix_user, zabbix_password) print(zabbix_url, zabbix_user, zabbix_password)
zapi = ZabbixAPI(zabbix_url, timeout=5) zapi = ZabbixAPI(zabbix_url)
for i in range(10): for i in range(10):
print("Trying to connected to Zabbix API %s" % zabbix_url)
try: try:
zapi.login(zabbix_user, zabbix_password) zapi.login(user=zabbix_user, password=zabbix_password)
print("Connected to Zabbix API Version %s" % zapi.api_version()) print("Connected to Zabbix API Version %s" % zapi.api_version())
break break
except ZabbixAPIException as e: except Exception as e:
print e print(e)
sleep(5)
except:
print("Waiting")
sleep(5)
config_path = os.environ['ZBX_CONFIG'] config_path = os.environ['ZBX_CONFIG']
import_rules = { import_rules = {
@@ -70,11 +63,13 @@ with open(config_path, 'r') as f:
config = f.read() config = f.read()
try: try:
# https://github.com/lukecyca/pyzabbix/issues/62 import_result = zapi.configuration.import_(source=config, format="json", rules=import_rules)
import_result = zapi.confimport("xml", config, import_rules) if import_result == True:
print(import_result) print("Zabbix config imported successfully")
except ZabbixAPIException as e: else:
print e print("Failed to import Zabbix config")
except Exception as e:
print(e)
for h in zapi.host.get(output="extend"): for h in zapi.host.get(output="extend"):
print(h['name']) print(h['name'])

View File

@@ -0,0 +1,427 @@
{
"zabbix_export": {
"version": "7.0",
"host_groups": [
{
"uuid": "2e427c268ac1468b9add94b65e2d6c14",
"name": "Backend"
},
{
"uuid": "d97ba66b283544339628b71975a6e68d",
"name": "Frontend"
},
{
"uuid": "dc579cd7a1a34222933f24f52a68bcd8",
"name": "Linux servers"
},
{
"uuid": "6f6799aa69e844b4b3918f779f2abf08",
"name": "Zabbix servers"
}
],
"hosts": [
{
"host": "backend01",
"name": "backend01",
"templates": [
{
"name": "Template ZAS Agent"
}
],
"groups": [
{
"name": "Backend"
},
{
"name": "Linux servers"
}
],
"interfaces": [
{
"useip": "NO",
"dns": "zas_backend_01",
"interface_ref": "if1"
}
],
"tags": [
{
"tag": "backend"
},
{
"tag": "service",
"value": "backend"
}
],
"inventory_mode": "DISABLED"
},
{
"host": "backend02",
"name": "backend02",
"templates": [
{
"name": "Template ZAS Agent"
}
],
"groups": [
{
"name": "Backend"
},
{
"name": "Linux servers"
}
],
"interfaces": [
{
"useip": "NO",
"dns": "zas_backend_02",
"interface_ref": "if1"
}
],
"tags": [
{
"tag": "backend"
},
{
"tag": "service",
"value": "backend"
}
],
"inventory_mode": "DISABLED"
},
{
"host": "frontend01",
"name": "frontend01",
"templates": [
{
"name": "Template ZAS Agent"
}
],
"groups": [
{
"name": "Frontend"
},
{
"name": "Linux servers"
}
],
"interfaces": [
{
"useip": "NO",
"dns": "zas_frontend_01",
"interface_ref": "if1"
}
],
"tags": [
{
"tag": "frontend"
},
{
"tag": "service",
"value": "frontend"
}
],
"inventory_mode": "DISABLED"
},
{
"host": "frontend02",
"name": "frontend02",
"templates": [
{
"name": "Template ZAS Agent"
}
],
"groups": [
{
"name": "Frontend"
},
{
"name": "Linux servers"
}
],
"interfaces": [
{
"useip": "NO",
"dns": "zas_frontend_02",
"interface_ref": "if1"
}
],
"tags": [
{
"tag": "frontend"
},
{
"tag": "service",
"value": "frontend"
}
],
"inventory_mode": "DISABLED"
},
{
"host": "Zabbix server",
"name": "Zabbix server",
"templates": [
{
"name": "Linux by Zabbix agent"
},
{
"name": "Zabbix server health"
}
],
"groups": [
{
"name": "Zabbix servers"
}
],
"interfaces": [
{
"useip": "NO",
"dns": "zabbix-agent",
"interface_ref": "if1"
}
],
"inventory_mode": "DISABLED"
}
],
"template_groups": [
{
"uuid": "7df96b18c230490a9a0a9e2307226338",
"name": "Templates"
}
],
"templates": [
{
"uuid": "2d7a65bb369c48199361913b223b1695",
"template": "Template ZAS Agent",
"name": "Template ZAS Agent",
"templates": [
{
"name": "Zabbix agent"
}
],
"groups": [
{
"name": "Templates"
}
],
"items": [
{
"uuid": "e79d4215ec014b74923b905bb8f82410",
"name": "Incoming network traffic on eth0",
"key": "net.if.in[eth0]",
"history": "1d",
"units": "bps",
"tags": [
{
"tag": "Application",
"value": "Network interfaces"
}
]
},
{
"uuid": "18b377dae9fe48d093c16ee7a7c93320",
"name": "Outgoing network traffic on eth0",
"key": "net.if.out[eth0]",
"history": "1d",
"units": "bps",
"tags": [
{
"tag": "Application",
"value": "Network interfaces"
}
]
},
{
"uuid": "2479e055e91c476f9be93b5f363cfa2f",
"name": "Processor load (1 min average per core)",
"key": "system.cpu.load[percpu,avg1]",
"history": "1d",
"value_type": "FLOAT",
"description": "The processor load is calculated as system CPU load divided by number of CPU cores.",
"tags": [
{
"tag": "Application",
"value": "CPU"
},
{
"tag": "Application",
"value": "Performance"
}
],
"triggers": [
{
"uuid": "60e5484b60ca4061b21bd23f8364bd6e",
"expression": "last(/Template ZAS Agent/system.cpu.load[percpu,avg1])>2",
"name": "Processor load is too high on {HOST.NAME}",
"priority": "WARNING",
"tags": [
{
"tag": "app",
"value": "performance"
},
{
"tag": "type",
"value": "cpu"
}
]
}
]
},
{
"uuid": "f0dd4221793c49889cf2789806afa597",
"name": "Processor load (15 min average per core)",
"key": "system.cpu.load[percpu,avg15]",
"history": "1d",
"value_type": "FLOAT",
"description": "The processor load is calculated as system CPU load divided by number of CPU cores.",
"tags": [
{
"tag": "Application",
"value": "CPU"
},
{
"tag": "Application",
"value": "Performance"
}
]
},
{
"uuid": "9a8b4a1f173b4f209723d820dc2e054a",
"name": "CPU $2 time",
"key": "system.cpu.util[,iowait]",
"history": "1d",
"value_type": "FLOAT",
"units": "%",
"description": "Amount of time the CPU has been waiting for I/O to complete.",
"tags": [
{
"tag": "Application",
"value": "CPU"
},
{
"tag": "Application",
"value": "Performance"
}
],
"triggers": [
{
"uuid": "ceb468b9eb434fa6bd4c8a5d7507fd87",
"expression": "avg(/Template ZAS Agent/system.cpu.util[,iowait],5m)>20",
"name": "Disk I/O is overloaded on {HOST.NAME}",
"priority": "WARNING",
"description": "OS spends significant time waiting for I/O (input/output) operations. It could be indicator of performance issues with storage system.",
"tags": [
{
"tag": "disk"
},
{
"tag": "type",
"value": "disk"
}
]
}
]
},
{
"uuid": "e6d19d47cf60452ead1e791da2d5c0dc",
"name": "CPU $2 time",
"key": "system.cpu.util[,system]",
"history": "1d",
"value_type": "FLOAT",
"units": "%",
"description": "The time the CPU has spent running the kernel and its processes.",
"tags": [
{
"tag": "Application",
"value": "CPU"
},
{
"tag": "Application",
"value": "Performance"
}
]
},
{
"uuid": "2d81fbc139774306959712a627c99b9a",
"name": "CPU $2 time",
"key": "system.cpu.util[,user]",
"history": "1d",
"value_type": "FLOAT",
"units": "%",
"description": "The time the CPU has spent running users' processes that are not niced.",
"tags": [
{
"tag": "Application",
"value": "CPU"
},
{
"tag": "Application",
"value": "Performance"
}
]
}
]
}
],
"graphs": [
{
"uuid": "7aac0ec0c0e04b7a8bb6472d1faa7a09",
"name": "CPU load",
"ymin_type_1": "FIXED",
"graph_items": [
{
"color": "009900",
"item": {
"host": "Template ZAS Agent",
"key": "system.cpu.load[percpu,avg1]"
}
},
{
"sortorder": "2",
"color": "990000",
"item": {
"host": "Template ZAS Agent",
"key": "system.cpu.load[percpu,avg15]"
}
}
]
},
{
"uuid": "f25064d88b964a678fac7ea6095b238a",
"name": "CPU utilization",
"show_triggers": "NO",
"type": "STACKED",
"ymin_type_1": "FIXED",
"ymax_type_1": "FIXED",
"graph_items": [
{
"sortorder": "4",
"drawtype": "FILLED_REGION",
"color": "999900",
"item": {
"host": "Template ZAS Agent",
"key": "system.cpu.util[,iowait]"
}
},
{
"sortorder": "5",
"drawtype": "FILLED_REGION",
"color": "990000",
"item": {
"host": "Template ZAS Agent",
"key": "system.cpu.util[,system]"
}
},
{
"sortorder": "6",
"drawtype": "FILLED_REGION",
"color": "000099",
"item": {
"host": "Template ZAS Agent",
"key": "system.cpu.util[,user]"
}
}
]
}
]
}
}

View File

@@ -1,6 +1,6 @@
{ {
"name": "grafana-zabbix", "name": "grafana-zabbix",
"version": "4.4.9", "version": "4.5.0",
"description": "Zabbix plugin for Grafana", "description": "Zabbix plugin for Grafana",
"homepage": "http://grafana-zabbix.org", "homepage": "http://grafana-zabbix.org",
"bugs": { "bugs": {

View File

@@ -128,8 +128,10 @@ export function addTriggerHostProxy(triggers, proxies) {
triggers.forEach((trigger) => { triggers.forEach((trigger) => {
if (trigger.hosts && trigger.hosts.length) { if (trigger.hosts && trigger.hosts.length) {
const host = trigger.hosts[0]; const host = trigger.hosts[0];
if (host.proxy_hostid !== '0') { // Before version 7.0.0 proxy_hostid was used, after - proxyid
const hostProxy = proxies[host.proxy_hostid]; const proxyId = host.proxyid || host.proxy_hostid;
if (proxyId !== '0') {
const hostProxy = proxies[proxyId];
host.proxy = hostProxy ? hostProxy.host : ''; host.proxy = hostProxy ? hostProxy.host : '';
} }
} }

View File

@@ -530,7 +530,7 @@ export class ZabbixAPIConnector {
} }
getTriggersByIds(triggerids: string[]) { getTriggersByIds(triggerids: string[]) {
const params: any = { const params = {
output: 'extend', output: 'extend',
triggerids: triggerids, triggerids: triggerids,
expandDescription: true, expandDescription: true,
@@ -540,13 +540,20 @@ export class ZabbixAPIConnector {
monitored: true, monitored: true,
skipDependent: true, skipDependent: true,
selectGroups: ['name', 'groupid'], selectGroups: ['name', 'groupid'],
selectHosts: ['hostid', 'name', 'host', 'maintenance_status', 'proxy_hostid', 'description'], selectHosts: ['hostid', 'name', 'host', 'maintenance_status', 'description'],
selectItems: ['itemid', 'name', 'key_', 'lastvalue'], selectItems: ['itemid', 'name', 'key_', 'lastvalue'],
// selectLastEvent: 'extend', // selectLastEvent: 'extend',
// selectTags: 'extend', // selectTags: 'extend',
preservekeys: '1', preservekeys: '1',
}; };
// Before version 7.0.0 proxy_hostid was used, after - proxyid
if (semver.lte(this.version, '7.0.0')) {
params.selectHosts.push('proxy_hostid');
} else {
params.selectHosts.push('proxyid');
}
return this.request('trigger.get', params).then(utils.mustArray); return this.request('trigger.get', params).then(utils.mustArray);
} }
@@ -568,12 +575,19 @@ export class ZabbixAPIConnector {
value: 1, value: 1,
}, },
selectGroups: ['groupid', 'name'], selectGroups: ['groupid', 'name'],
selectHosts: ['hostid', 'name', 'host', 'maintenance_status', 'proxy_hostid'], selectHosts: ['hostid', 'name', 'host', 'maintenance_status'],
selectItems: ['itemid', 'name', 'key_', 'lastvalue'], selectItems: ['itemid', 'name', 'key_', 'lastvalue'],
selectLastEvent: 'extend', selectLastEvent: 'extend',
selectTags: 'extend', selectTags: 'extend',
}; };
// Before version 7.0.0 proxy_hostid was used, after - proxyid
if (semver.lte(this.version, '7.0.0')) {
params.selectHosts.push('proxy_hostid');
} else {
params.selectHosts.push('proxyid');
}
if (showTriggers === ShowProblemTypes.Problems) { if (showTriggers === ShowProblemTypes.Problems) {
params.filter.value = 1; params.filter.value = 1;
} else if (showTriggers === ShowProblemTypes.Recent || showTriggers === ShowProblemTypes.History) { } else if (showTriggers === ShowProblemTypes.Recent || showTriggers === ShowProblemTypes.History) {
@@ -674,7 +688,7 @@ export class ZabbixAPIConnector {
const params = { const params = {
eventids: eventids, eventids: eventids,
output: ['alertid', 'eventid', 'message', 'clock', 'error'], output: ['alertid', 'eventid', 'message', 'clock', 'error'],
selectUsers: true, selectUsers: 'extend',
}; };
return this.request('alert.get', params); return this.request('alert.get', params);
@@ -861,8 +875,13 @@ export class ZabbixAPIConnector {
getProxies() { getProxies() {
const params = { const params = {
output: ['proxyid', 'host'], output: ['proxyid'],
}; };
if (semver.lte(this.version, '7.0.0')) {
params.output.push('name');
} else {
params.output.push('host');
}
return this.request('proxy.get', params); return this.request('proxy.get', params);
} }

View File

@@ -599,7 +599,9 @@ export class Zabbix implements ZabbixConnector {
triggers = triggers.filter((trigger) => { triggers = triggers.filter((trigger) => {
for (let i = 0; i < trigger.hosts.length; i++) { for (let i = 0; i < trigger.hosts.length; i++) {
const host = trigger.hosts[i]; const host = trigger.hosts[i];
if (proxy_ids.includes(host.proxy_hostid)) { // Before version 7.0.0 proxy_hostid was used, after - proxyid
const proxyId = host.proxyid || host.proxy_hostid;
if (proxy_ids.includes(proxyId)) {
return true; return true;
} }
} }