From 0d5dcd4f13cf02cd32e015c88d5d1b2fa2fdff5d Mon Sep 17 00:00:00 2001 From: Nicolargo Date: Sun, 4 Jan 2015 20:59:04 +0100 Subject: [PATCH] Docker plugin first version --- NEWS | 3 +- README.rst | 1 + docs/glances-doc.rst | 7 + docs/images/docker.png | Bin 0 -> 60028 bytes glances/core/glances_main.py | 2 + glances/outputs/glances_curses.py | 12 +- glances/plugins/glances_batpercent.py | 1 + glances/plugins/glances_docker.py | 201 ++++++++++++++++++++++++++ glances/plugins/glances_help.py | 4 + 9 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 docs/images/docker.png create mode 100644 glances/plugins/glances_docker.py diff --git a/NEWS b/NEWS index 7ecc1530..81ee3911 100644 --- a/NEWS +++ b/NEWS @@ -10,7 +10,8 @@ Version 2.3 * Add Statsd export module (--export-statsd) (issue #465) * Refactor export module (CSV export option is now --export-csv). It is now possible to export stats from the Glances client mode (issue #463) * The Web inteface is now based on BootStarp / RWD grid (issue #417, #366 and #461) Thanks to Nicolas Hart @nclsHart - * Add the RAID plugins (issue #447) + * Add the RAID plugin (issue #447) + * Add the Docker plugin (issue #440) Version 2.2.1 ============= diff --git a/README.rst b/README.rst index faff1001..c1f309cd 100644 --- a/README.rst +++ b/README.rst @@ -44,6 +44,7 @@ Optional dependencies: - ``influxdb`` (for the InfluxDB export module) - ``statsd`` (for the StatsD export module) - ``pystache`` (for the action script feature) +- ``docker-py`` (for the Docker monitoring support) [Linux-only] Installation ============ diff --git a/docs/glances-doc.rst b/docs/glances-doc.rst index 7ea6c134..c86b1c7b 100644 --- a/docs/glances-doc.rst +++ b/docs/glances-doc.rst @@ -671,6 +671,13 @@ Each alert message displays the following information: 4. {min,avg,max} values or number of running processes for monitored processes list alerts +Docker +------ + +If you use Docker, Glances can help you to monitor your container. Glances uses the Docker API through the Docker-Py library. + +.. image:: images/docker.png + Actions ------- diff --git a/docs/images/docker.png b/docs/images/docker.png new file mode 100644 index 0000000000000000000000000000000000000000..e8115359e89ce8f7fe0e39bd0e260d417f33bad1 GIT binary patch literal 60028 zcmV)3K+C_0P)i?DhBO(9*1R(w+K*(Q`h_YNN z{&NHX#QYy20sv;aK;ip@=ym|j^)d4enhOA+=TqVb2DujI9x(fAXxG?6U+BFwV*EA{ zfPlb#R`V0FB&myUJ+u8Cv{x6kRVT5x%oWhQT_W>y^ZU^an=7Mr*L<}xzd`KHtUe;~ zyGLhpP^Kl%_;Ls`98pT$LeUOP-_p_3dmpplE#%La=gs*K5~{l)>y8p>=^!E^a^GCN%oKl@{Qil^dH?2SSl!hb)yCGy!9^c&**_bC1m z`j&_M`;36ld<3Cup5)OWfB=K&jxqY5#Fh{O0%CyfT~J5>P*zq-L}3`_aycUYiG&y= zuPCGtEkh*_f^)0pJHe*83BKRRS)*vPdc16^D<dVzI$^IbnoeFl> zQT$1AiL#t9(swc0uYrVpvQ{xu6hxGEC`3?7^*KId1(w2NAz~O3g&_c0E{YpEwAMPm znqd@eL|%|RK>o_HEi$ob^8Nf9q0FH^>Tiv#pT!GB@$QPEc9hX7M5msc0wkd5S>mPO zcAgU7YF;YJot^$PWWQq1`$WZ_7qE`(C6RDd`IM4{IH2VTl(Lm#JB1k%9=^?qC

T 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 z%0D))n*GL~dz3@nqSx*ovj)lzed_y_fBg8|krlA+{d-4!Uuzz%Zqe(*z6w3bcf9k0 z7W*CF72wC==N!?m-{Jj^IOD+ZY%gyK&g8ud*rz`9wZK3cQ;wO608 zONS0UkG1IX+dgbI z=&tj7GyqyPX~gTR&AJ^Lts7cZUo((vrQgOg1{JM#=+?Dcr)H&C-fD-g-MenLb!mJE zOFN$Z%$WC|Jv-V^2w2ko)CV8CviXNYpIz8=$8OzwbnCW5%LefoqSB6M|M%?=o;#;g z{Ni!r!Z$`OXmj=r1NZH`uoA8S03ZNKL_t)t!(M0HG^qWzue>>bgNX)O_U_g2yN_r7 zK|X6#Pks-Ed-DkdOoD*6e07a>i41bQ5D_S+8C+K@PD| ziW`mxw-jj^{!CV;U_nYeDkMKAL3B*RD5K@%IcR|sYJ8bq?uvbq$s1MmQu%2}`7dC4U&{hWge^Fg^^-g$WJ#(n#j>5E7NfK7Kl zX;*+%9-p14P|r+;YIW2a87qPuIcU8fdJI#h@VB=^fZkBr^8 zUw@hBZ_}~UHt{dCY#^7XcHy(PkG}1-<4*YJ1)UBY^RK)63?6XEZhP)k3~PQE|H?gA zUHkE>B&@a9f;RlNvhh9_{PVn4jRL4yHsk$!1`QdzJm)P6Mt@zm^s|w(uR44GHcx#2 zLqsG@8#iuqz!mph*0xa)uAKY+eOEs+ZzBNE+Nyg74PN)xtB1UBd1KhPV!`Bho>*R2 zAbMCgYs`d=M<0b_->P04Z>+V`?CU(aybd6@{QaA6+-c}7Z%w*+{nF_leYCi)yS!mA zV;C{JRPB$ijcanr6YuU&zM|^+8*X}gNe&~jyp@$B$8XrL$G9;XNsldw3XS{S{ain& z`E~ABqpm*d(GQn}06?p!+;PQSxBdOvm)>jwYZiQP|K+z&Ton=`)c)|&<>v)A-8A^A zceW|sxU}lE`#!1_tvL|>_UVw@KYIJ_J1_oZz=N}=-FyDvbvN73n^t>`!ruhoL?8q# z@A2pVK66xK0021iq5qx<-#>KBfG57I)$KsVPDkz2Fn|;9eD=iXJHNet_ThI--{6D( zYQKBtnj5#h<1fQUUJ?90W7I8IKDp3by13PWM{PUrmCt|4Id_^N4WUBSX1*=a6m(^2 zP)mZC)VEc1mA2oLAbY06v!+lEyqy?T#X`t zYCKBbH%(+lznBlil(vk5Re3Bplz}QdYRZJ@NW!D(fJ+z`kZBz7yCS#ez(kHoBpD!u zaZiWnhLP1ul0ciM!+?1I2Ne^Rpi)o%%KQsoYIDrC%opnNap=n3v!kv( z7qXK>X^(G?Z{xj(jQ-2A%TE3GoEo-EyuANzT_8o62b~5bQnj;^E)HYYMMkG~jYmsF z#5-oAJ1=g1+VgLmUper&p>sDHHd%C6+vHw})kL4=lFdz^J-(oV6AY2)shL^4nTY;h z_gW1Vn*-OYk>A~7YMxNK)8(%{-v0jMZ~Am4rQCxrO;<5nQW-%==I@j!d#DOUx`INA zgtolAJloEXGa>2xB`371lt%F4?yKasW71qBrk-6@RnESn^8Erq3;GaLQj*Td0HS0O zww~4F)hIzG@>y`C!jL~)>`1V-GDJI?B5Tk$2qKgqG$Vf)bKNABR!G(s5v}(@jvTu( zf+5~JFi5FzESDl6&hZ0_f)`T>lFH zWb%nqj;|90fuTdjsARy~^|g8$e}kz!^C^*0eSI+6f2C=EOI3nw7+$9IMc%evGD%aY zV{NNxYIwlJkyckeeBb14cJEM11X^{9KNmASnNpmjJu^jy&h|Xcap4R!h@#Jq=Wy{t z1!YZ|cj^& zxAB`)m&`>XwdQinPyp86Wof%U%`5-?@K-CzEw1~*f^-0%)FwM(|4G&zlLwV_P*hT? z=SpoI{bvIU9#c~8M5LyqN4oAoW=|dj7{BX!U3P$3hcWO2%wgW_^1ivqwo<*L)O> z?sm%L+MRSq&fHVdGjGf$E1mI{M`7hG6yNkk5ȰSg;YHasG!ta^rfO!cA`UKJow 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%0A~iQ%m_o*9)y#Pk_CdSOPn8QBPStSd$Z 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%0D0%b&jNPe&bf;jo_%y5r%qJC$&4EUC0B$?`Vg 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

d*`lEqSr9cE6rfP^^Uq&A0<;SK3~Di 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 P00000NkvXXu0mjf>b_!` literal 0 HcmV?d00001 diff --git a/glances/core/glances_main.py b/glances/core/glances_main.py index 7a5b016f..2a275c0c 100644 --- a/glances/core/glances_main.py +++ b/glances/core/glances_main.py @@ -77,6 +77,8 @@ class GlancesMain(object): dest='disable_sensors', help=_('disable sensors module')) parser.add_argument('--disable-raid', action='store_true', default=False, dest='disable_raid', help=_('disable RAID module')) + parser.add_argument('--disable-docker', action='store_true', default=False, + dest='disable_docker', help=_('disable Docker module')) parser.add_argument('--disable-left-sidebar', action='store_true', default=False, dest='disable_left_sidebar', help=_('disable network, disk io, FS and sensors modules')) parser.add_argument('--disable-process', action='store_true', default=False, diff --git a/glances/outputs/glances_curses.py b/glances/outputs/glances_curses.py index 378dc64b..c98b7a5b 100644 --- a/glances/outputs/glances_curses.py +++ b/glances/outputs/glances_curses.py @@ -266,6 +266,9 @@ class _GlancesCurses(object): elif self.pressedkey == ord('d'): # 'd' > Show/hide disk I/O stats self.args.disable_diskio = not self.args.disable_diskio + elif self.pressedkey == ord('D'): + # 'D' > Show/hide Docker stats + self.args.disable_docker = not self.args.disable_docker elif self.pressedkey == ord('e'): # 'e' > Enable/Disable extended stats for top process self.args.enable_process_extended = not self.args.enable_process_extended @@ -432,6 +435,8 @@ class _GlancesCurses(object): stats_sensors = stats.get_plugin( 'sensors').get_stats_display(args=self.args) stats_now = stats.get_plugin('now').get_stats_display() + stats_docker = stats.get_plugin('docker').get_stats_display( + args=self.args) stats_processcount = stats.get_plugin( 'processcount').get_stats_display(args=self.args) stats_monitor = stats.get_plugin( @@ -441,7 +446,8 @@ class _GlancesCurses(object): # Adapt number of processes to the available space max_processes_displayed = screen_y - 11 - \ - self.get_stats_display_height(stats_alert) + self.get_stats_display_height(stats_alert) - \ + self.get_stats_display_height(stats_docker) if self.args.enable_process_extended and not self.args.process_tree: max_processes_displayed -= 4 if max_processes_displayed < 0: @@ -534,9 +540,11 @@ class _GlancesCurses(object): self.next_line = self.saved_line # Display right sidebar - # (PROCESS_COUNT+MONITORED+PROCESS_LIST+ALERT) + # ((DOCKER)+PROCESS_COUNT+(MONITORED)+PROCESS_LIST+ALERT) self.new_column() self.new_line() + self.display_plugin(stats_docker) + self.new_line() self.display_plugin(stats_processcount) if glances_processes.get_process_filter() is None and cs_status == 'None': # Do not display stats monitor list if a filter exist diff --git a/glances/plugins/glances_batpercent.py b/glances/plugins/glances_batpercent.py index ff1deecc..e2ced95c 100644 --- a/glances/plugins/glances_batpercent.py +++ b/glances/plugins/glances_batpercent.py @@ -56,6 +56,7 @@ class Plugin(GlancesPlugin): """Reset/init the stats.""" self.stats = [] + @GlancesPlugin._log_result_decorator def update(self): """Update battery capacity stats using the input method.""" # Reset stats diff --git a/glances/plugins/glances_docker.py b/glances/plugins/glances_docker.py new file mode 100644 index 00000000..edd01081 --- /dev/null +++ b/glances/plugins/glances_docker.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +# +# This file is part of Glances. +# +# Copyright (C) 2015 Nicolargo +# +# Glances is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Glances is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . + +"""Docker plugin.""" + +# Import Glances libs +from glances.core.glances_logging import logger +from glances.plugins.glances_plugin import GlancesPlugin + +# Docker-py library (optional and Linux-only) +# https://github.com/docker/docker-py +try: + import docker + import requests +except ImportError as e: + logger.debug("Docker library not found (%s). Glances cannot grab Docker info." % e) + docker_tag = False +else: + docker_tag = True + + +class Plugin(GlancesPlugin): + + """Glances' Docker plugin. + + stats is a list + """ + + def __init__(self, args=None): + """Init the plugin.""" + GlancesPlugin.__init__(self, args=args) + + # The plgin can be disable using: args.disable_docker + self.args = args + + # We want to display the stat in the curse interface + self.display_curse = True + + # Init the Docker API + self.docker_client = self.connect() + if self.docker_client is None: + global docker_tag + docker_tag = False + + def connect(self, version=None): + """Connect to the Docker server""" + # Init connection to the Docker API + if version is None: + ret = docker.Client(base_url='unix://var/run/docker.sock') + else: + ret = docker.Client(base_url='unix://var/run/docker.sock', + version=version) + try: + ret.version() + except requests.exceptions.ConnectionError as e: + # Connexion error (Docker not detected) + # Let this message in debug mode + logger.debug("Can't connect to the Docker server (%s)" % e) + ret = None + except docker.errors.APIError as e: + if version is None: + # API error (Version mismatch ?) + logger.debug("Docker API error (%s)" % e) + # Try the connection with the server version + import re + version = re.search('server\:\ (.*)\)\"\)', str(e)) + if version: + logger.debug("Try connection with Docker API version %s" % version.group(1)) + ret = self.connect(version=version.group(1)) + else: + # API error + logger.error("Docker API error (%s)" % e) + ret = None + except Exception as e: + # Others exceptions... + # Connexion error (Docker not detected) + logger.error("Can't connect to the Docker server (%s)" % e) + ret = None + + return ret + + def reset(self): + """Reset/init the stats.""" + self.stats = {} + + @GlancesPlugin._log_result_decorator + def update(self): + """Update Docker stats using the input method. + """ + # Reset stats + self.reset() + + # The Docker-py lib is mandatory + if not docker_tag or self.args.disable_docker: + return self.stats + + if self.get_input() == 'local': + # Update stats + # Exemple: { + # "KernelVersion": "3.16.4-tinycore64", + # "Arch": "amd64", + # "ApiVersion": "1.15", + # "Version": "1.3.0", + # "GitCommit": "c78088f", + # "Os": "linux", + # "GoVersion": "go1.3.3" + # } + self.stats['version'] = self.docker_client.version() + # Example: [{u'Status': u'Up 36 seconds', + # u'Created': 1420378904, + # u'Image': u'nginx:1', + # u'Ports': [{u'Type': u'tcp', u'PrivatePort': 443}, + # {u'IP': u'0.0.0.0', u'Type': u'tcp', u'PublicPort': 8080, u'PrivatePort': 80}], + # u'Command': u"nginx -g 'daemon off;'", + # u'Names': [u'/webstack_nginx_1'], + # u'Id': u'b0da859e84eb4019cf1d965b15e9323006e510352c402d2f442ea632d61faaa5'}] + self.stats['containers'] = self.docker_client.containers() + + elif self.get_input() == 'snmp': + # Update stats using SNMP + # Not available + pass + + return self.stats + + def msg_curse(self, args=None): + """Return the dict to display in the curse interface.""" + # Init the return message + ret = [] + + # Only process if stats exist (and non null) and display plugin enable... + if self.stats == {} or args.disable_docker or len(self.stats['containers']) == 0: + return ret + + # Build the string message + # Title + msg = '{0}'.format(_("CONTAINERS")) + ret.append(self.curse_add_line(msg, "TITLE")) + msg = ' {0}'.format(len(self.stats['containers'])) + ret.append(self.curse_add_line(msg)) + msg = ' ({0} {1})'.format(_("served by Docker"), + self.stats['version']["Version"]) + ret.append(self.curse_add_line(msg)) + ret.append(self.curse_new_line()) + # Header + ret.append(self.curse_new_line()) + msg = '{0:>14}'.format(_("Id")) + ret.append(self.curse_add_line(msg)) + msg = ' {0:20}'.format(_("Name")) + ret.append(self.curse_add_line(msg)) + msg = '{0:>26}'.format(_("Status")) + ret.append(self.curse_add_line(msg)) + msg = ' {0:8}'.format(_("Command")) + ret.append(self.curse_add_line(msg)) + # Data + for container in self.stats['containers']: + ret.append(self.curse_new_line()) + # Id + msg = '{0:>14}'.format(container['Id'][0:12]) + ret.append(self.curse_add_line(msg)) + # Name + name = container['Names'][0] + if len(name) > 20: + name = '_' + name[:-19] + else: + name[0:20] + msg = ' {0:20}'.format(name) + ret.append(self.curse_add_line(msg)) + # Status + status = self.container_alert(container['Status']) + msg = container['Status'].replace("minute", "min") + msg = '{0:>26}'.format(msg[0:25]) + ret.append(self.curse_add_line(msg, status)) + # Command + msg = ' {0}'.format(container['Command']) + ret.append(self.curse_add_line(msg)) + + return ret + + def container_alert(self, status): + """Analyse the container status""" + if "Paused" in status: + return 'CAREFUL' + else: + return 'OK' diff --git a/glances/plugins/glances_help.py b/glances/plugins/glances_help.py index 02504b1d..bf1f18f6 100644 --- a/glances/plugins/glances_help.py +++ b/glances/plugins/glances_help.py @@ -139,6 +139,10 @@ class Plugin(GlancesPlugin): ret.append(self.curse_new_line()) msg = msg_col.format("/", _("Enable/disable short processes name")) ret.append(self.curse_add_line(msg)) + ret.append(self.curse_new_line()) + msg = msg_col.format("D", _("Enable/disable Docker stats")) + ret.append(self.curse_add_line(msg)) + ret.append(self.curse_new_line()) ret.append(self.curse_new_line())