Update doc for AMP

This commit is contained in:
nicolargo 2016-05-02 10:32:46 +02:00
parent 1621832567
commit 9c609ffdfd
15 changed files with 201 additions and 81 deletions

5
NEWS
View File

@ -19,6 +19,11 @@ Bugs corrected:
* [Web UI] Fix folders plugin never displayed (issue #829) * [Web UI] Fix folders plugin never displayed (issue #829)
* Correct issue IP plugin: VPN with no internet access (issue #842) * Correct issue IP plugin: VPN with no internet access (issue #842)
Deprecated:
* Python 2.6 is no longer supported
* Monitoring process list module is replaced by AMP
Version 2.6.1 Version 2.6.1
============= =============

View File

@ -253,19 +253,18 @@ queue=glances_queue
[amp_dropbox] [amp_dropbox]
# Use the default AMP (no dedicated AMP Python script) # Use the default AMP (no dedicated AMP Python script)
enable=true enable=false
regex=.*dropbox.* regex=.*dropbox.*
refresh=3 refresh=3
one_line=false one_line=false
command=dropbox status command=dropbox status
countmin=1 countmin=1
[amp_xeyes] [amp_python]
# Use the default AMP (no dedicated AMP Python script) # Monitor all Python scripts
enable=true enable=false
regex=.*xeyes.* regex=.*python.*
refresh=3 refresh=3
countmin=1
countmax=2 countmax=2
[amp_nginx] [amp_nginx]
@ -291,9 +290,3 @@ regex=\/sbin\/init
refresh=30 refresh=30
one_line=true one_line=true
service_cmd=/usr/bin/service --status-all service_cmd=/usr/bin/service --status-all
[amp_python]
# Monitor all Python scripts
enable=true
regex=.*python.*
refresh=3

BIN
docs/_static/amp-python-warning.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
docs/_static/amp-python.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
docs/_static/amps-dropbox.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
docs/_static/amps.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 79 KiB

101
docs/aoa/amps.rst Normal file
View File

@ -0,0 +1,101 @@
.. _amps:
Applications Monitoring Process
===============================
Thanks to Glances and it AMP module, you can add specific monitoring
to running process. AMP are defined in the Glances configuration file.
You can disable AMP using the --disable-amps option or pressing the `A` shortkey.
Simple AMP
----------
For example, a simple AMP which monitor the CPU/MEM of all Python processes
can be define using:
.. code-block:: ini
[amp_python]
enable=true
regex=.*python.*
refresh=3
Every 3 seconds (*refresh*) and if the *enable* key is true, Glances will
filter the running processes list thanks to the .*python.* regular
expression (*regex*). The default behavor for an AMP is to display:
the number of matching processes, the CPU and MEM:
.. image:: ../_static/amp-python.png
You can also define the minimum (*countmin*) and/or maximum (*countmax*) process
number. For example:
.. code-block:: ini
[amp_python]
enable=true
regex=.*python.*
refresh=3
countmin=1
countmax=2
With this configuration, if the number of running Python script is higher than 2
then the AMP is display with a purple color (red if < countmin):
.. image:: ../_static/amp-python-warning.png
User define AMP
---------------
If you need to execute a specific command line, you can use the *command* option.
For example, if you want to display the Dropbox process status, you can define the
following section in the Glances configuration file:
.. code-block:: ini
[amp_dropbox]
# Use the default AMP (no dedicated AMP Python script)
enable=true
regex=.*dropbox.*
refresh=3
one_line=false
command=dropbox status
countmin=1
The *dropbox status* command line will be executed and displayed in the Glances UI:
.. image:: ../_static/amp-python-dropbox.png
You can force Glances to display the result in one line setting the *one_line* to true.
Embeded AMP
-----------
Glances provides some specifics AMP scripts (replacing the *command* line) hosted
in the glances/amps folder. You can write your own AMP script to fill yours needs.
AMP scripts are located in the glances/amps folder and should be names glances_*.py.
An AMP script define an Amp class (GlancesAmp) with a mandatory update method.
The update method call the set_result method to set the AMP return string.
The return string is a string with one or more line (\n between lines).
You can write your owns AMP and enable its from the configuration file.
The configuration file section should be named [amp_*].
For example, if you want to enable the Nginx AMP, the following definition
should do the job (NGinx AMP is provided by the Glances team as an example):
.. code-block:: ini
[amp_nginx]
enable=true
regex=\/usr\/sbin\/nginx
refresh=60
one_line=false
status_url=http://localhost/nginx_status
Here is the result:
.. image:: ../_static/amps.png
In client/server mode, the AMP list is defined on the server side.

View File

@ -3,63 +3,6 @@
Monitored Processes List Monitored Processes List
======================== ========================
The monitored processes list allows user, through the configuration The monitored processes list is deprecated.
file, to group processes and quickly show if the number of running
processes is not good.
.. image:: ../_static/monitored.png Please use the Application Monitoring Process (AMP).
Each item is defined by:
- ``description``: description of the processes (max 16 chars).
- ``regex``: regular expression of the processes to monitor.
- ``command``: (optional) full path to shell command/script for extended
- stat. Should return a single line string. Use with caution.
- ``countmin``: (optional) minimal number of processes. A warning will
- be displayed if number of processes < count.
- ``countmax``: (optional) maximum number of processes. A warning will
be displayed if number of processes > count.
Up to ``10`` items can be defined.
For example, if you want to monitor the Nginx processes on a web server,
the following definition should do the job:
.. code-block:: ini
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
If you also want to monitor the PHP-FPM daemon processes, you should add
another item:
.. code-block:: ini
[monitor]
list_1_description=Nginx server
list_1_regex=.*nginx.*
list_1_command=nginx -v
list_1_countmin=1
list_1_countmax=4
list_2_description=PHP-FPM
list_2_regex=.*php-fpm.*
list_2_countmin=1
list_2_countmax=20
In client/server mode, the list is defined on the server side.
A new method, called `getAllMonitored`, is available in the APIs and
get the JSON representation of the monitored processes list.
Alerts are set as following:
================= ============
# of process Status
================= ============
``0`` ``CRITICAL``
``min < p < max`` ``OK``
``p > max`` ``WARNING``
================= ============

View File

@ -95,11 +95,7 @@ Command-Line Options
disable process module disable process module
.. option:: --disable-monitor .. option:: --disable-amps
disable monitoring process list module
.. option:: --disable-amp
disable application monitoring process module disable application monitoring process module

View File

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
# Copyright (C) 2016 Nicolargo <nicolas@nicolargo.com>
#
# 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 <http://www.gnu.org/licenses/>.
"""
Default AMP
=========
Monitor a process by executing a command line. This is the default AMP's behavor
if no AMP script is found.
Configuration file example
--------------------------
[amp_foo]
enable=true
regex=\/usr\/bin\/foo
refresh=10
one_line=false
command=foo status
"""
from subprocess import check_output, STDOUT
from glances.compat import u, to_ascii
from glances.logger import logger
from glances.amps.glances_amp import GlancesAmp
class Amp(GlancesAmp):
"""Glances' Default AMP."""
NAME = ''
VERSION = '1.0'
DESCRIPTION = ''
AUTHOR = 'Nicolargo'
EMAIL = 'contact@nicolargo.com'
def __init__(self, name=None, args=None):
"""Init the AMP."""
self.NAME = name.capitalize()
super(Amp, self).__init__(name=name, args=args)
def update(self, process_list):
"""Update the AMP"""
# Get the systemctl status
logger.debug('{0}: Update stats using service {1}'.format(self.NAME, self.get('service_cmd')))
try:
res = self.get('command')
except OSError as e:
logger.debug('{0}: Error while executing service ({1})'.format(self.NAME, e))
else:
if res is not None:
msg = u(check_output(res.split(), stderr=STDOUT))
self.set_result(to_ascii(msg.rstrip()))
else:
# Set the default message if command return None
# Default sum of CPU and MEM for the matching regex
self.set_result('CPU: {0:.1f}% | MEM: {1:.1f}%'.format(
sum([p['cpu_percent'] for p in process_list]),
sum([p['memory_percent'] for p in process_list])))
return self.result()

View File

@ -138,8 +138,8 @@ Start the client browser (browser mode):\n\
help='disable network, disk I/O, FS and sensors modules') help='disable network, disk I/O, FS and sensors modules')
parser.add_argument('--disable-process', action='store_true', default=False, parser.add_argument('--disable-process', action='store_true', default=False,
dest='disable_process', help='disable process module') dest='disable_process', help='disable process module')
parser.add_argument('--disable-amp', action='store_true', default=False, parser.add_argument('--disable-amps', action='store_true', default=False,
dest='disable_amp', help='disable applications monitoring process (AMP) module') dest='disable_amps', help='disable applications monitoring process (AMP) module')
parser.add_argument('--disable-log', action='store_true', default=False, parser.add_argument('--disable-log', action='store_true', default=False,
dest='disable_log', help='disable log module') dest='disable_log', help='disable log module')
parser.add_argument('--disable-bold', action='store_true', default=False, parser.add_argument('--disable-bold', action='store_true', default=False,

View File

@ -330,7 +330,7 @@ class _GlancesCurses(object):
glances_processes.sort_key = 'cpu_percent' glances_processes.sort_key = 'cpu_percent'
elif self.pressedkey == ord('A'): elif self.pressedkey == ord('A'):
# 'A' > enable/disable AMP module # 'A' > enable/disable AMP module
self.args.disable_amp = not self.args.disable_amp self.args.disable_amps = not self.args.disable_amps
elif self.pressedkey == ord('b'): elif self.pressedkey == ord('b'):
# 'b' > Switch between bit/s and Byte/s for network IO # 'b' > Switch between bit/s and Byte/s for network IO
self.args.byte = not self.args.byte self.args.byte = not self.args.byte

View File

@ -59,7 +59,7 @@
<section id="alert" class="plugin" ng-show="!arguments.disable_log" ng-include src="'plugins/alert.html'"></section> <section id="alert" class="plugin" ng-show="!arguments.disable_log" ng-include src="'plugins/alert.html'"></section>
<div ng-show="!arguments.disable_process"> <div ng-show="!arguments.disable_process">
<section id="processcount" class="plugin" ng-include src="'plugins/processcount.html'"></section> <section id="processcount" class="plugin" ng-include src="'plugins/processcount.html'"></section>
<div class="row"> <div class="row" ng-if="!arguments.disable_amps">
<div class="col-lg-18"> <div class="col-lg-18">
<section id="amps" class="plugin" ng-include src="'plugins/amps.html'"></section> <section id="amps" class="plugin" ng-include src="'plugins/amps.html'"></section>
</div> </div>

View File

@ -64,6 +64,10 @@ glancesApp.controller('statsController', function ($scope, $rootScope, $interval
$scope.sorter.column = "cpu_percent"; $scope.sorter.column = "cpu_percent";
$scope.sorter.auto = true; $scope.sorter.auto = true;
break; break;
case $event.shiftKey && $event.keyCode == keycodes.A:
// D => Enable/disable AMPs
$scope.arguments.disable_amps = !$scope.arguments.disable_amps;
break;
case !$event.shiftKey && $event.keyCode == keycodes.c: case !$event.shiftKey && $event.keyCode == keycodes.c:
// c => Sort processes by CPU% // c => Sort processes by CPU%
$scope.sorter.column = "cpu_percent"; $scope.sorter.column = "cpu_percent";

View File

@ -97,7 +97,7 @@ class Plugin(GlancesPlugin):
# Only process if stats exist and display plugin enable... # Only process if stats exist and display plugin enable...
ret = [] ret = []
if not self.stats or args.disable_process or args.disable_amp: if not self.stats or args.disable_process or args.disable_amps:
return ret return ret
# Build the string message # Build the string message