diff options
Diffstat (limited to 'glances/exports/glances_rabbitmq.py')
-rw-r--r-- | glances/exports/glances_rabbitmq.py | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/glances/exports/glances_rabbitmq.py b/glances/exports/glances_rabbitmq.py new file mode 100644 index 00000000..c859ff30 --- /dev/null +++ b/glances/exports/glances_rabbitmq.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# Copyright (C) 2015 Nicolargo <nicolas@nicolargo.com> +# +# Glances is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Glances is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +"""JMS interface class.""" + +# Import sys libs +import datetime +import socket +import sys +from numbers import Number + +# Import Glances lib +from glances.core.glances_logging import logger +try: + from configparser import NoOptionError, NoSectionError +except ImportError: # Python 2 + from ConfigParser import NoOptionError, NoSectionError +from glances.exports.glances_export import GlancesExport + +# Import pika for RabbitMQ +import pika + + +class Export(GlancesExport): + + """This class manages the rabbitMQ export module.""" + + def __init__(self, config=None, args=None): + """Init the RabbitMQ export IF.""" + GlancesExport.__init__(self, config=config, args=args) + + # Load the rabbitMQ configuration file + self.rabbitmq_host = None + self.rabbitmq_port = None + self.rabbitmq_user = None + self.rabbitmq_password = None + self.rabbitmq_queue = None + self.hostname = socket.gethostname() + self.export_enable = self.load_conf() + if not self.export_enable: + sys.exit(2) + + # Init the rabbitmq client + self.client = self.init() + + def load_conf(self, section="rabbitmq"): + """Load the rabbitmq configuration in the Glances configuration file.""" + if self.config is None: + return False + try: + self.rabbitmq_host = self.config.get_value(section, 'host') + self.rabbitmq_port = self.config.get_value(section, 'port') + self.rabbitmq_user = self.config.get_value(section, 'user') + self.rabbitmq_password = self.config.get_value(section, 'password') + self.rabbitmq_queue = self.config.get_value(section, 'queue') + except NoSectionError: + logger.critical("No rabbitmq configuration found") + return False + except NoOptionError as e: + logger.critical("Error in the RabbitM configuration (%s)" % e) + return False + else: + logger.debug("Load RabbitMQ from the Glances configuration file") + return True + + def init(self): + """Init the connection to the rabbitmq server.""" + if not self.export_enable: + return None + try: + parameters = pika.URLParameters( + 'amqp://' + self.rabbitmq_user + + ':' + self.rabbitmq_password + + '@' + self.rabbitmq_host + + ':' + self.rabbitmq_port + '/') + connection = pika.BlockingConnection(parameters) + channel = connection.channel() + return channel + except Exception as e: + logger.critical("Connection to rabbitMQ failed : %s " % e) + return None + + def export(self, name, columns, points): + """Write the points in RabbitMQ.""" + data = ('hostname=' + self.hostname + ', name=' + name + + ', dateinfo=' + datetime.datetime.utcnow().isoformat()) + for i in range(0, len(columns)): + if not isinstance(points[i], Number): + continue + else: + data += ", " + columns[i] + "=" + str(points[i]) + logger.debug(data) + try: + self.client.basic_publish(exchange='', routing_key=self.rabbitmq_queue, body=data) + except Exception as e: + logger.error("Can not export stats to RabbitMQ (%s)" % e) |