Faire son propre monitoring du Syno (Partie 2)

On a vu comment collecter les données de la charge CPU dans une table, voyons aujourd’hui comment les utiliser pour faire un joli graphique bien plus explicite qu’une suite de chiffres.

Pour cela, il existe une bibliothèque PHP permettant de générer des graphiques : Jpgraph.
– Récupérer la version 3.5.0b1
– Extraire le répertoire src de l’archive
– Créer un répertoire supervision dans l’arborescence apache qui contiendra le projet php
– Copier le répertoire src précédemment extrait dans le nouveau répertoire
– Renommer le répertoire src en jpgraph

Créons tout d’abord le fichier contenant les informations de connexion sur la base de données :
Fichier config.php

<?php

$mysql_host=’localhost’;
$mysql_user=’UtilisateurMySQL’;
$mysql_password=’MotDePasseMySQL’;
$mysql_db=’supervision’;
?>

Il n’y a pas besoin d’explication sur ce fichier.

Créons ensuite le fichier des constantes, qui contient dans mon cas uniquement des valeurs permettant, lorsqu’on a beaucoup de données, de regrouper par moyennes.
Fichier constantes.php

<?php

$MOYENNE_PAR_ANNEE=10000000000 ;
$MOYENNE_PAR_MOIS= 100000000;
$MOYENNE_PAR_JOUR= 1000000;
$MOYENNE_PAR_HEURE=10000;
$MOYENNE_PAR_MINUTE=100;
?>

En PHP, nous allons utiliser les timestamps Unix : les dates sont stockées de la manière AAAAMMJJHHmmSS (AAAA=année, MM=mois, JJ=jour, HH=heure, mm=minutes, SS=secondes).
Sachant que nous collectons des données toutes les minutes (partie cron de l’article précédent), on collecte donc 365*24*60 soit 525600 données à l’année. Si nous désirons avoir le graphique de l’année complète, il est inutile d’afficher toutes ces car il n’existe pas d’écran avec une telle résolution aujourd’hui : on va donc regrouper par moyenne, soit par heure (365*24 soit 8760 données) ou mieux, par jour (365 données).

Si nous choisissons par jour, il faudra en SQL:
– ne récupérer que les données de l’année soit les dates égales à 20110922153400 (date courante) divisé par $MOYENNE_PAR_ANNEE ce qui donne 2011
– regrouper et faire la moyenne par jour, soit 20110922153400 (toujours la date courante) divisé par $MOYENNE_PAR_JOUR ce qui donne 20110922

Pour terminer, créons le fichier cpu.php qui créera une image :
Fichier cpu.php

<?php

require_once (‘jpgraph/jpgraph.php’);
require_once (‘jpgraph/jpgraph_line.php’);
require_once (‘jpgraph/jpgraph_date.php’);
require_once (‘jpgraph/jpgraph_utils.inc.php’);

require_once (‘constantes.php’);
require_once (‘config.php’);

// ############################
// Traitement des paramètres
// ############################
// Pour éviter de surcharger, on ne prend pas toutes les données sur les longues périodes,
// on prend une moyenne.
$moyenne_choisie=$MOYENNE_PAR_ANNEE;
if ($_GET[‘periode’] == ‘full’ || $_GET[‘periode’]==’year’) // full, year, month, week, day
$moyenne_choisie = $MOYENNE_PAR_JOUR;
if ($_GET[‘periode’] == ‘month’)
$moyenne_choisie = $MOYENNE_PAR_HEURE;
if ($_GET[‘periode’] == ‘day’)
$moyenne_choisie = $MOYENNE_PAR_MINUTE;
// Récupération de l’intervalle
$sql_where =  »;
if ($_GET[‘periode’] == ‘full’)
$sql_where =  »;
if ($_GET[‘periode’] == ‘year’) {
$annee=FLOOR($_GET[‘date’]/10000000000);
$sql_where = ‘WHERE FLOOR(date/10000000000) = ‘.$annee.’ ‘;
}
if ($_GET[‘periode’] == ‘month’) {
$mois=FLOOR($_GET[‘date’]/100000000);
$sql_where = ‘WHERE FLOOR(date/100000000) = ‘.$mois.’ ‘;
}
if ($_GET[‘periode’] == ‘day’) {
$mois=FLOOR($_GET[‘date’]/10000);
$sql_where = ‘WHERE FLOOR(date/10000) = ‘.$mois.’ ‘;
}

// Récupération des données
$db = mysql_connect($mysql_host,$mysql_user,$mysql_password);
mysql_select_db($mysql_db,$db);

$sql = ‘SELECT avg(value), unix_timestamp(date) FROM cpu ‘;
$sql= $sql.$sql_where;
$sql = $sql.’group by FLOOR(date/’.$moyenne_choisie.’)’;

$req = mysql_query($sql) or die(‘Erreur SQL !’.$sql.’
‘.mysql_error());

while ($data=mysql_fetch_array($req)){
$ydata[] = $data[‘avg(value)’];
$xdata[] = $data[‘unix_timestamp(date)’];
}
mysql_close();

// GENERATION DU GRAPHIQUE

$dateUtils = new DateScaleUtils();

// Tailles
$width=500; $height=300;
$graph = new Graph($width, $height);
$graph->SetScale(‘datlin’);
$graph->SetMargin(60,20,40,60);

// Titres
$graph->title->Set(‘CPU’);
$graph->subtitle->Set(« (Pourcentage d’utilisation) »);

// Etiquettes
$graph->xaxis->SetLabelAngle(30);

// Insertion des données
$lp1 = new LinePlot($ydata,$xdata);
$lp1->SetWeight(0);
$lp1->SetFillColor(‘orange@0.85’);
$graph->Add($lp1);

// Envoi de l’image
$graph->Stroke();

?>

Je vous invite à vous pencher sur la doc de Jpgraph, quoique dans cet exemple, il n’y a rien de compliqué.
Ce script prend comme paramètre la période (periode=full ou year, ou month ou day) et la date (date=timestamps unix avec par exemple 20110922153400 pour le 22/sept/2011 à 15h35mn00sec)

Exemples de résultats :

http://adresseSYNO/supervision/cpu.php?periode=day&date=20110829000000

20110922-035104.jpg

http:// adresseSYNO/supervision/cpu.php?periode=month&date=20110815000000

20110922-035115.jpg

Ce qu’on a vu pour le %CPU peut être utilisé avec n’importe quelle autres ressources : espace disque, nombre de processus courant….. Il n’y a qu’à adapter les scripts de récupération des données.

Laisser un commentaire