mirror of
https://github.com/ceph/ceph
synced 2025-01-11 21:50:26 +00:00
Added validation of zabbix_host to support hostnames, IPv4 and IPv6.
Changed exception logging. Doc typo fixed. Signed-off-by: slivik <jakub.sliva@gmail.com>
This commit is contained in:
parent
96c6cb4e4e
commit
c5e74c9f29
@ -113,7 +113,7 @@ For example:
|
||||
|
||||
::
|
||||
|
||||
ceph zabbix config-set zabbix_host "zabbix1,zabbix2:2222,zabbix3:3333"
|
||||
ceph zabbix config-set zabbix_host "zabbix1,zabbix2:2222,zabbix3:3333"
|
||||
|
||||
|
||||
Manually sending data
|
||||
|
@ -6,6 +6,7 @@ server using the zabbix_sender executable.
|
||||
"""
|
||||
import json
|
||||
import errno
|
||||
import re
|
||||
from subprocess import Popen, PIPE
|
||||
from threading import Event
|
||||
from mgr_module import MgrModule
|
||||
@ -51,6 +52,7 @@ class Module(MgrModule):
|
||||
run = False
|
||||
config = dict()
|
||||
ceph_health_mapping = {'HEALTH_OK': 0, 'HEALTH_WARN': 1, 'HEALTH_ERR': 2}
|
||||
_zabbix_hosts = list()
|
||||
|
||||
@property
|
||||
def config_keys(self):
|
||||
@ -112,6 +114,9 @@ class Module(MgrModule):
|
||||
for key, default in self.config_keys.items():
|
||||
self.set_config_option(key, self.get_module_option(key, default))
|
||||
|
||||
if self.config['zabbix_host']:
|
||||
self._parse_zabbix_hosts()
|
||||
|
||||
def set_config_option(self, option, value):
|
||||
if option not in self.config_keys.keys():
|
||||
raise RuntimeError('{0} is a unknown configuration '
|
||||
@ -132,6 +137,20 @@ class Module(MgrModule):
|
||||
self.config[option] = value
|
||||
return True
|
||||
|
||||
def _parse_zabbix_hosts(self):
|
||||
self._zabbix_hosts = list()
|
||||
servers = self.config['zabbix_host'].split(",")
|
||||
for server in servers:
|
||||
uri = re.match("(?:(?:\[?)([a-z0-9-\.]+|[a-f0-9:\.]+)(?:\]?))(?:((?::))([0-9]{1,5}))?$", server)
|
||||
if uri:
|
||||
zabbix_host, sep, zabbix_port = uri.groups()
|
||||
zabbix_port = zabbix_port if sep == ':' else self.config['zabbix_port']
|
||||
self._zabbix_hosts.append({'zabbix_host': zabbix_host, 'zabbix_port': zabbix_port})
|
||||
else:
|
||||
self.log.error('Zabbix host "%s" is not valid', server)
|
||||
|
||||
self.log.error('Parsed Zabbix hosts: %s', self._zabbix_hosts)
|
||||
|
||||
def get_pg_stats(self):
|
||||
stats = dict()
|
||||
|
||||
@ -257,7 +276,7 @@ class Module(MgrModule):
|
||||
if identifier is None or len(identifier) == 0:
|
||||
identifier = 'ceph-{0}'.format(self.fsid)
|
||||
|
||||
if not self.config['zabbix_host']:
|
||||
if not self.config['zabbix_host'] or not self._zabbix_hosts:
|
||||
self.log.error('Zabbix server not set, please configure using: '
|
||||
'ceph zabbix config-set zabbix_host <zabbix_host>')
|
||||
self.set_health_checks({
|
||||
@ -269,25 +288,21 @@ class Module(MgrModule):
|
||||
})
|
||||
return
|
||||
|
||||
servers = self.config['zabbix_host'].split(",")
|
||||
result = True
|
||||
|
||||
for server in servers:
|
||||
zabbix_host, sep, zabbix_port = server.partition(':')
|
||||
zabbix_port = zabbix_port if sep == ':' else self.config['zabbix_port']
|
||||
|
||||
for server in self._zabbix_hosts:
|
||||
self.log.info(
|
||||
'Sending data to Zabbix server %s, port %s as host/identifier %s',
|
||||
zabbix_host, zabbix_port, identifier)
|
||||
server['zabbix_host'], server['zabbix_port'], identifier)
|
||||
self.log.debug(data)
|
||||
|
||||
try:
|
||||
zabbix = ZabbixSender(self.config['zabbix_sender'],
|
||||
zabbix_host,
|
||||
zabbix_port, self.log)
|
||||
server['zabbix_host'],
|
||||
server['zabbix_port'], self.log)
|
||||
zabbix.send(identifier, data)
|
||||
except Exception as exc:
|
||||
self.log.error('Exception when sending: %s', exc)
|
||||
self.log.exception('Failed to send.')
|
||||
self.set_health_checks({
|
||||
'MGR_ZABBIX_SEND_FAILED': {
|
||||
'severity': 'warning',
|
||||
@ -295,6 +310,7 @@ class Module(MgrModule):
|
||||
'detail': [str(exc)]
|
||||
}
|
||||
})
|
||||
result = False
|
||||
|
||||
self.set_health_checks(dict())
|
||||
return result
|
||||
@ -311,6 +327,8 @@ class Module(MgrModule):
|
||||
self.log.debug('Setting configuration option %s to %s', key, value)
|
||||
if self.set_config_option(key, value):
|
||||
self.set_module_option(key, value)
|
||||
if key == 'zabbix_host' or key == 'zabbix_port':
|
||||
self._parse_zabbix_hosts()
|
||||
return 0, 'Configuration option {0} updated'.format(key), ''
|
||||
|
||||
return 1,\
|
||||
|
Loading…
Reference in New Issue
Block a user