summaryrefslogtreecommitdiffstats
path: root/glances/exports/glances_statsd/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/exports/glances_statsd/__init__.py')
-rw-r--r--glances/exports/glances_statsd/__init__.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/glances/exports/glances_statsd/__init__.py b/glances/exports/glances_statsd/__init__.py
new file mode 100644
index 00000000..57620a0c
--- /dev/null
+++ b/glances/exports/glances_statsd/__init__.py
@@ -0,0 +1,75 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of Glances.
+#
+# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
+#
+# SPDX-License-Identifier: LGPL-3.0-only
+#
+
+"""Statsd interface class."""
+
+from numbers import Number
+
+from glances.logger import logger
+from glances.exports.export import GlancesExport
+
+from statsd import StatsClient
+
+
+class Export(GlancesExport):
+
+ """This class manages the Statsd export module."""
+
+ def __init__(self, config=None, args=None):
+ """Init the Statsd export IF."""
+ super(Export, self).__init__(config=config, args=args)
+
+ # Mandatory configuration keys (additional to host and port)
+ # N/A
+
+ # Optional configuration keys
+ self.prefix = None
+
+ # Load the configuration file
+ self.export_enable = self.load_conf('statsd', mandatories=['host', 'port'], options=['prefix'])
+ if not self.export_enable:
+ exit('Missing STATSD config')
+
+ # Default prefix for stats is 'glances'
+ if self.prefix is None:
+ self.prefix = 'glances'
+
+ # Init the Statsd client
+ self.client = self.init()
+
+ def init(self):
+ """Init the connection to the Statsd server."""
+ if not self.export_enable:
+ return None
+ logger.info("Stats will be exported to StatsD server: {}:{}".format(self.host, self.port))
+ return StatsClient(self.host, int(self.port), prefix=self.prefix)
+
+ def export(self, name, columns, points):
+ """Export the stats to the Statsd server."""
+ for i in range(len(columns)):
+ if not isinstance(points[i], Number):
+ continue
+ stat_name = '{}.{}'.format(name, columns[i])
+ stat_value = points[i]
+ try:
+ self.client.gauge(normalize(stat_name), stat_value)
+ except Exception as e:
+ logger.error("Can not export stats to Statsd (%s)" % e)
+ logger.debug("Export {} stats to Statsd".format(name))
+
+
+def normalize(name):
+ """Normalize name for the Statsd convention"""
+
+ # Name should not contain some specials chars (issue #1068)
+ ret = name.replace(':', '')
+ ret = ret.replace('%', '')
+ ret = ret.replace(' ', '_')
+
+ return ret