Plugin Munin de verification du cache REDIS

Plugin Munin de verification du cache REDIS - Perl - Programmation

Marsh Posté le 04-03-2016 à 15:58:53    

Bonjour, je souhaites monitorer le cache de mon serveur (Cento 6.7) à l'aide de Munin, j'ai essayé plusieurs plugin dont celui-ci (conseillé sur la page officiel redis) https://gist.github.com/colinmollenhour/1177716
 
Impossible pourtant de le faire fonctionner

Code :
  1. [root@????????????]# munin-node-configure --suggest
  2. Plugin                     | Used | Suggestions
  3. ------                     | ---- | -----------
  4. [...]
  5. redis_                     | no   | no
  6. [...]
  7. # The following plugins caused errors:
  8. [...]
  9. # redis_:
  10. #       Junk printed to stderr
  11. [...]


 
Doit je installer d'autres choses au niveau de perl ?
Le message d'erreur n'est pas d'un grande aide...


---------------
D3
Reply

Marsh Posté le 04-03-2016 à 15:58:53   

Reply

Marsh Posté le 04-03-2016 à 22:49:48    

1) Il y a une release de Perl fonctionnelle sur la machine?
2) les modules appelés par une clause use, IO::Sockets et Switch, ont été installés? (a priori, ils ne le sont pas par défaut dans une installation basique de perl), sinon les installer.
3) Vous avez suivi les instructions?

Citation :

## 1. Download the plugin to your plugins directory (e.g. /usr/share/munin/plugins)
## 2. Create a symlink using either individual graph names or use the wildcard name: redis_
## 3. Edit plugin-conf.d/munin-node if it is needed:
##      env.host and env.port     (if using tcp, default is 127.0.0.1:6379)
##      env.path                  (if using sockets)
##      env.password              (for password protected Redis server)
## 4. Restart munin-node service


 
A+,


Message édité par gilou le 04-03-2016 à 22:50:08

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-03-2016 à 09:39:54    

1) oui

Code :
  1. [root@???????? ~]# perl -v
  2. This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
  3. Copyright 1987-2009, Larry Wall
  4. Perl may be copied only under the terms of either the Artistic License or the
  5. GNU General Public License, which may be found in the Perl 5 source kit.
  6. Complete documentation for Perl, including FAQ lists, should be found on
  7. this system using "man perl" or "perldoc perl".  If you have access to the
  8. Internet, point your browser at http://www.perl.org/, the Perl Home Page.


2) Je ne sais pas, c'est un peu le propos de ma question, j'ai essayé de simplifier le script au maximum et de l’exécuter, voila ce que ça donne :

Code :
  1. #!/usr/bin/perl -w
  2. #
  3. ##
  4. ##
  5. use strict;
  6. use Switch;
  7. my $category = 'test';
  8. switch ($category) {
  9.     case "test" {
  10.         print "switch:test $category\n";
  11.     }
  12.     case "somethingelse" {
  13.         print "switch:somethingelse\n";
  14.     }
  15.      
  16. }
  17. exit 0;


=> Affiche bien "switch:test test"
Par contre

Code :
  1. #!/usr/bin/perl -w
  2. #
  3. ##
  4. ##
  5. use strict;
  6. use Switch;
  7. use IO::Socket;
  8. my $HOST = "127.0.0.1";
  9. my $PORT = 6379;
  10. my $server = "$HOST:$PORT";
  11. $class = "IO::Socket::INET";
  12. %options = (PeerAddr => $server,Proto => 'tcp');
  13. my $sock = $class->new(%options) || die "no (Could not connect to redis: $!)";
  14. # Get redis info (2.4+)
  15. print $sock "INFO\r\n";
  16. my $result = <$sock> || die "no (Can't read redis socket: $!)";
  17. my $rep;
  18. read($sock, $rep, substr($result,1)) || die "no (Can't read redis socket: $!)";
  19. foreach (split(/\r\n/, $rep)) {
  20.     my ($key,$val) = split(/:/, $_, 2);
  21.     print "redis: $key => $val\n";
  22. }
  23. close ($sock);
  24. my $category = 'test';
  25. switch ($category) {
  26.     case "test" {
  27.         print "switch:test $category\n";
  28.     }
  29.     case "somethingelse" {
  30.         print "switch:somethingelse\n";
  31.     }
  32.      
  33. }
  34. exit 0;


