Source code for temelio_monitoring.resource.database.redis.scalar_info_value
"""
This ressource check Redis scalar info values
"""
from nagiosplugin import CheckError
from nagiosplugin import Metric
from nagiosplugin import Resource
from redis import StrictRedis
from redis.exceptions import RedisError
[docs]class ScalarInfoValue(Resource):
"""
This ressource get one value from redis information about connections
"""
def __init__(self, **kwargs):
"""
Initialize ressource attributes
:param host: Redis server ip address or fqdn
:param port: Redis server listening port
:param password: Password of username authorized to view stats
:param metric_name: Redis informations metric name
:param section_name: Redis informations section name
:type host: string
:type port: int
:type password: string
:type metric_name: string
:type section_name: string
"""
# Arguments management
self.database_id = kwargs.get('database_id', 0)
self.host = kwargs.get('host', '127.0.0.1')
self.metric_name = kwargs.get('metric_name', '')
self.password = kwargs.get('password', '')
self.port = kwargs.get('port', 6379)
self.section_name = kwargs.get('section_name', 'default')
self.redis_infos = {}
def _get_hit_rate(self):
"""
Calculate and return Redis hit rate
:returns: Database hit rate
:rtype: float
"""
keyspace_hits = self.redis_infos['keyspace_hits']
keyspace_misses = self.redis_infos['keyspace_misses']
divisor = keyspace_hits + keyspace_misses
if divisor == 0:
return 0.0
return float(keyspace_hits / (keyspace_hits + keyspace_misses))
[docs] def probe(self):
"""
Get information data about connections and return Metric objects
:return: a generator with informations
:rtype: generator
"""
try:
# Connect to redis server
redis_client = StrictRedis(
db=self.database_id,
host=self.host,
password=self.password,
port=self.port)
# Get statistics
self.redis_infos = redis_client.info(section=self.section_name)
except RedisError as error:
raise CheckError(
'Error with Redis server connection: {}'.format(str(error)))
# Get metric value, or raise
metric_value = None
if self.metric_name == 'hit_rate':
metric_value = self._get_hit_rate()
elif self.metric_name in self.redis_infos:
metric_value = self.redis_infos[self.metric_name]
else:
raise CheckError(
'"{}": Unknown info metric name'.format(self.metric_name))
# Build and return Metric objects from data if scalar, else raise
if isinstance(metric_value, int) or isinstance(metric_value, float):
yield Metric('db{}_{}'.format(self.database_id, self.metric_name),
metric_value)
else:
raise CheckError(
'"{}" value is not an integer or float: "{}" !'.format(
self.metric_name, metric_value))