summaryrefslogtreecommitdiffstats
path: root/glances/exports/elasticsearch/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/exports/elasticsearch/__init__.py')
-rw-r--r--glances/exports/elasticsearch/__init__.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/glances/exports/elasticsearch/__init__.py b/glances/exports/elasticsearch/__init__.py
new file mode 100644
index 00000000..83e5dc98
--- /dev/null
+++ b/glances/exports/elasticsearch/__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
+#
+
+"""ElasticSearch interface class."""
+
+import sys
+from datetime import datetime
+
+from glances.logger import logger
+from glances.exports.export import GlancesExport
+
+from elasticsearch import Elasticsearch, helpers
+
+
+class Export(GlancesExport):
+
+ """This class manages the ElasticSearch (ES) export module."""
+
+ def __init__(self, config=None, args=None):
+ """Init the ES export IF."""
+ super(Export, self).__init__(config=config, args=args)
+
+ # Mandatory configuration keys (additional to host and port)
+ self.index = None
+
+ # Load the ES configuration file
+ self.export_enable = self.load_conf(
+ 'elasticsearch', mandatories=['scheme', 'host', 'port', 'index'], options=[]
+ )
+ if not self.export_enable:
+ sys.exit(2)
+
+ # Init the ES client
+ self.client = self.init()
+
+ def init(self):
+ """Init the connection to the ES server."""
+ if not self.export_enable:
+ return None
+
+ try:
+ es = Elasticsearch(hosts=['{}://{}:{}'.format(self.scheme, self.host, self.port)])
+ except Exception as e:
+ logger.critical(
+ "Cannot connect to ElasticSearch server %s://%s:%s (%s)" % (self.scheme, self.host, self.port, e)
+ )
+ sys.exit(2)
+
+ if not es.ping():
+ logger.critical("Cannot ping the ElasticSearch server %s://%s:%s" % (self.scheme, self.host, self.port))
+ sys.exit(2)
+ else:
+ logger.info("Connected to the ElasticSearch server %s://%s:%s" % (self.scheme, self.host, self.port))
+
+ return es
+
+ def export(self, name, columns, points):
+ """Write the points to the ES server."""
+ logger.debug("Export {} stats to ElasticSearch".format(name))
+
+ # Generate index name with the index field + current day
+ index = '{}-{}'.format(self.index, datetime.utcnow().strftime("%Y.%m.%d"))
+
+ # Create DB input
+ # https://elasticsearch-py.readthedocs.io/en/master/helpers.html
+ actions = []
+ dt_now = datetime.utcnow().isoformat('T')
+ action = {
+ "_index": index,
+ "_id": '{}.{}'.format(name, dt_now),
+ "_type": 'glances-{}'.format(name),
+ "_source": {"plugin": name, "timestamp": dt_now},
+ }
+ action['_source'].update(zip(columns, [str(p) for p in points]))
+ actions.append(action)
+
+ logger.debug("Exporting the following object to elasticsearch: {}".format(action))
+
+ # Write input to the ES index
+ try:
+ helpers.bulk(self.client, actions)
+ except Exception as e:
+ logger.error("Cannot export {} stats to ElasticSearch ({})".format(name, e))