affiche :
Global symbol "$class" requires explicit package name at test-perl.pl line 15.
Global symbol "%options" requires explicit package name at test-perl.pl line 16.
Global symbol "$class" requires explicit package name at test-perl.pl line 17.
Global symbol "%options" requires explicit package name at test-perl.pl line 17.
Execution of test-perl.pl aborted due to compilation errors.
3) A priori oui, j'ai refait plusieurs fois les manips, et j'ai le même problème avec d'autres scripts sensé faire la même chose...
 
J'ai essayé de :

Code :
  1. [root@???????? ~]# yum install 'perl(IO::Socket::UNIX)'
  2. Modules complémentaires chargés : fastestmirror
  3. Configuration du processus d'installation
  4. Loading mirror speeds from cached hostfile
  5. * base: mirror0.babylon.network
  6. * epel: mirror0.babylon.network
  7. * extras: mirror0.babylon.network
  8. * remi: rpms.remirepo.net
  9. * remi-safe: rpms.remirepo.net
  10. * updates: mirror0.babylon.network
  11. Le paquet 4:perl-5.10.1-141.el6_7.1.x86_64 est déjà installé dans sa dernière version
  12. Rien à faire


Message édité par mechkurt le 07-03-2016 à 15:18:54

---------------
D3
Reply

Marsh Posté le 07-03-2016 à 11:57:23    

il va falloir installer le module IO::Socket.
 
L'article suivant: http://www.thegeekstuff.com/2008/0 [...] n-command/ dans sa seconde partie "Install Perl Modules using CPAN automatically" va vous expliquer très clairement la marche a suivre.
 
Bref vous installez cpan s'il n'est pas déjà installé, en suivant la procédure indiquée, puis vous faites
# cpan
....
cpan[1]> install "IO::Socket";
...
cpan[...]>quit
#
 
et ça devrait rouler (sauf erreur lors de l'installation du module par cpan, mais c'est relativement rare, en particulier pour des modules aussi basiques).
 
A+,


Message édité par gilou le 07-03-2016 à 11:59:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-03-2016 à 14:00:06    

Code :
  1. cpan[3]> install 'IO::Socket'
  2. IO::Socket is up to date (1.31).


 
 
mais
 
 

Code :
  1. #!/usr/bin/perl -w
  2. #
  3. ##
  4. ##
  5. use strict;
  6. use Switch;
  7. use IO::Socket;
  8. my $HOST = "127.0.0.1";
  9. my $PORT = 6379;
  10. my $server = "$HOST:$PORT";
  11. $class = "IO::Socket::INET";
  12. %options = (PeerAddr => $server,Proto => 'tcp');
  13. my $sock = $class->new(%options) || die "no (Could not connect to redis: $!)";
  14. # Get redis info (2.4+)
  15. print $sock "INFO\r\n";
  16. my $result = <$sock> || die "no (Can't read redis socket: $!)";
  17. my $rep;
  18. read($sock, $rep, substr($result,1)) || die "no (Can't read redis socket: $!)";
  19. foreach (split(/\r\n/, $rep)) {
  20.     my ($key,$val) = split(/:/, $_, 2);
  21.     print "redis: $key => $val\n";
  22. }
  23. close ($sock);
  24. exit 0;


=>

Code :
  1. Global symbol "$class" requires explicit package name at test-perl.pl line 13.
  2. Global symbol "%options" requires explicit package name at test-perl.pl line 14.
  3. Global symbol "$class" requires explicit package name at test-perl.pl line 15.
  4. Global symbol "%options" requires explicit package name at test-perl.pl line 15.
  5. Execution of test-perl.pl aborted due to compilation errors.

Message cité 1 fois
Message édité par mechkurt le 07-03-2016 à 14:09:59

---------------
D3
Reply

Marsh Posté le 07-03-2016 à 15:13:13    

J'ai essayé de modifier un peu mon script de test en mettant "en dur" ma connexion, ça marche mieux :

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use IO::Socket;
  4. my $sock = IO::Socket::INET->new(PeerAddr => '127.0.0.1:6379', Proto => 'tcp');
  5. # Get redis info (2.4+)
  6. print $sock "INFO\r\n";
  7. my $result = <$sock> || die "no (Can't read redis socket: $!)";
  8. my $rep;
  9. read($sock, $rep, substr($result,1)) || die "no (Can't read redis socket: $!)";
  10. foreach (split(/\r\n/, $rep)) {
  11.     my ($key,$val) = split(/:/, $_, 2);
  12.     print "redis: $key => $val\n";
  13. }
  14. close ($sock);
  15. exit 0;


 
=>
 

