diff options
Diffstat (limited to 'glances/exports/glances_rabbitmq/__init__.py')
-rw-r--r-- | glances/exports/glances_rabbitmq/__init__.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/glances/exports/glances_rabbitmq/__init__.py b/glances/exports/glances_rabbitmq/__init__.py new file mode 100644 index 00000000..04ab8307 --- /dev/null +++ b/glances/exports/glances_rabbitmq/__init__.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com> +# +# SPDX-License-Identifier: LGPL-3.0-only +# + +"""JMS interface class.""" + +import datetime +import socket +import sys +from numbers import Number + +from glances.logger import logger +from glances.exports.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.""" + super(Export, self).__init__(config=config, args=args) + + # Mandatory configuration keys (additional to host and port) + self.user = None + self.password = None + self.queue = None + self.protocol = None + + # Optionals configuration keys + # N/A + + # Load the rabbitMQ configuration file + self.export_enable = self.load_conf( + 'rabbitmq', mandatories=['host', 'port', 'user', 'password', 'queue'], options=['protocol'] + ) + if not self.export_enable: + exit('Missing RABBITMQ config') + + # Get the current hostname + self.hostname = socket.gethostname() + + # Init the rabbitmq client + self.client = self.init() + + def init(self): + """Init the connection to the rabbitmq server.""" + if not self.export_enable: + return None + + # Needed for when protocol is not specified and when protocol is upper case + # only amqp and amqps supported + if self.protocol is not None and (self.protocol.lower() == 'amqps'): + self.protocol = 'amqps' + else: + self.protocol = 'amqp' + + try: + parameters = pika.URLParameters( + self.protocol + '://' + self.user + ':' + self.password + '@' + self.host + ':' + self.port + '/' + ) + connection = pika.BlockingConnection(parameters) + channel = connection.channel() + return channel + except Exception as e: + logger.critical("Connection to rabbitMQ server %s:%s failed. %s" % (self.host, self.port, e)) + sys.exit(2) + + 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(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.queue, body=data) + except Exception as e: + logger.error("Can not export stats to RabbitMQ (%s)" % e) |