summaryrefslogtreecommitdiffstats
path: root/glances/exports/glances_couchdb/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/exports/glances_couchdb/__init__.py')
-rw-r--r--glances/exports/glances_couchdb/__init__.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/glances/exports/glances_couchdb/__init__.py b/glances/exports/glances_couchdb/__init__.py
new file mode 100644
index 00000000..5cc65529
--- /dev/null
+++ b/glances/exports/glances_couchdb/__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
+#
+
+"""CouchDB interface class."""
+
+#
+# How to test ?
+#
+# 1) docker run -d -e COUCHDB_USER=admin -e COUCHDB_PASSWORD=admin -p 5984:5984 --name my-couchdb couchdb
+# 2) ./venv/bin/python -m glances -C ./conf/glances.conf --export couchdb --quiet
+# 3) Result can be seen at: http://127.0.0.1:5984/_utils
+#
+
+import sys
+from datetime import datetime
+
+from glances.logger import logger
+from glances.exports.export import GlancesExport
+
+import pycouchdb
+
+
+class Export(GlancesExport):
+
+ """This class manages the CouchDB export module."""
+
+ def __init__(self, config=None, args=None):
+ """Init the CouchDB export IF."""
+ super(Export, self).__init__(config=config, args=args)
+
+ # Load the CouchDB configuration file section
+ # User and Password are mandatory with CouchDB 3.0 and higher
+ self.export_enable = self.load_conf('couchdb', mandatories=['host', 'port', 'db', 'user', 'password'])
+ if not self.export_enable:
+ sys.exit(2)
+
+ # Init the CouchDB client
+ self.client = self.init()
+
+ def init(self):
+ """Init the connection to the CouchDB server."""
+ if not self.export_enable:
+ return None
+
+ # @TODO: https
+ server_uri = 'http://{}:{}@{}:{}/'.format(self.user, self.password, self.host, self.port)
+
+ try:
+ s = pycouchdb.Server(server_uri)
+ except Exception as e:
+ logger.critical("Cannot connect to CouchDB server (%s)" % e)
+ sys.exit(2)
+ else:
+ logger.info("Connected to the CouchDB server version %s" % s.info()['version'])
+
+ try:
+ s.database(self.db)
+ except Exception:
+ # Database did not exist
+ # Create it...
+ s.create(self.db)
+ logger.info("Create CouchDB database %s" % self.db)
+ else:
+ logger.info("CouchDB database %s already exist" % self.db)
+
+ return s.database(self.db)
+
+ def export(self, name, columns, points):
+ """Write the points to the CouchDB server."""
+ logger.debug("Export {} stats to CouchDB".format(name))
+
+ # Create DB input
+ data = dict(zip(columns, points))
+
+ # Add the type and the timestamp in ISO format
+ data['type'] = name
+ data['time'] = datetime.now().isoformat()[:-3] + 'Z'
+
+ # Write data to the CouchDB database
+ try:
+ self.client.save(data)
+ except Exception as e:
+ logger.error("Cannot export {} stats to CouchDB ({})".format(name, e))