From 053f072d9b14fdc4e8a062ab9f76a4a9384528d2 Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Thu, 28 Apr 2016 16:44:28 +0200 Subject: [PATCH 1/4] Correct Grafana dashboard (error on network interface bitrate. See issue #856 --- conf/glances-grafana.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/glances-grafana.json b/conf/glances-grafana.json index 47bcdf5d..67b977dd 100644 --- a/conf/glances-grafana.json +++ b/conf/glances-grafana.json @@ -795,14 +795,14 @@ ], "interval": "", "measurement": "localhost.network", - "query": "SELECT mean(\"enp0s25.rx\") FROM \"localhost.network\" WHERE $timeFilter GROUP BY time($interval) fill(null)", + "query": "SELECT mean(\"eth0.rx\")/mean(\"eth0.time_since_update\")*8 FROM \"localhost.network\" WHERE $timeFilter GROUP BY time($interval) fill(null)", "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ - "enp0s25.rx" + "eth0.rx" ], "type": "field" }, @@ -817,12 +817,12 @@ }, { "alias": "Tx", - "column": "enp0s25.tx*-1", + "column": "eth0.tx*-1", "dsType": "influxdb", "fields": [ { "func": "mean", - "name": "wlan0.tx" + "name": "eth0.tx" } ], "fill": "null", @@ -837,14 +837,14 @@ } ], "measurement": "localhost.network", - "query": "SELECT mean(\"enp0s25.tx\") FROM \"localhost.network\" WHERE $timeFilter GROUP BY time($interval) fill(null)", + "query": "SELECT mean(\"eth0.tx\")/mean(\"eth0.time_since_update\")*8 FROM \"localhost.network\" WHERE $timeFilter GROUP BY time($interval) fill(null)", "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ - "enp0s25.tx" + "eth0.tx" ], "type": "field" }, @@ -861,7 +861,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Net (wlan0)", + "title": "Net (eth0)", "tooltip": { "shared": false, "value_type": "cumulative" @@ -2171,4 +2171,4 @@ "schemaVersion": 8, "version": 1, "links": [] -} \ No newline at end of file +} From 7fe328a6aa65033da2a41e86d14e48cce2a63bb5 Mon Sep 17 00:00:00 2001 From: Christopher Rung Date: Tue, 3 May 2016 09:15:58 -0400 Subject: [PATCH 2/4] Correct Grafana dashboard - disk I/O --- conf/glances-grafana.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/glances-grafana.json b/conf/glances-grafana.json index 67b977dd..13198e26 100644 --- a/conf/glances-grafana.json +++ b/conf/glances-grafana.json @@ -1088,7 +1088,7 @@ } ], "measurement": "localhost.diskio", - "query": "SELECT mean(\"sda2.read_bytes\") FROM \"localhost.diskio\" WHERE $timeFilter GROUP BY time($interval) fill(null)", + "query": "SELECT mean(\"sda2.read_bytes\")/mean(\"sda2.time_since_update\")*8 FROM \"localhost.diskio\" WHERE $timeFilter GROUP BY time($interval) fill(null)", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1130,7 +1130,7 @@ } ], "measurement": "localhost.diskio", - "query": "SELECT mean(\"sda2.write_bytes\") FROM \"localhost.diskio\" WHERE $timeFilter GROUP BY time($interval) fill(null)", + "query": "SELECT mean(\"sda2.write_bytes\")/mean(\"sda2.time_since_update\")*8 FROM \"localhost.diskio\" WHERE $timeFilter GROUP BY time($interval) fill(null)", "refId": "B", "resultFormat": "time_series", "select": [ From 9c08a38cfc7e2e245af6d006cc00992a31efac93 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Mon, 18 Apr 2016 22:49:26 +0200 Subject: [PATCH 3/4] Crash with Docker 1.11 #848 --- glances/plugins/glances_docker.py | 52 +++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/glances/plugins/glances_docker.py b/glances/plugins/glances_docker.py index b8c9bd7d..9ec587db 100644 --- a/glances/plugins/glances_docker.py +++ b/glances/plugins/glances_docker.py @@ -256,6 +256,7 @@ class Plugin(GlancesPlugin): except KeyError as e: # all_stats do not have CPU information logger.debug("Can not grab CPU usage for container {0} ({1})".format(container_id, e)) + logger.debug(all_stats) else: # Previous CPU stats stored in the cpu_old variable if not hasattr(self, 'cpu_old'): @@ -294,13 +295,16 @@ class Plugin(GlancesPlugin): ret = {} # Read the stats try: - ret['rss'] = all_stats['memory_stats']['stats']['rss'] - ret['cache'] = all_stats['memory_stats']['stats']['cache'] + # Do not exist anymore with Docker 1.11 (issue #848) + # ret['rss'] = all_stats['memory_stats']['stats']['rss'] + # ret['cache'] = all_stats['memory_stats']['stats']['cache'] ret['usage'] = all_stats['memory_stats']['usage'] + ret['limit'] = all_stats['memory_stats']['limit'] ret['max_usage'] = all_stats['memory_stats']['max_usage'] - except KeyError as e: + except (KeyError, TypeError) as e: # all_stats do not have MEM information logger.debug("Can not grab MEM usage for container {0} ({1})".format(container_id, e)) + logger.debug(all_stats) # Return the stats return ret @@ -319,10 +323,11 @@ class Plugin(GlancesPlugin): # Read the rx/tx stats (in bytes) try: - netcounters = all_stats["network"] + netcounters = all_stats["networks"] except KeyError as e: # all_stats do not have NETWORK information logger.debug("Can not grab NET usage for container {0} ({1})".format(container_id, e)) + logger.debug(all_stats) # No fallback available... return network_new @@ -344,11 +349,16 @@ class Plugin(GlancesPlugin): # By storing time data we enable Rx/s and Tx/s calculations in the # XML/RPC API, which would otherwise be overly difficult work # for users of the API - network_new['time_since_update'] = getTimeSinceLastUpdate('docker_net_{0}'.format(container_id)) - network_new['rx'] = netcounters["rx_bytes"] - self.netcounters_old[container_id]["rx_bytes"] - network_new['tx'] = netcounters["tx_bytes"] - self.netcounters_old[container_id]["tx_bytes"] - network_new['cumulative_rx'] = netcounters["rx_bytes"] - network_new['cumulative_tx'] = netcounters["tx_bytes"] + try: + network_new['time_since_update'] = getTimeSinceLastUpdate('docker_net_{0}'.format(container_id)) + network_new['rx'] = netcounters["eth0"]["rx_bytes"] - self.netcounters_old[container_id]["eth0"]["rx_bytes"] + network_new['tx'] = netcounters["eth0"]["tx_bytes"] - self.netcounters_old[container_id]["eth0"]["tx_bytes"] + network_new['cumulative_rx'] = netcounters["eth0"]["rx_bytes"] + network_new['cumulative_tx'] = netcounters["eth0"]["tx_bytes"] + except KeyError: + # all_stats do not have INTERFACE information + logger.debug("Can not grab network interface usage for container {0} ({1})".format(container_id, e)) + logger.debug(all_stats) # Save stats to compute next bitrate self.netcounters_old[container_id] = netcounters @@ -375,6 +385,7 @@ class Plugin(GlancesPlugin): except KeyError as e: # all_stats do not have io information logger.debug("Can not grab block IO usage for container {0} ({1})".format(container_id, e)) + logger.debug(all_stats) # No fallback available... return io_new @@ -455,13 +466,15 @@ class Plugin(GlancesPlugin): ret.append(self.curse_add_line(msg)) msg = '{0:>7}'.format('MEM') ret.append(self.curse_add_line(msg)) - msg = '{0:>6}'.format('IOR/s') + msg = '{0:>7}'.format('/MAX') ret.append(self.curse_add_line(msg)) - msg = '{0:>6}'.format('IOW/s') + msg = '{0:>7}'.format('IOR/s') ret.append(self.curse_add_line(msg)) - msg = '{0:>6}'.format('Rx/s') + msg = '{0:>7}'.format('IOW/s') ret.append(self.curse_add_line(msg)) - msg = '{0:>6}'.format('Tx/s') + msg = '{0:>7}'.format('Rx/s') + ret.append(self.curse_add_line(msg)) + msg = '{0:>7}'.format('Tx/s') ret.append(self.curse_add_line(msg)) msg = ' {0:8}'.format('Command') ret.append(self.curse_add_line(msg)) @@ -496,21 +509,26 @@ class Plugin(GlancesPlugin): except KeyError: msg = '{0:>7}'.format('?') ret.append(self.curse_add_line(msg)) + try: + msg = '{0:>7}'.format(self.auto_unit(container['memory']['limit'])) + except KeyError: + msg = '{0:>7}'.format('?') + ret.append(self.curse_add_line(msg)) # IO R/W for r in ['ior', 'iow']: try: value = self.auto_unit(int(container['io'][r] // container['io']['time_since_update'] * 8)) + "b" - msg = '{0:>6}'.format(value) + msg = '{0:>7}'.format(value) except KeyError: - msg = '{0:>6}'.format('?') + msg = '{0:>7}'.format('?') ret.append(self.curse_add_line(msg)) # NET RX/TX for r in ['rx', 'tx']: try: value = self.auto_unit(int(container['network'][r] // container['network']['time_since_update'] * 8)) + "b" - msg = '{0:>6}'.format(value) + msg = '{0:>7}'.format(value) except KeyError: - msg = '{0:>6}'.format('?') + msg = '{0:>7}'.format('?') ret.append(self.curse_add_line(msg)) # Command msg = ' {0}'.format(container['Command']) From 59788e91adce777a2ca0d3187411a88925c82ed6 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Thu, 12 May 2016 10:58:47 +0200 Subject: [PATCH 4/4] version 2.6.2 --- NEWS | 6 +++--- docs/man/glances.1 | 2 +- glances/__init__.py | 2 +- setup.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/NEWS b/NEWS index ddefe38d..e647ddac 100644 --- a/NEWS +++ b/NEWS @@ -2,12 +2,12 @@ Glances Version 2 ============================================================================== -Version 2.7 -=========== +Version 2.6.2 +============= Bugs corrected: - * Crash on launch when viewing temperature of laptop HDD in sleep mode (issue #824) + * Crash with Docker 1.11 (issue #848) Version 2.6.1 ============= diff --git a/docs/man/glances.1 b/docs/man/glances.1 index e1adc7bd..2ca53d1c 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GLANCES" "1" "March 26, 2016" "2.6.1" "Glances" +.TH "GLANCES" "1" "May 12, 2016" "2.6.2" "Glances" .SH NAME glances \- An eye on your system . diff --git a/glances/__init__.py b/glances/__init__.py index ebcb1bba..f86ddcc0 100644 --- a/glances/__init__.py +++ b/glances/__init__.py @@ -27,7 +27,7 @@ import sys # Global name __appname__ = 'glances' -__version__ = '2.7_BETA' +__version__ = '2.6.2' __author__ = 'Nicolas Hennion ' __license__ = 'LGPL' diff --git a/setup.py b/setup.py index 0f8a64e0..ecc20989 100755 --- a/setup.py +++ b/setup.py @@ -50,7 +50,7 @@ def get_requires(): setup( name='Glances', - version='2.6.1', + version='2.6.2', description="A cross-platform curses-based monitoring tool", long_description=open('README.rst').read(), author='Nicolas Hennion',