diff --git a/NEWS b/NEWS index 36cf541a..2c32d59d 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,7 @@ Enhancements and new features: * A way to have only REST API available and disable WEB GUI access #1149 * Docker module doesn't export details about stopped containers #1152 * Add a light mode for the console UI #1165 + * Refactor InfluxDB (API is now stable) #1166 Bugs corrected: @@ -19,7 +20,8 @@ Bugs corrected: Backward-incompatible changes: - * Support for Docker API < 2.0 is deprecated (docker plugins) + * Support for Docker API < 2.0 is deprecated (Docker plugins) + * Support for InfluxDB < 0.9 is deprecated (InfluxDB exporter) News command line options: diff --git a/glances/exports/glances_influxdb.py b/glances/exports/glances_influxdb.py index cfd95016..88746287 100644 --- a/glances/exports/glances_influxdb.py +++ b/glances/exports/glances_influxdb.py @@ -26,16 +26,9 @@ from glances.exports.glances_export import GlancesExport from influxdb import InfluxDBClient from influxdb.client import InfluxDBClientError -from influxdb.influxdb08 import InfluxDBClient as InfluxDBClient08 -from influxdb.influxdb08.client import InfluxDBClientError as InfluxDBClientError08 - -# Constants for tracking specific behavior -INFLUXDB_08 = '0.8' -INFLUXDB_09PLUS = '0.9+' class Export(GlancesExport): - """This class manages the InfluxDB export module.""" def __init__(self, config=None, args=None): @@ -75,18 +68,7 @@ class Export(GlancesExport): password=self.password, database=self.db) get_all_db = [i['name'] for i in db.get_list_database()] - self.version = INFLUXDB_09PLUS - except InfluxDBClientError: - # https://github.com/influxdb/influxdb-python/issues/138 - logger.info("Trying fallback to InfluxDB v0.8") - db = InfluxDBClient08(host=self.host, - port=self.port, - username=self.user, - password=self.password, - database=self.db) - get_all_db = [i['name'] for i in db.get_list_database()] - self.version = INFLUXDB_08 - except InfluxDBClientError08 as e: + except InfluxDBClientError as e: logger.critical("Cannot connect to InfluxDB database '%s' (%s)" % (self.db, e)) sys.exit(2) @@ -99,29 +81,27 @@ class Export(GlancesExport): return db + def _normalize(self, name, columns, points): + """Normalize data for the InfluxDB's data model.""" + for i, _ in enumerate(points): + try: + # Convert all int to float (mandatory for InfluxDB>0.9.2) + # Correct issue#750 and issue#749 + points[i] = float(points[i]) + except (TypeError, ValueError) as e: + logger.debug("InfluxDB error during stat convertion %s=%s (%s)" % (columns[i], points[i], e)) + return [{'measurement': name, + 'tags': self.parse_tags(self.tags), + 'fields': dict(zip(columns, points))}] + def export(self, name, columns, points): """Write the points to the InfluxDB server.""" logger.debug("Export {} stats to InfluxDB".format(name)) # Manage prefix if self.prefix is not None: name = self.prefix + '.' + name - # Create DB input - if self.version == INFLUXDB_08: - data = [{'name': name, 'columns': columns, 'points': [points]}] - else: - # Convert all int to float (mandatory for InfluxDB>0.9.2) - # Correct issue#750 and issue#749 - for i, _ in enumerate(points): - try: - points[i] = float(points[i]) - except (TypeError, ValueError) as e: - logger.debug("InfluxDB error during stat convertion %s=%s (%s)" % (columns[i], points[i], e)) - - data = [{'measurement': name, - 'tags': self.parse_tags(self.tags), - 'fields': dict(zip(columns, points))}] # Write input to the InfluxDB database try: - self.client.write_points(data) + self.client.write_points(self._normalize(name, columns, points)) except Exception as e: logger.error("Cannot export {} stats to InfluxDB ({})".format(name, e))