<h1><a name="special_templates" id="special_templates">Special Templates</a></h1> <div class="level1"> <p> “Special Templates” dienen zum Zusammenfassen von Daten beliebiger Hosts und Services und sind somit nicht direkt mit einem Host oder Service verknüpft. </p> <p> Oftmals ist es gewünscht Daten verschiedener Services in einem Graphen darzustellen. Immer wenn die <a href="/de/pnp-0.6/pages" class="wikilink1" title="de:pnp-0.6:pages">"Pages"</a> nicht genügen, können die Special Templates ins Spiel kommen. </p> </div> <!-- SECTION "Special Templates" [1-372] --> <h2><a name="grundlagen" id="grundlagen">Grundlagen</a></h2> <div class="level2"> <p> “Special Templates” werden in <code>pnp4nagios/share/templates.special</code> gesucht und müssen die Dateiendung <code>.php</code> besitzen. </p> <p> Aufgerufen werden “Special Templates” über den Controller “special” unter </p> <pre class="code">http://<your-nagios-server>/pnp4nagios/special?tpl=<template></pre> <p> <code><template></code> ist entsprechend durch das jeweilige Template ohne die Dateiendung .php zu ersetzen. </p> <p> Ein entsprechender Link erscheint im PNP-Interface, wenn mindestens ein “Special Template” gefunden wurde. </p> </div> <!-- SECTION "Grundlagen" [373-873] --> <h2><a name="beispiel" id="beispiel">Beispiel</a></h2> <div class="level2"> <p> Aufgabe ist die Antwortzeiten aller Webserver mit dem Hostnamen websrv01, websrv02 und websrv03 in einem Graphen anzuzeigen. Die Daten sollen aus dem Service “<acronym title="Hyper Text Transfer Protocol">HTTP</acronym>” stammen. </p> <p> Step 1: Anlegen eines Templates “websrv_response_times.php” unter pnp4nagios/share/templates.special </p> <p> “Special Templates” beginnen immer mit der Definition des Titels und eines Kommentars. </p> <pre class="code php"><span class="re0">$this</span><span class="sy0">-></span><span class="me1">MACRO</span><span class="br0">[</span><span class="st_h">'TITLE'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"HTTP Response Times"</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">MACRO</span><span class="br0">[</span><span class="st_h">'COMMENT'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"HTTP Response Times for all Cluster Nodes"</span><span class="sy0">;</span></pre> <p> Step 2: Eine Liste aller in Frage kommenden Hosts/Services erstellen. PNP stellt hierfür die Funktion <code>tplGetServices()</code> bereit. </p> <p> tplGetServices() erwartet zwei Parameter. </p> <p> Parameter 1 ist ein regulärer Ausdruck auf den zu suchenden Host, Parameter 2 ist entsprechend ein regulärer Ausdruck für den Service. </p> <pre class="code php"><span class="re0">$services</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">tplGetServices</span><span class="br0">(</span><span class="st0">"websrv"</span><span class="sy0">,</span><span class="st0">"HTTP"</span><span class="br0">)</span><span class="sy0">;</span></pre> <p> $services enthält nun ein Array aller gefundenen Services. </p> <p> Um die Entwicklung der Templates zu erleichtern und Einblick in die Datenstrukturen zu erhalten, kann man Kohana durch Auslösen einer Exception zum Abbrechen der Verarbeitung zwingen. </p> <p> Um Einblick in die Daten von $services zu erhalten, genügt die folgende Zeile. </p> <pre class="code php">throw <span class="kw2">new</span> Kohana_exception<span class="br0">(</span><a href="http://www.php.net/print_r"><span class="kw3">print_r</span></a><span class="br0">(</span><span class="re0">$services</span><span class="sy0">,</span><span class="kw4">TRUE</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></pre> <p> Ausgabe bei Aufruf von pnp4nagios/special?tpl=websrv_response_times </p> <pre class="code"> Array ( [0] => Array ( [host] => websrv01 [service] => HTTP ) [1] => Array ( [host] => websrv02 [service] => HTTP ) [2] => Array ( [host] => websrv03 [service] => HTTP ) ) </pre> <p> Die Variable $services enthält somit ein Array aller gefundenen Services, in diesem Fall also drei Hosts mit dem Service “<acronym title="Hyper Text Transfer Protocol">HTTP</acronym>” </p> <p> Step 3: Durchlaufen des Array $services und erstellen der Graph-Definitionen. </p> <pre class="code php"><span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$services</span> <span class="kw1">as</span> <span class="re0">$key</span><span class="sy0">=></span><span class="re0">$val</span><span class="br0">)</span><span class="br0">{</span> <span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">tplGetData</span><span class="br0">(</span><span class="re0">$val</span><span class="br0">[</span><span class="st_h">'host'</span><span class="br0">]</span><span class="sy0">,</span><span class="re0">$val</span><span class="br0">[</span><span class="st_h">'service'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$hostname</span> <span class="sy0">=</span> rrd<span class="sy0">::</span><span class="me2">cut</span><span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'MACRO'</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'HOSTNAME'</span><span class="br0">]</span><span class="sy0">,</span> 15<span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">def</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span> <span class="sy0">,</span> <span class="re0">$data</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'RRDFILE'</span><span class="br0">]</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span> <span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">line1</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span><span class="sy0">,</span> rrd<span class="sy0">::</span><span class="me2">color</span><span class="br0">(</span><span class="re0">$key</span><span class="br0">)</span><span class="sy0">,</span> <span class="re0">$hostname</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">gprint</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">"MAX"</span><span class="sy0">,</span> <span class="st0">"AVERAGE"</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span></pre> <p> Die Funktion <code>tplGetData()</code> wird innerhalb der Schleife verwendet, um das jeweilige <acronym title="Extensible Markup Language">XML</acronym>-File einzulesen. Die Daten werden als Array zurückgeliefert und stehen nun in $data zur Verfügung. </p> <p> In diesem Beispiel kommen weitere kleine PNP-Helfer zum Einsatz, zu erkennen am Präfix <code>rrd::</code>. </p> <p> Die Funktion <a href="/de/pnp-0.6/tpl_helper#rrdcut" class="wikilink1" title="de:pnp-0.6:tpl_helper">rrd::cut()</a> schneidet einen String auf eine bestimmte Länge oder füllt auf diese Länge auf. Dies ist hilfreich, um die Legende auszurichten. </p> <p> Die Funktion <a href="/de/pnp-0.6/tpl_helper#rrdgprint" class="wikilink1" title="de:pnp-0.6:tpl_helper">rrd::gprint()</a> erzeugt die Legende unter dem Graphen. </p> <p> Die Funktion <a href="/de/pnp-0.6/tpl_helper#rrdcolor" class="wikilink1" title="de:pnp-0.6:tpl_helper">rrd::color()</a> liefert eine Farbe aus einer fest definierten Farbliste zurück. </p> <p> Mehr Informationen zu den PNP-Helper-Funktionen finden Sie <a href="/de/pnp-0.6/tpl_helper" class="wikilink1" title="de:pnp-0.6:tpl_helper">hier</a>. </p> <pre class="code php"><span class="kw2"><?php</span> <span class="co2"># </span><span class="co2"># Special Template websrv_response_times.php </span><span class="co2"># </span><span class="re0">$this</span><span class="sy0">-></span><span class="me1">MACRO</span><span class="br0">[</span><span class="st_h">'TITLE'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"HTTP Response Times"</span><span class="sy0">;</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">MACRO</span><span class="br0">[</span><span class="st_h">'COMMENT'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"HTTP Response Times for all Cluster Nodes"</span><span class="sy0">;</span> <span class="co2"># </span><span class="co2"># Get a List of Services by regex </span><span class="co2"># Option 1 = 'Host Regex' </span><span class="co2"># Option 2 = 'Service Regex' </span><span class="co2"># </span><span class="re0">$services</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">tplGetServices</span><span class="br0">(</span><span class="st0">"websrv"</span><span class="sy0">,</span><span class="st0">"HTTP"</span><span class="br0">)</span><span class="sy0">;</span> <span class="co2">#throw new Kohana_exception(print_r($services,TRUE)); </span><span class="co2"># </span><span class="co2"># The Datasource Name for Graph 0 </span><span class="re0">$ds_name</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"Response Times"</span><span class="sy0">;</span> <span class="re0">$opt</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">"--title <span class="es1">\"</span>Response Times<span class="es1">\"</span>"</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">=</span> <span class="st0">""</span><span class="sy0">;</span> <span class="co2"># </span><span class="co2"># Iterate through the list of hosts </span><span class="kw1">foreach</span><span class="br0">(</span><span class="re0">$services</span> <span class="kw1">as</span> <span class="re0">$key</span><span class="sy0">=></span><span class="re0">$val</span><span class="br0">)</span><span class="br0">{</span> <span class="co2"># </span> <span class="co2"># get the data for a given Host/Service </span> <span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-></span><span class="me1">tplGetData</span><span class="br0">(</span><span class="re0">$val</span><span class="br0">[</span><span class="st_h">'host'</span><span class="br0">]</span><span class="sy0">,</span><span class="re0">$val</span><span class="br0">[</span><span class="st_h">'service'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="co2"># </span> <span class="co2"># Throw an exception to debug the content of $a </span> <span class="co2"># Just to get Infos about the Array Structure </span> <span class="co2"># </span> <span class="co2">#throw new Kohana_exception(print_r($a,TRUE)); </span> <span class="re0">$hostname</span> <span class="sy0">=</span> rrd<span class="sy0">::</span><span class="me2">cut</span><span class="br0">(</span><span class="re0">$data</span><span class="br0">[</span><span class="st_h">'MACRO'</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'HOSTNAME'</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">def</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span> <span class="sy0">,</span> <span class="re0">$data</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'RRDFILE'</span><span class="br0">]</span><span class="sy0">,</span> <span class="re0">$data</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="br0">[</span><span class="st_h">'DS'</span><span class="br0">]</span> <span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">line1</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span><span class="sy0">,</span> rrd<span class="sy0">::</span><span class="me2">color</span><span class="br0">(</span><span class="re0">$key</span><span class="br0">)</span><span class="sy0">,</span> <span class="re0">$hostname</span><span class="br0">)</span><span class="sy0">;</span> <span class="re0">$def</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span> <span class="sy0">.=</span> rrd<span class="sy0">::</span><span class="me2">gprint</span><span class="br0">(</span><span class="st0">"var<span class="es4">$key</span>"</span><span class="sy0">,</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">(</span><span class="st0">"MAX"</span><span class="sy0">,</span> <span class="st0">"AVERAGE"</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="sy1">?></span></pre> <p> <a href="/de/pnp-0.6/start" class="wikilink1" title="de:pnp-0.6:start">Zurück zur Übersicht</a> </p> </div> <!-- SECTION "Beispiel" [874-] -->