Étiquettes dynamiques : Différence entre versions

De Intermapper Wiki - Supervision réseau & serveurs
Aller à : navigation, rechercher
(Afficher un paramètre ou une variable dans l'étiquette)
m (28 revisions imported)
 
(17 révisions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
Il existe de multiples méthodes pour gérer le texte contenu dans les étiquettes, celui-ci peut même être dynamique.
+
Il existe de multiples méthodes pour gérer le contenu des étiquettes ( Labels) , celui-ci peut même être dynamique.
  
  
Ligne 22 : Ligne 22 :
  
  
L'affichage des information du nœud se fait en utilisant :
+
L'affichage des informations du nœud se fait en utilisant :
  
  
Ligne 32 : Ligne 32 :
  
  
{| class="wikitable" width="90%"
+
<pre><? write( "Hello World" + "\n"); ?></pre>
|+
 
|-
 
| width="100%" |
 
  <? write( "Hello World" + "\n"); ?>
 
|}
 
  
 
Les balises <? et ?> indiquent respectivement le début et la fin du JavaScript.
 
Les balises <? et ?> indiquent respectivement le début et la fin du JavaScript.
Ligne 47 : Ligne 42 :
  
  
'''Important''' : JavaScript dans les étiquettes et les alertes fonctionne de manière globale. Si vous déclarez une variable au niveau global plutôt que dans une fonction, cette dernière est accessible en lecture/écriture par n'importe quel autre JavaScript (éventuellement positionné sur une autre nœud). Cela peut produire des résultats inattendus et erronés si vous lancez le même script sur plusieurs nœuds.
+
'''Important''' : JavaScript dans les étiquettes et les alertes fonctionne de manière globale. Si vous déclarez une variable au niveau global plutôt que dans une fonction, cette dernière est accessible en lecture/écriture par n'importe quel autre JavaScript (éventuellement positionné sur un autre nœud). Des résultats erronés ou inattendus se produiront si vous lancez le même script sur plusieurs nœuds.
  
Les fonctions JavaScript sont supportées, vous pouvez dès-lors stocker des valeurs dans les nœuds et les alertes, elles seront conservées entre chaque tests ( polls ). Cette méthode est recommandée pour protéger les variables de toute modification non souhaitée. Définir des variables dans les nœuds est décrit ici : xxxxxxxxxxxxxxxxx
 
  
 +
Les fonctions JavaScript sont supportées, vous pouvez stocker des valeurs dans les nœuds et les alertes, elles seront conservées entre chaque test ( polls ). Cette méthode est recommandée pour protéger les variables de toute modification indésirable. Définir des variables locales dans les nœuds est décrit ici : [[Étiquettes dynamiques#Mémoriser les données d'un test à l'autre|Mémoriser les données d'un test à l'autre]].
  
 
====Exemple : un script d'étiquette simple====
 
====Exemple : un script d'étiquette simple====
Le résultat de ce script est sans intérêt, l'objet de l'exemple est d'en montrer l'écriture.
+
Le résultat affiché par ce script est sans intérêt pour la supervision, mais permet de détailler l'écriture d'un script.
  
  
{| class="wikitable" width="90%"
+
<pre><Smart Name>
|+
 
|-
 
| width="100%" |
 
  <Smart Name>
 
 
 
 
<?
 
<?
 
 
  for (var i=1; i<=3; i++) {
 
  for (var i=1; i<=3; i++) {
 
 
   writeln( "Hello World #" + i);
 
   writeln( "Hello World #" + i);
 
 
   }
 
   }
?>
+
?></pre>
|}
 
  
 
Affichera comme étiquette :
 
Affichera comme étiquette :
  
IMAGE
+
<center>http://ressources.intermapper.eu/wiki/img/Labels/LabelExample1_357x141.png</center>
 +
 
  
  
 
=====Les fonctions write et writeln=====
 
=====Les fonctions write et writeln=====
  
Ces deux fonctions sont utilisées pour écrire plusieurs valeurs dans les étiquettes.
+
Ces deux fonctions sont utilisées pour afficher plusieurs valeurs dans les étiquettes.
La différence est que writeln ajouter un saut à la ligne (ce qui évite de devoir coder un \n)
+
La différence est que ''''writeln''' ajouter un saut à la ligne (ce qui évite de devoir coder un \n)
  
  
Ligne 87 : Ligne 74 :
 
L'utilisation de la syntaxe suivante permet d'accéder aux paramètres d'une probe :
 
L'utilisation de la syntaxe suivante permet d'accéder aux paramètres d'une probe :
  
{| class="wikitable" width="90%"
+
<pre><? writeln( "Getting data from: " + self.get( "Object ID")); ?></pre>
|+
 
|-
 
| width="100%" |
 
  <? writeln( "Getting data from: " + self.get( "Object ID")); ?>
 
|}
 
 
 
  
L'objet self fait référence à l'objet ou se trouve le script. L'objet self est toujours disponible en JavaScript dans les étiquettes. Utilisez une syntaxe identique :
 
  
{| class="wikitable" width="90%"
+
L'objet self fait référence à l'objet où se trouve le script. L'objet self est toujours disponible en JavaScript dans les étiquettes. Utilisez une syntaxe identique :
|+
 
|-
 
| width="100%" |
 
<?
 
  
 +
<pre><?
 
   var connTime = self.get( "_connect");
 
   var connTime = self.get( "_connect");
 
 
   writeln( "Time to establish connection: " + connTime);
 
   writeln( "Time to establish connection: " + connTime);
 +
?></pre>
  
?>
 
|}
 
  
  
  
 +
=====Gestion des erreurs JavaScript=====
  
=====Gestion des erreurs JavaScript=====
+
Si vous aviez fait une faute de frappe dans le nom de votre variable, (par exemple tapé ''_conect'' au lieu de'' _connect'') l'étiquette afficherait :
  
Si vous aviez fait une faute de frappe dans le nom de votre variable, (par exemple tapé _conect au lieu de _connect) l'étiquette afficherait :
+
<center>http://ressources.intermapper.eu/wiki/img/Labels/LabelExample2_555x37.png</center>
  
IMAGE
 
  
Si vous consultez le journal de debug ( debug log) vous trouverez le message suivant :
+
Si vous consultez le journal de debug (debug log) vous trouverez le message suivant :
  
{| class="wikitable" width="90%"
+
<pre> 12:15:46 JS> [Device: map 'Exporting Fields', device 'nitro.dartware.com.', probe
|+
 
|-
 
| width="100%" |
 
12:15:46 JS> [Device: map 'Exporting Fields', device 'nitro.dartware.com.', probe
 
 
'SNMP Traffic']:BAD ARG: There is no variable called '_conect'. It should be the
 
'SNMP Traffic']:BAD ARG: There is no variable called '_conect'. It should be the
     name of a probe variable without '$' or curly braces.
+
     name of a probe variable without '$' or curly braces.</pre>
|}
 
  
Le message d'erreur vous indique la cartes, le nœud et la probe qui sont la cause de l'erreur et autant de détail que possible.
+
Le message d'erreur vous indique la carte, le nœud et la probe qui sont à l'origine de l'erreur et autant de détail que possible.
  
Une erreur de syntaxe JavaScript afficherait quand à elle :
+
Une erreur de syntaxe JavaScript afficherait ainsi :
  
IMAGE
+
<center>http://ressources.intermapper.eu/wiki/img/Labels/LabelExample3_305x36.png</center>
  
  
 
Le journal de debug donnera des détails sur l'erreur.
 
Le journal de debug donnera des détails sur l'erreur.
 
  
  
Ligne 145 : Ligne 114 :
  
 
La durée d'exécution d'un script est limitée, entre 50 et 100 msec pour éviter la monopolisation de la CPU. C'est aussi un excellent moyen de générer des étiquettes complexes.
 
La durée d'exécution d'un script est limitée, entre 50 et 100 msec pour éviter la monopolisation de la CPU. C'est aussi un excellent moyen de générer des étiquettes complexes.
 +
 +
Voici un petit exemple :
 +
 +
<pre><?
 +
for (var i = 0; i < 1000000; i++) {
 +
  if(i%10000 == 0) {
 +
    writeln( "testing the timeout " + i);
 +
  }
 +
}
 +
?></pre>
 +
 +
Dont le résultat sera :
 +
<center>http://ressources.intermapper.eu/wiki/img/Labels/timeoutexample.png</center>
 +
 +
3 ticks correspondent approximativement à 50 msec.
 +
 +
 +
 +
 +
=====Mémoriser les données d'un test=====
 +
 +
Il peut parfois être utile de mémoriser la valeur des variables.
 +
 +
Il y a 2 manières de procéder :
 +
 +
* '''JavaScript Global Variables''' : Toutes les variables JavaScript déclarées en mode global restent mémorisées d'une exécution de JavaScript à l'autre. La variable est accessible de n'importe quel nœud qui utiliserait le script. Elle est aussi accessible quelque soit l'emplacement d'exécution du JavaScript pour être placée dans une étiquette ou une alerte. Attention, en utilisant le même script à différents endroits, vous prenez le risque de modifier à tort cette variable.
 +
* '''Device JavaScript Variables''' : Cette donnée est stockée au niveau du nœud. L'avantage est que chaque nœud peut utiliser les mêmes noms de variables sans risques de conflit. Utilisez self.get(…) et self.read(…) pour lire et écrire ces variables. Attention, '''le nom de ces variables doit être différent des noms de paramètres de la probe et des variables de la probe elle-même'''.
 +
 +
 +
 +
======Associer une variable à un nœud (exemple)======
 +
 +
Pour placer la valeur stockée dans le variable locale "MyInformation" dans ''myinfo'':
 +
 +
<pre>var ''myinfo'' = self.get( "MyInformation" );</pre>
 +
 +
 +
Pour écrire la valeur de ''myinfo'' dans la variable locale "MyInformation" :
 +
 +
<pre>storedinfo = self.set( "MyInformation", ''myinfo'' );</pre>
 +
 +
La fonction self.set(…) contient la valeur qui est stockée. Si la valeur ne peut être stockée (par exemple si vous essayez de stocker dans une variable de la probe ou un de ses paramètres), la valeur de votre variable ''myinfo'' contiendra la valeur qui se trouve dans la cible (le paramètre ou la variable de la probe que vous ne pouvez pas modifier).
 +
 +
 +
 +
======Incrémenter un compteur (exemple)======
 +
 +
Il est assez simple d'incrémenter la valeur d'un compteur à chaque affichage de l'étiquette. Il faut juste se rappeler que la variable correspondant au compteur n'existe pas encore lors de la première exécution du script.
 +
 +
Le script suivant récupère la valeur de la variable "Count", l'affiche, l'incrémente puis la sauvegarde. Lors de la première exécution du script, self.get() retourne la chaine "BAD ARG, see debug log". Vous devez utiliser la fonction JavaScript isNaN() pour déterminer si n est NaN (Not a Number) ce qui est le cas lorsque cette dernière pas encore été initialisée (= lors du premier passage).
 +
 +
<pre>
 +
<?
 +
  var n = Number( self.get( "Count"));
 +
  if (isNaN(n)) n = 0;
 +
  writeln( "Count is " + n);
 +
  n++;
 +
  self.set("Count", n);
 +
?>
 +
</pre>
 +
 +
Ce type de script fonctionne également pour les variables globales.
 +
 +
 +
======Utiliser les attributs des nœuds======
 +
 +
L'utilisation de Javascript permet également d'accéder aux attributs des nœuds. La syntaxe est différente de cette utilisée pour les paramètres et les variables de la probe. La script utilise toujours l'objet self mais le nom de l'attribut est la propriété de l'objet.
 +
 +
<pre>
 +
<?
 +
var rtt = self.RoundTripTime; 
 +
writeln( "Round-trip time is \n" + rtt + " msec");
 +
?>
 +
</pre>
 +
 +
Ce script copie la valeur du dernier Round-Trip (temps de réponse) dans la variable rtt et l'affiche :
 +
 +
<center>http://ressources.intermapper.eu/wiki/img/Labels/roundtripexample.png</center>
 +
 +
Toute erreur de syntaxe provoquera une erreur de syntaxe JavaScript. Le message "JS EXCEPTION, see debug log" (Exception JavaScript, voir le journal de debug).
 +
 +
N'importe quel attribut du nœud peut être utilisé dans l'étiquette. Voir la liste des [[Attributs de nœud|attributs de nœud]].
 +
 +
 +
 +
======Accéder aux attributs======
 +
 +
Les nœuds sont connectés au réseau via des interfaces. La propriété '''Interfaces''' est disponible pour chaque nœud.. En JavaScript, cette propriété apparaît comme une table. L'exemple suivant liste l'ensemble des interfaces dont le status est "Down"
 +
 +
<pre>
 +
<?
 +
var downInterfaces = 0;
 +
for (var i =0; i < self.interfaces.length; i++;) {
 +
  var ifc = self.interfaces[i];
 +
  if ((ifc.Enabled == "TRUE") && (ifc.Status == "down")) {
 +
    downInterfaces++;
 +
    write( ifc.Index + ". ");
 +
    write(ifc.Alias.length > 0 ? ifc.Alias : ifc.Name );
 +
    writeln( " : " + ifc.Status);
 +
  }
 +
}
 +
writeln();
 +
writeln(downInterfaces + "/" + self.interfaces.length + " interfaces down");
 +
?>
 +
</pre>
 +
 +
N'importe quel attribut peut être utilisé dans les étiquettes. Voir la liste des [[Attributs d'Interface | attributs d'interface]].
 +
  
  
  
 +
----
  
 +
<center>Étiquettes dynamiques</center><center><google1 style="1"></google1></center>
 +
----
  
<center>http://www.intermapper.eu/imgwiki/en_cours_actualisation.png</center>
+
[[Accueil]] > [[Documentation]] > [[Personnalisation de cartes | Personnalisation des cartes]]
.
 

Version actuelle datée du 21 juin 2017 à 15:59

Il existe de multiples méthodes pour gérer le contenu des étiquettes ( Labels) , celui-ci peut même être dynamique.


Afficher un paramètre ou une variable dans l'étiquette

L'étiquette peut afficher des informations de la probe : paramètres ou variables ou de l'élément. La syntaxe est la suivante :


${param:<Nom Paramètre, variable, ou attribut>}

Par exemple, pour afficher le temps nécessaire à l'établissement de la connexion de la probe TCP au nœud, votre étiquette doit ressembler à :


Temps etablissement connexion: ${param:_connect} msec.


Attention : il n'y a pas d'espace après "param:" et le nom de la variable (Dans cet exemple, le "_" fait parti du nom de la variable ce qui n'est pas le cas de la plupart des variables.) N'importe quelle variable de la probe contenue dans le <snmp-device-display>, <script-out> ou <commande-display> en utilisant cette syntaxe. Vous pouvez afficher un paramètre de la probe Basic OID en utilisant la syntaxe :


Getting data from: ${param:Object ID}


L'affichage des informations du nœud se fait en utilisant :


Belongs to map: ${param:MapName}

Utiliser JavaScript dans une étiquette ou une alerte

Vous pouvez également utiliser JavaScript dans une étiquette ou une alerte. Cette méthode vous permet de réaliser des micro-traitements sur les informations que vous souhaitez afficher.


<? write( "Hello World" + "\n"); ?>

Les balises <? et ?> indiquent respectivement le début et la fin du JavaScript.



Variables et Champ du Javascript

Important : JavaScript dans les étiquettes et les alertes fonctionne de manière globale. Si vous déclarez une variable au niveau global plutôt que dans une fonction, cette dernière est accessible en lecture/écriture par n'importe quel autre JavaScript (éventuellement positionné sur un autre nœud). Des résultats erronés ou inattendus se produiront si vous lancez le même script sur plusieurs nœuds.


Les fonctions JavaScript sont supportées, vous pouvez stocker des valeurs dans les nœuds et les alertes, elles seront conservées entre chaque test ( polls ). Cette méthode est recommandée pour protéger les variables de toute modification indésirable. Définir des variables locales dans les nœuds est décrit ici : Mémoriser les données d'un test à l'autre.

Exemple : un script d'étiquette simple

Le résultat affiché par ce script est sans intérêt pour la supervision, mais permet de détailler l'écriture d'un script.


<Smart Name>
<?
 for (var i=1; i<=3; i++) {
   writeln( "Hello World #" + i);
  }
?>

Affichera comme étiquette :

LabelExample1_357x141.png


Les fonctions write et writeln

Ces deux fonctions sont utilisées pour afficher plusieurs valeurs dans les étiquettes. La différence est que 'writeln ajouter un saut à la ligne (ce qui évite de devoir coder un \n)


Accéder aux paramètres d'une probe

L'utilisation de la syntaxe suivante permet d'accéder aux paramètres d'une probe :

<? writeln( "Getting data from: " + self.get( "Object ID")); ?>


L'objet self fait référence à l'objet où se trouve le script. L'objet self est toujours disponible en JavaScript dans les étiquettes. Utilisez une syntaxe identique :

<?
  var connTime = self.get( "_connect");
  writeln( "Time to establish connection: " + connTime);
?>



Gestion des erreurs JavaScript

Si vous aviez fait une faute de frappe dans le nom de votre variable, (par exemple tapé _conect au lieu de _connect) l'étiquette afficherait :

LabelExample2_555x37.png


Si vous consultez le journal de debug (debug log) vous trouverez le message suivant :

 12:15:46 JS> [Device: map 'Exporting Fields', device 'nitro.dartware.com.', probe
'SNMP Traffic']:BAD ARG: There is no variable called '_conect'. It should be the
    name of a probe variable without '$' or curly braces.

Le message d'erreur vous indique la carte, le nœud et la probe qui sont à l'origine de l'erreur et autant de détail que possible.

Une erreur de syntaxe JavaScript afficherait ainsi :

LabelExample3_305x36.png


Le journal de debug donnera des détails sur l'erreur.


Limite du temps d'exécution

La durée d'exécution d'un script est limitée, entre 50 et 100 msec pour éviter la monopolisation de la CPU. C'est aussi un excellent moyen de générer des étiquettes complexes.

Voici un petit exemple :

<? 
for (var i = 0; i < 1000000; i++) {
  if(i%10000 == 0) {
     writeln( "testing the timeout " + i); 
  }
}
?>

Dont le résultat sera :

timeoutexample.png

3 ticks correspondent approximativement à 50 msec.



Mémoriser les données d'un test

Il peut parfois être utile de mémoriser la valeur des variables.

Il y a 2 manières de procéder :

  • JavaScript Global Variables : Toutes les variables JavaScript déclarées en mode global restent mémorisées d'une exécution de JavaScript à l'autre. La variable est accessible de n'importe quel nœud qui utiliserait le script. Elle est aussi accessible quelque soit l'emplacement d'exécution du JavaScript pour être placée dans une étiquette ou une alerte. Attention, en utilisant le même script à différents endroits, vous prenez le risque de modifier à tort cette variable.
  • Device JavaScript Variables : Cette donnée est stockée au niveau du nœud. L'avantage est que chaque nœud peut utiliser les mêmes noms de variables sans risques de conflit. Utilisez self.get(…) et self.read(…) pour lire et écrire ces variables. Attention, le nom de ces variables doit être différent des noms de paramètres de la probe et des variables de la probe elle-même.


Associer une variable à un nœud (exemple)

Pour placer la valeur stockée dans le variable locale "MyInformation" dans myinfo:

var ''myinfo'' = self.get( "MyInformation" );


Pour écrire la valeur de myinfo dans la variable locale "MyInformation" :

storedinfo = self.set( "MyInformation", ''myinfo'' );

La fonction self.set(…) contient la valeur qui est stockée. Si la valeur ne peut être stockée (par exemple si vous essayez de stocker dans une variable de la probe ou un de ses paramètres), la valeur de votre variable myinfo contiendra la valeur qui se trouve dans la cible (le paramètre ou la variable de la probe que vous ne pouvez pas modifier).


Incrémenter un compteur (exemple)

Il est assez simple d'incrémenter la valeur d'un compteur à chaque affichage de l'étiquette. Il faut juste se rappeler que la variable correspondant au compteur n'existe pas encore lors de la première exécution du script.

Le script suivant récupère la valeur de la variable "Count", l'affiche, l'incrémente puis la sauvegarde. Lors de la première exécution du script, self.get() retourne la chaine "BAD ARG, see debug log". Vous devez utiliser la fonction JavaScript isNaN() pour déterminer si n est NaN (Not a Number) ce qui est le cas lorsque cette dernière pas encore été initialisée (= lors du premier passage).

<? 
  var n = Number( self.get( "Count")); 
  if (isNaN(n)) n = 0;
  writeln( "Count is " + n);
  n++;
  self.set("Count", n);
?>

Ce type de script fonctionne également pour les variables globales.


Utiliser les attributs des nœuds

L'utilisation de Javascript permet également d'accéder aux attributs des nœuds. La syntaxe est différente de cette utilisée pour les paramètres et les variables de la probe. La script utilise toujours l'objet self mais le nom de l'attribut est la propriété de l'objet.

<?
 var rtt = self.RoundTripTime;  
 writeln( "Round-trip time is \n" + rtt + " msec");
?>

Ce script copie la valeur du dernier Round-Trip (temps de réponse) dans la variable rtt et l'affiche :

roundtripexample.png

Toute erreur de syntaxe provoquera une erreur de syntaxe JavaScript. Le message "JS EXCEPTION, see debug log" (Exception JavaScript, voir le journal de debug).

N'importe quel attribut du nœud peut être utilisé dans l'étiquette. Voir la liste des attributs de nœud.


Accéder aux attributs

Les nœuds sont connectés au réseau via des interfaces. La propriété Interfaces est disponible pour chaque nœud.. En JavaScript, cette propriété apparaît comme une table. L'exemple suivant liste l'ensemble des interfaces dont le status est "Down"

<? 
var downInterfaces = 0;
for (var i =0; i < self.interfaces.length; i++;) {
  var ifc = self.interfaces[i];
  if ((ifc.Enabled == "TRUE") && (ifc.Status == "down")) {
    downInterfaces++;
    write( ifc.Index + ". ");
    write(ifc.Alias.length > 0 ? ifc.Alias : ifc.Name );
    writeln( " : " + ifc.Status);
  }
}
writeln();
writeln(downInterfaces + "/" + self.interfaces.length + " interfaces down");
?>

N'importe quel attribut peut être utilisé dans les étiquettes. Voir la liste des attributs d'interface.




Étiquettes dynamiques

Accueil > Documentation > Personnalisation des cartes