Bonjour,
Je me permet d'ajouter ce post au forum afin d'avoir un petit coup de pouce sur un script que je fais. Je me suis aussi adressé sur le forum Centreon mais pour l'instant, les réponses apporté ne m'ont pas permis de palier au problème rencontré. Vous l'aurez donc compris, ce scripts a pour but de s'interfacer avec Centreon.
Attaquons le vif du sujet, dans la boite ou je travail, nous utilisons les réplications de base de donnée depuis la France vers les DOM-TOM en streaming proposé par Oracle.
Le but de mon script est d'interroger les bases de données par le biais de sqlplus et d'un script retard2.sql.
Voici un exemple du résultat du script sur le retard de la base de Paris par rapport a celles des DOM-TOM. La requête est effectué presque instantanément :
Or, le tableau ici présent ne me convient pas car il y a trop d'information. Je ne souhaite récupérer que la station qui possède le plus de retard.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CAPTURE_FOR_MART .003611111 CAPTURE_FOR_REU .003611111 CAPTURE_FOR_MAY .003611111 CAPTURE_FOR_NC .003611111 CAPTURE_FOR_TAH .003611111 CAPTURE_FOR_GUAD .003611111 CAPTURE_FOR_SPM .914166667 CAPTURE_FOR_GUY .003611111
Voici le script que j'utilise pour récupérer les informations que je souhaite :
Le script intérroge donc la base pour connaître le retard, puis transfert ça dans un fichier texte. Ensuite, depuis mon serveur de supervision j'utilise un autre script qui va parser le fichier texte en question pour mettre en forme mon résultat et l'interfacer avec Centreon. J'utilise un cron donc pour automatiser le lancement du script. Jusque là pas de problème, tout s'effectue parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 #!/usr/bin/perl ############ check_oracle_retard ################ # Date : June 7 20010 # Author : XXXX ################################################# # Description : #Ce script permet de connaitre le retard des #réplication des bases oracle. Usage strictement #réservé la base RFOPARIS. use strict; use FindBin; use lib "$FindBin::Bin"; use lib "/usr/lib/nagios/plugins"; use utils qw(%ERRORS); ################################################# ##### Plugin var init ## my $test; my @TABL; my @stream; my $max; my $Nmax; my $res; my @sql; my $export; my $retard; $Nmax=""; $max=0; $retard="/usr/local/nagios/libexec/retard.txt.RFOPARIS"; ################################################## ################################################# #### Mise a jour du fichier ## @sql = `/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOPARIS.world \@/usr/local/nagios/libexec/retard2`; ################################################# ################################################## ##### Script ## foreach $res (@sql) { @stream = split(/\t /, $res); if (length(@stream[0]) >= "2") { if (@stream[1] > $max) { $max=@stream[1]; $Nmax=@stream[0]; } } } if ($max < 1) { $max = sprintf("%.3fH", $max); `echo 'true\nReplication Oracle Streaming : OK $Nmax avec $max' > $retard`; exit $ERRORS{'OK'}; } elsif ($max >= 1 && $max < 2) { $max = sprintf("%.3fH", $max); `echo 'middle\nReplication Oracle Streaming : Warning $Nmax avec $max' > $retard`; exit $ERRORS{'WARNING'}; } elsif ($max >= 2) { $max = sprintf("%.3fH", $max); `echo 'false\nReplication Oracle Streaming : CRITICAL $Nmax avec $max' > $retard`; exit $ERRORS{'CRITICAL'}; }
Par contre, lorsque je souhaite interroger les bases des DOM-TOM pour connaître le retard de Paris, c'est le drame. La requête prend environ 10 secondes, donc en exécution à la main, il n'y a aucun problème par contre par un cron je ne récupère rien.
Voici le script utilisé :
En executant le script à la main (en tant qu'utilisateur nagios) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 #!/usr/bin/perl ######## check_oracle_retard_station ############ # Date : June 7 20010 # Author : XXXXXX ################################################# use strict; use FindBin; use lib "$FindBin::Bin"; use lib "/usr/lib/nagios/plugins"; use Getopt::Long; use utils qw(%ERRORS); use vars qw($opt_S); ################################################# ################################################# ##### Plugin var init ## my $max; my $res; my @TABL; my @stream; my @sql; my $sql; my $retard; my $test; Getopt::Long::Configure('bundling'); GetOptions ("S=s" => \$opt_S, "station=s" => \$opt_S); $max=0; $retard="/usr/local/nagios/libexec/retard.txt"; ################################################## ################################################## ##### Verify Options ## if (!$opt_S) { printf("Argument -S non declare : Station de votre choix\nexemple : RFOGUY1, RFOMART1, RFOGUAD1, RFOTAH1, RFOMAY1, RFONC1, RFOSPM1, RFOREU1\n"); exit $ERRORS{'OK'}; } if ($opt_S eq "RFOPARIS") { printf("Argument -S non valide : Pour PARIS utiliser check_oracle_retard_perl\n"); exit $ERRORS{'OK'}; } ################################################## ################################################# #### Mise a jour du fichier ## if ($opt_S eq "RFOMART1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOMART1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOMART1"; } if ($opt_S eq "RFOGUAD1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOGUAD1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOGUAD1"; } if ($opt_S eq "RFOGUY1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOGUY1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOGUY1"; } if ($opt_S eq "RFOSPM1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOSPM1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOSPM1"; } if ($opt_S eq "RFOMAY1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOMAY1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOMAY1"; } if ($opt_S eq "RFOTAH1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOTAH1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOTAH1"; } if ($opt_S eq "RFONC1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFONC1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFONC1"; } if ($opt_S eq "RFOREU1") { @sql=`/opt/oracle/product/10.2.0/db/bin/sqlplus -S XXXX/XXXX\@RFOREU1.world \@/usr/local/nagios/libexec/retard2`; $retard="/usr/local/nagios/libexec/retard.txt.RFOREU1"; } ################################################# ################################################# #### Script ## foreach $res (@sql) { @stream = split(/\t /, $res); if (length(@stream[0]) >= "2") { $max=@stream[1]; } } if ($max < 1) { $max = sprintf("%.3fH", $max); $test = `echo \$ORACLE_HOME`; `echo '$test true\nReplication Oracle Streaming : OK $opt_S avec $max' > $retard`; exit $ERRORS{'OK'}; } elsif ($max >= 1 && $max < 2) { $max = sprintf("%.3fH", $max); `echo 'middle\nReplication Oracle Streaming : Warning $opt_S avec $max' > $retard`; exit $ERRORS{'WARNING'}; } elsif ($max >= 2) { $max = sprintf("%.3fH", $max); `echo 'false\nReplication Oracle Streaming : CRITICAL $opt_S avec $max' > $retard`; exit $ERRORS{'CRITICAL'}; }
Hors si je laisse cron l'executer (en tant qu'utilisateur nagios) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 # ./check_oracle_retard_station_perl -S RFOGUY1 # cat retard.txt.RFOGUY1 /opt/oracle/product/10.2.0/db true Replication Oracle Streaming : OK RFOGUY1 avec 0.001H
Le retard n'est pas "normal" car sur divers test ou il y avait plus d'une heure de retard, le résultat affiché était quand même 0.000H.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 cat retard.txt.RFOGUY1 /opt/oracle/product/10.2.0/db true Replication Oracle Streaming : OK RFOGUY1 avec 0.000H
Je me demande donc d'ou vient la source, même si je pense que ça vient du fait que cron ne patiente pas jusqu'à la fin de l'exécution de la commande.
Voilà tout, si vous pouvez me filer une piste que j'explorerais je vous en serais reconnaissant !
Désolé pour le pavé mais j'ai essayer de détailler d'expliquer un maximum. Je suis aussi ouvert à la critique, ayant "appris" le perl il y a 1 semaine. (System D)
Cordialement,
Aletor!
Partager