Code :
  1. Use of uninitialized value $val in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  2. redis: # Server =>
  3. redis: redis_version => 3.0.7
  4. redis: redis_git_sha1 => 00000000
  5. redis: redis_git_dirty => 0
  6. redis: redis_build_id => 5ece30e075eed8d2
  7. redis: redis_mode => standalone
  8. redis: os => Linux 3.14.32-xxxx-grs-ipv6-64 x86_64
  9. redis: arch_bits => 64
  10. redis: multiplexing_api => epoll
  11. redis: gcc_version => 4.4.7
  12. redis: process_id => 50972
  13. redis: run_id => 44d67c0efe74c6695b1a63bf7c79a26dfc492fbd
  14. redis: tcp_port => 6379
  15. redis: uptime_in_seconds => 966483
  16. redis: uptime_in_days => 11
  17. redis: hz => 10
  18. redis: lru_clock => 14519093
  19. redis: config_file => /etc/redis.conf
  20. Use of uninitialized value $key in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  21. Use of uninitialized value $val in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  22. redis:  =>
  23. Use of uninitialized value $val in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  24. redis: # Clients =>
  25. redis: connected_clients => 2
  26. redis: client_longest_output_list => 0
  27. redis: client_biggest_input_buf => 0
  28. redis: blocked_clients => 0
  29. Use of uninitialized value $key in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  30. Use of uninitialized value $val in concatenation (.) or string at test-perl.pl line 15, <GEN0> line 1.
  31. [etc...]


 
Du coups je me demande si l'autoconf de munin qui bug avec "Junk printed to stderr" vient ptet du fait qu'il utilise des variables parfois non initialisé, comment je pourrais régler ça, en faisant l’équivalent d'un isset() avant chaque print ?


---------------
D3
Reply

Marsh Posté le 07-03-2016 à 18:39:31    

mechkurt a écrit :

Code :
  1. Global symbol "$class" requires explicit package name at test-perl.pl line 13.
  2. Global symbol "%options" requires explicit package name at test-perl.pl line 14.
  3. Global symbol "$class" requires explicit package name at test-perl.pl line 15.
  4. Global symbol "%options" requires explicit package name at test-perl.pl line 15.
  5. Execution of test-perl.pl aborted due to compilation errors.



Ces erreurs me paraissent logique vue le code, il faut soit déclarer tout ses variables soit virer le use strict (mauvaise idée).

Reply

Marsh Posté le 07-03-2016 à 19:09:38    

La il suffit juste de faire deux petites modifications avec un my en début de ligne:
my $class = "IO::Socket::INET";
my %options = (PeerAddr => $server,Proto => 'tcp');
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-03-2016 à 10:14:20    

me suis débrouillé en modifiant la fonction get_stats du script initial comme suit :

Code :
  1. sub get_stats {
  2.     use IO::Socket;
  3.     my $sock = IO::Socket::INET->new(PeerAddr => '127.0.0.1:6379', Proto => 'tcp');
  4.     # Get redis info (2.4+)
  5.     print $sock "INFO\r\n";
  6.     my $result = <$sock> || die "no (Can't read redis socket: $!)";
  7.     my $rep;
  8.     read($sock, $rep, substr($result,1)) || die "no (Can't read redis socket: $!)";
  9.     my $hash;
  10.     no warnings 'uninitialized';
  11.     foreach (split(/\r\n/, $rep)) {
  12.         my ($key,$val) = split(/:/, $_, 2);
  13.         if ( length $key && length $val ) {
  14.             $hash->{$key} = $val;
  15.         }
  16.     }
  17.     close ($sock);
  18.     return $hash;
  19. }


Et ça fonctionne, en tout cas j'ai des stats... ^^
 
Par contre maintenant je me bat avec le plugin Mysql car il faut une extension Cache::SharedMemoryCache, que je n'arrives pas à installer :

Code :
  1. [root@?????????? ~]# /usr/share/munin/plugins/mysql_ suggest
  2. Missing dependency Cache::Cache at /usr/share/munin/plugins/mysql_ line 728.
  3. [root@?????????? ~]# cpan
  4. Terminal does not support AddHistory.
  5. cpan shell -- CPAN exploration and modules installation (v1.9402)
  6. Enter 'h' for help.
  7. cpan[1]>  install 'Cache::SharedMemoryCache'
  8. CPAN: Storable loaded ok (v2.20)
  9. Going to read '/root/.cpan/Metadata'
  10.   Database was generated on Mon, 07 Mar 2016 05:17:02 GMT
  11. Cache::SharedMemoryCache is up to date (undef).


J'ai googlé un peu et pas mal de gens semblent avoir résolut le problème en installant IPC::ShareLite (via cpan ou paquet EPEL) mais ça ne fonctionne pas pour moi... :- /


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed