Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
docpublic:reseaux:services:monitorix_custom [2020/04/21 16:05]
procacci@tem-tsp.eu [monitorix daemon in debug mode]
docpublic:reseaux:services:monitorix_custom [2020/04/23 10:35] (current)
procacci@tem-tsp.eu
Line 10: Line 10:
 you may have to monitor a special device or application that is not yet integrated .  you may have to monitor a special device or application that is not yet integrated . 
  
-That's the purpose of this page to explain how I manage to monitor my personnal gateway to the Internet which doesn't have builtin graph capabilities .  +That's the purpose of this page to explain how I managed to monitor my personal gateway to the Internet which doesn't have builtin graph capabilities .   
 + 
 +I want to get In and Out traffic like that :  
 + 
 +{{:docpublic:reseaux:services:monitorix-fbxcfr-jp.png|}} 
  
  
Line 21: Line 26:
 ====== Custom device ====== ====== Custom device ======
  
-In this page I will demonstrate how I manage to monitor In and Out bandwith usage of my FreeBox-Crystal which is a French ADSL router .+In this page I will demonstrate how I manage to monitor In and Out bandwidth usage of my FreeBox-Crystal which is a French ADSL router .
 The device does provide an http service to get the status of its services . The device does provide an http service to get the status of its services .
 it replies on the Lan interface at the address of the router itself  it replies on the Lan interface at the address of the router itself 
Line 66: Line 71:
 From the differents information provided by this web interface,  the ones I want to graph is on the WAN interface the In trafic (here 63 Ko/s) and Out (9 ko/s)  From the differents information provided by this web interface,  the ones I want to graph is on the WAN interface the In trafic (here 63 Ko/s) and Out (9 ko/s) 
  
-====== custom module ======+====== Custom module ======
  
 I am not a monitorix developer , but with great and smart indication from Monitorix developers , as there is no generic module nor snmp capailities (anyway my Freebox doesn't provide such) , I was advise to create my own module based on an existing one that already collect and graph values from an http request . The Nginx module was my  starting point .  I am not a monitorix developer , but with great and smart indication from Monitorix developers , as there is no generic module nor snmp capailities (anyway my Freebox doesn't provide such) , I was advise to create my own module based on an existing one that already collect and graph values from an http request . The Nginx module was my  starting point . 
Line 72: Line 77:
 ===== copy nginx ===== ===== copy nginx =====
  
-you can check location of all the monitorix components by requesting file location of tha monitorix package with : +you can check location of all the monitorix components by requesting file location of the monitorix package with : 
  
 <code> <code>
Line 102: Line 107:
 </code> </code>
  
-===== dev environement =====+===== dev environment =====
  
-After you have check that monitorix work fine with native modules, to help debuging , I removed all modules from the main config file : monitorix.conf in order that logs shows only potential problem of my specific module here named fbxcfr (just after nginx) . +After you have checked that monitorix works fine with native modules, to help debugging , I disabled all modules from the main config file : monitorix.conf in order that logs shows only potential problem of my specific module here named fbxcfr (just after nginx) . 
  
 <code> <code>
Line 116: Line 121:
 </code> </code>
        
-duplicate all nginx parameters in the conf file to fbxcfr (or whatever name you give to your module) so that your module is taken into account by the monitorix daemon . +duplicate almost all nginx parameters in the conf file to fbxcfr (or whatever name you give to your module) so that your module is taken into account by the monitorix daemon . 
-this happens if different sections: //graph_enable, graph_name, graph_title and graphs//+this happens in different sections: //graph_enable, graph_name, graph_title and graphs//
  
 ==== add module to monitorix.conf ==== ==== add module to monitorix.conf ====
Line 132: Line 137:
         url = http://192.168.3.254/pub/fbx_info.txt         url = http://192.168.3.254/pub/fbx_info.txt
         port = 80         port = 80
-        rule = 24100 
         rigid = 0, 0, 0         rigid = 0, 0, 0
         limit = 100, 100, 100         limit = 100, 100, 100
Line 165: Line 169:
 </code> </code>
  
-run it in debug mode to be ale to see potential errors+execute it in debug and foreground mode to be able to see potential errors
  
 <code> <code>
-# /usr/bin/monitorix -c /etc/monitorix/monitorix.conf -p /run/monitorix.pid -d all+# /usr/bin/monitorix -c /etc/monitorix/monitorix.conf --d all
 </code> </code>
  
Line 192: Line 196:
 </code> </code>
  
-then after few second (at next minute) , here comes my two values In and Out inserted in the rrd file+then after few second (at next minute) , here comes my two values (converted to bytes)  In and Out inserted in the rrd file
  
 <code> <code>
Line 215: Line 219:
  
  
 +===== fbxcfr.pm  module code =====
 +
 +as explained earlier , I copied the nginx module to create mine fbxcfr module . I followed the same process of fetching a URL and parse it to collect interesting values to graph .
 +
 +==== Frame ====
 +
 +here the "Frame" of the package with 3 subroutines : 
 +
 +<code>
 +package fbxcfr;
 +...
 +sub fbxcfr_init {
 +...
 +sub fbxcfr_update {
 +...
 +sub fbxcfr_cgi {
 +...
 +</code>
 +
 +in order to not forget any replacement occurence of the //nginx// string, I search and replace every occurence of// nginx// with// fbxcfr// 
 +I used VI to do that , here's the magic command to search and repalce all in VI 
 +
 +<code>
 +:1,$s/nginx/fbxcfr/g
 +</code>
 +
 +  * **:** switch to comand
 +  * **1** from 1st line of the file
 +  * **,$** to last line
 +  * **/nginx** search nginx string
 +  * **/fbxcfr/** and replace it by fxcfr
 +  * **g** globally (if more than one occurence by line
 +
 +
 +==== collected values code =====
 +
 +I changed a few lines in the code (a dozen ) and commented many . Indeed the nginx module collect all these :
 +
 +<code>
 +$reqs:$tot:$reads:$writes:$waits:$in:$out
 +</code>
 +
 +from these only the 2 last ones (in/out)  are of interest to me .
 +
 +not to confused with the original values/variables I named mine //din// and //dout// 
 +
 +here are the main changes I did : 
 +
 +<code>
 +sub fbxcfr_update {
 +...
 + my $fbxcfr = $config->{fbxcfr};
 +...
 +        my $in = 0;
 +        my $out = 0;
 +        my $din = 0;
 +        my $dout = 0;
 +
 +        my $url;
 +
 +        if($fbxcfr->{url}) {
 +                $url = $fbxcfr->{url};
 +        } else {
 +                $url = "http://192.168.0.254/pub/fbx_info.txt"; #hard coded here but can be set in monitorix.conf module parameters
 +        }
 +...
 +                #if(/^Reading:\s+(\d+).*Writing:\s+(\d+).*Waiting:\s+(\d+)\s*/) {
 +                #get line starting with 2 spaces then WAN string and match the 2 digit (\d+)  values before string ko/s 
 +                if(/^\s\sWAN\s+Ok\s+(\d+)\sko\/s\s+(\d+)\sko\/s/) { 
 +                        $din = $1; #print "din: $din\n"; # for debug
 +                        $dout = $2; #print "dout: $dout\n"; # for debug 
 +                        $din *= 1024;
 +                        $dout *= 1024;
 +
 +
 + $rrdata .= ":$din:$dout";
 + RRDs::update($rrd, $rrdata);
 +...
 +
 +sub fbxcfr_cgi {
 +...
 +                push(@output,   <tr>\n");
 +                push(@output,   <td bgcolor='$colors->{title_bg_color}'>\n");
 +        }
 +# comment out everything related to request , total, reads, writes , wait from the nginx values around line 387   
 + =BEGIN
 +        push(@tmp, "AREA:total#44EEEE:Total");
 +        push(@tmp, "GPRINT:total:LAST:       Current\\: %5.0lf");
 +        push(@tmp, "GPRINT:total:AVERAGE:    Average\\: %5.0lf");
 +        push(@tmp, "GPRINT:total:MIN:    Min\\: %5.0lf");
 +        push(@tmp, "GPRINT:total:MAX:    Max\\: %5.0lf\\n");
 +        push(@tmp, "AREA:reading#44EE44:Reading");
 +        push(@tmp, "GPRINT:reading:LAST:     Current\\: %5.0lf");
 +...
 +        @riglim = @{setup_riglim($rigid[2], $limit[2])};
 +        undef(@tmp);
 +        undef(@tmpz);
 +        undef(@CDEF);
 + =END
 + =cut
 +# end comment up until around line 626 (quite long !) 
 +
 +# to begin with our In and Out values to graph 
 +        push(@tmp, "AREA:B_in#44EE44:Input");
 +        push(@tmp, "AREA:B_out#4444EE:Output");
 +        push(@tmp, "AREA:B_out#4444EE:");
 +        push(@tmp, "AREA:B_in#44EE44:");
 +        push(@tmp, "LINE1:B_out#0000EE");
 +        push(@tmp, "LINE1:B_in#00EE00");
 +        push(@tmpz, "AREA:B_in#44EE44:Input");
 +        push(@tmpz, "AREA:B_out#4444EE:Output");
 +        push(@tmpz, "AREA:B_out#4444EE:");
 +        push(@tmpz, "AREA:B_in#44EE44:");
 +        push(@tmpz, "LINE1:B_out#0000EE");
 +        push(@tmpz, "LINE1:B_in#00EE00");
 +...
 +        return @output;
 +}
 +
 +1;
 +</code>
 +
 +==== fbxcfr.pm file ====
 +
 +here is the full module file (unzip to get the .pm ) 
 +
 +{{:docpublic:reseaux:services:fbxcfr.pm.zip|}}
 +
 + 
 +==== image result zoom ====
 +
 +{{:docpublic:reseaux:services:monitorix-fbxcfr-jp-zoom.png?600|}}
  
docpublic/reseaux/services/monitorix_custom.1587485119.txt.gz · Last modified: 2020/04/21 16:05 by procacci@tem-tsp.eu
[unknown link type]Back to top
CC Attribution-Noncommercial-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0