IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Comment effectuer une moyenne ?


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut Comment effectuer une moyenne ?
    Bonjour,

    J'ai créer un script permettant de superviser un équipement réseau.

    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
    #! /usr/bin/perl -w
    use strict;
    use Net::SNMP;
    use Getopt::Long;
     
    # Chargement du module
    use Nagios::Plugin;
    use vars qw/ $VERSION /;
     
     my $valeur;
     my $OID1 = "1.3.6.1.4.1.13576.10.1";
     my $OID2 = "1.3.6.1.2.1.33.1";
     my $host1 = "W.X.Y.Z";
     my $host2 = "W.X.Y.Z";
     my $community = "XXXXX";
     my $clim;
     my $info;
     my $code_retour;
     
    # Version du plugin
    $VERSION = '2.01';
     
    my $LICENCE
     = "Ce plugin Nagios est gratuit et libre de droits, et vous pouvez l'utiliser à votre convenance."
            . ' Il est livré avec ABSOLUMENT AUCUN GARANTIE.';
     
    my $plugin_nagios = Nagios::Plugin->new(
            shortname => " ",
            usage =>
             'Usage : %s [ -H|--hostname <HOST> ] [ -o|--oid <OID> ] [ -C|--community <snmp_community> ] [ -c|critical=<threshold> ] [ -w|--warning=<threshold> ]',
            version => $VERSION,
            license => $LICENCE,
    );
     
    $plugin_nagios->add_arg(
            spec    => 'hostname|H=s',
            help    => 'Hostname ou @IP',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'oid|o=s',
            help    => 'oid',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'snmp_community|C=s',
            help    => 'Nom de la communauté',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'warning|w=f',
            help    => 'Seuil Warning',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'critical|c=f',
            help    => 'Seuil Critical',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'unit|U=s',
            help    => 'Unité',
    );
     
    #Activer le parsing des options de ligne de commande
    $plugin_nagios->getopts;
     
            my $HOST = $plugin_nagios->opts->hostname;
            my $OID = $plugin_nagios->opts->oid;
            my $COMMUNITY = $plugin_nagios->opts->snmp_community;
            my $UNIT = $plugin_nagios->opts->unit;
     
    # Creation de la 1ere session SNMP
    (my $session, my $error) = Net::SNMP->session(
            Hostname => $host1,
            Community => $community);
                    die "session error: $error" unless ($session);
     
    my $result = $session->get_request($OID1);
            die "request error: ".$session->error unless (defined $result);
            $session->close;
     
    foreach my $cle (keys(%{$result})){
    $clim=$result->{$cle} ;
    }
     
    # Creation de la 2eme session SNMP
    (my $session2, my $error2) = Net::SNMP->session(
            Hostname => $host2,
            Community => $community);
                    die "session error: $error2" unless ($session);
     
    my $result2 = $session2->get_request ($OID2);
            die "request error: ".$session2->error unless (defined $result2);
            $session2->close;
     
    foreach my $cle (keys(%{$result2})){
    $info=$result2->{$cle} ;
    }
     
    #Calcu du PUE HZ
    my $total_info = (((120)*$info)*(0.95))/100;
    my $pue_hz = (($clim+$total_info)/$total_info);
     
    #Nombre de chiffre après la virgule
    $pue_hz = sprintf ("%0.4f", $pue_hz);
     
    $code_retour = $plugin_nagios->check_threshold(
            check => $valeur,
            warning => $plugin_nagios->opts->warning,
            critical => $plugin_nagios->opts->critical,
    );
     
    if ($code_retour =~ m/error/)
    {$code_retour = OK};
    $plugin_nagios->nagios_exit ( $code_retour, "$pue_hz$UNIT |$UNIT=$pue_hz \n");
    Ce script me renvoie une valeur, puis avec ces valeurs je construis une courbe que voici :

    Nom : Sans titre.png
Affichages : 405
Taille : 44,5 Ko

    Mon objectif final est d'obtenir une courbe lisse, d'où le calcul de moyenne.
    Cependant, je ne sais pas comment l'implémenter dans mon script, n'y même la fonction à utiliser.

    Je voudrais bien une petite aide svp

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu souhaites faire une moyenne glissante je suppose ?
    Si oui, tu peux utiliser un tableau et le module List::Util :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    use List::Util qw(sum);
     
    my @moy;
    my $gliss = 10; # nombre de valeur à moyenner de manière glissante
    # ...
    # loop {
      # $val contient la valeur à moyenner
      shift @moy if @moy >= $gliss;
      push @moy, $val;
      my $moy_gliss = sum(@moy)/@moy;
    #}
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Oui Philou, c'est exactement ça

    Peux-tu m'expliquer les lignes de ton programme stp, je préfère comprendre que de recopier bêtement

    Par contre je ne sais pas quelle boucle dois-je utiliser pour effectuer cette moyenne :/
    Selon toi quelle boucle dois-je utiliser pour ce genre de moyenne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     use List::Util qw(sum);
     
     my @moy;
     my $gliss = 50;
     my $moy_gliss;
    #...
    #Effectuer la moyenne
    loop {
            shift @moy if @moy >= $gliss;
            push @moy, $pue_hz;
            $moy_gliss = (@moy)/@moy;
    }
     
    print $moy_gliss;
    Désolé, si cela parait une question stupide mais je ne suis pas très à l'aise avec la programmation et encore moins avec perl

    Note : Lorsque j'affiche la variable $moy_gliss, j'obtient "1", or je dois trouver 1.41, 1.42

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Alors d'abord, j'ai écrit "loop" mais c'était juste un exemple pour t'indiquer de placer le bout de code dans une boucle, pas une instruction perl loop.
    Ensuite, tu peux placer le bout de code (sans faire d'erreur de copier/coller ; tu as oublié l'appel à la fonction "sum") dans ta boucle qui lit les valeurs à mettre dans ta courbe. Ensuite, tu prends la valeur calculée pour la moyenne comme valeur pour ton graphe.
    Tu dois donc extraire ce bout de code et le placer dans ton programme. Je n'ai pas trop regardé en détail le programme, donc je ne sais pas trop où tu dois le mettre. Si tu n'y arrives, je regarderai plus précisément.

    Pour comprendre ce que j'ai écrit :

    Cette instruction défini un tableau vide nommé moy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shift @moy if @moy >= $gliss;
    L'instruction shift permet d'extraire du tableau @moy, la première valeur, mais ceci n'est fait qu'à condition que la taille du tableau soit supérieure au nombre de valeur de la moyenne glissante (on évalue le tableau @moy avec >= ce qui le met dans un contexte de scalaire ; dans un contexte de scalaire, un tableau retourne sa taille).

    L'instruction push ajoute $val en fin de tableau.

    Enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $moy_gliss = sum(@moy)/@moy;
    Permet de calculer la moyenne : sum(@moy) fait appel à la fonction sum du module List::Util, et additionne les valeurs du tableau fourni en paramètre.
    Ensuite, on évalue à nouveau @moy dans un contexte scalaire (division), donc on divise le résultat de la somme par le nombre d'élément du tableau.

    Voilà. Si tu as besoin de plus d'explications, n'hésite pas.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    En tout cas merci Philou de prendre de ton temps pour m'expliquer clairement les choses !

    Concernant la boucle, je n'arrive pas encore à sortir de valeur.

    Voici ma boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Effectuer la moyenne
    foreach $tab (@moy) {
            shift @moy if @moy >= $gliss;
            push @moy, $pue_hz;
            $moy_gliss = sum(@moy)/@moy;
    }
     
    print "Moyenne : $moy_gliss\n ";
    Je ne sais pas si cela vient de la boucle en elle même ou de mon script.
    Je vais essayer de le simplifier au maximum.

    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
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    #! /usr/bin/perl -w
    use strict;
    use Net::SNMP;
    use Getopt::Long;
    use List::Util qw(sum);
     
    # Chargement du module
    use Nagios::Plugin;
    use vars qw/ $VERSION /;
     
     my $valeur;
     my $OID1 = "1.3.6.1.4.1.13576.10.1";
     my $OID2 = "1.3.6.1.2.1.33.1";
     my $host1 = "W.X.Y.Z";
     my $host2 = "W.X.Y.Z";
     my $community = "XXXXX";
     my $clim;
     my $info;
     my $code_retour;
     my @moy;
     my $gliss = 50;
     my $moy_gliss;
     my $tab;
     
     
    # Version du plugin
    $VERSION = '3.01';
     
    my $LICENCE
     = "Ce plugin Nagios est gratuit et libre de droits, et vous pouvez l'utiliser à votre convenance."
            . ' Il est livré avec ABSOLUMENT AUCUN GARANTIE.';
     
     
    #Définition des arguments
    my $plugin_nagios = Nagios::Plugin->new(
            shortname => " ",
            usage =>
             'Usage : %s [ -H|--hostname <HOST> ] [ -o|--oid <OID> ] [ -C|--community <snmp_community> ] [ -c|critical=<threshold> ] [ -w|--warning=<threshold> ]',
            version => $VERSION,
            license => $LICENCE,
    );
     
    $plugin_nagios->add_arg(
            spec    => 'hostname|H=s',
            help    => 'Hostname ou @IP',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'oid|o=s',
            help    => 'oid',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'snmp_community|C=s',
            help    => 'Nom de la communauté',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'warning|w=f',
            help    => 'Seuil Warning',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'critical|c=f',
            help    => 'Seuil Critical',
    );
     
    $plugin_nagios->add_arg(
            spec    => 'unit|U=s',
            help    => 'Unité',
    );
     
     
    #Activer le parsing des options de ligne de commande
    $plugin_nagios->getopts;
     
            my $HOST = $plugin_nagios->opts->hostname;
            my $OID = $plugin_nagios->opts->oid;
            my $COMMUNITY = $plugin_nagios->opts->snmp_community;
            my $UNIT = $plugin_nagios->opts->unit;
     
     
    # Creation de la 1er session SNMP
    (my $session, my $error) = Net::SNMP->session(
            Hostname => $host1,
            Community => $community);
                    die "session error: $error" unless ($session);
     
    my $result = $session->get_request($OID1);
            die "request error: ".$session->error unless (defined $result);
            $session->close;
     
    foreach my $cle (keys(%{$result})){
    $clim=$result->{$cle} ;
    }
     
     
    # Creation de la 2eme session SNMP
    (my $session2, my $error2) = Net::SNMP->session(
            Hostname => $host2,
            Community => $community);
                    die "session error: $error2" unless ($session);
     
    my $result2 = $session2->get_request ($OID2);
            die "request error: ".$session2->error unless (defined $result2);
            $session2->close;
     
    foreach my $cle (keys(%{$result2})){
    $info=$result2->{$cle} ;
    }
     
     
    #Calcu du PUE HZ
    my $total_info = (((120)*$info)*(0.95))/100;
    my $pue_hz = (($clim+$total_info)/$total_info);
     
     
    #Nombre de chiffre après la virgule
    $pue_hz = sprintf ("%0.4f", $pue_hz);
     
     
    #Effectuer la moyenne
    foreach $tab (@moy) {
            shift @moy if @moy >= $gliss;
            push @moy, $pue_hz;
            $moy_gliss = sum(@moy)/@moy;
    }
     
    print "Moyenne : $moy_gliss\n ";
     
    #Inclure des seuils 
    #$code_retour = $plugin_nagios->check_threshold(
    #       check => $valeur,
    #       warning => $plugin_nagios->opts->warning,
    #       critical => $plugin_nagios->opts->critical,
    #);
     
    #Code retour Nagios
    #if ($code_retour =~ m/error/)
    #{$code_retour = OK};
    #$plugin_nagios->nagios_exit ( $code_retour, "$pue_hz$UNIT |$UNIT=$pue_hz \n");
    Pour reformuler
    Le script permet, suite à un calcul, d'obtenir une valeur à un instant 't', stocké dans la variable $pue_hz.
    Suite à quoi j'aimerai, additionner toutes les valeurs(50-60valeurs) de $pue_hz et le diviser par le nombre de valeur (tableau + module List::Util) pour en dégager une moyenne.

    Merci d'avance pour ton retour

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton script ne boucle pas sur plusieurs valeurs de $pue_hz... Comment sont calculées ces différentes valeurs ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Alors je vais essayer de décrire mon script pour y voir plus clair

    Je veux superviser la consommation d'un équipement, pour cela je me connecte à l'équipement en question pour récupérer les informations(OID1/OID2) dont j'ai besoin pour effectuer un calcul ($pue_hz):

    Mon calcul final est composé de deux parties que je dois relevé/calculé ($clim/$total_info)

    J'établie une première session et récupère ma valeur pour $clim
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Creation de la 1er session SNMP
    (my $session, my $error) = Net::SNMP->session(
            Hostname => $host1,
            Community => $community);
                    die "session error: $error" unless ($session);
     
    my $result = $session->get_request($OID1);
            die "request error: ".$session->error unless (defined $result);
            $session->close;
     
    foreach my $cle (keys(%{$result})){
    $clim=$result->{$cle} ;
    }

    J'établie une deuxième session et récupère ma valeur pour $info
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Creation de la 2eme session SNMP
    (my $session2, my $error2) = Net::SNMP->session(
            Hostname => $host2,
            Community => $community);
                    die "session error: $error2" unless ($session);
     
    my $result2 = $session2->get_request ($OID2);
            die "request error: ".$session2->error unless (defined $result2);
            $session2->close;
     
    foreach my $cle (keys(%{$result2})){
    $info=$result2->{$cle} ;
    }

    Suite à quoi, je calcul ma valeur $total_info à partir de $info...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #Calcu du PUE HZ
    my $total_info = (((120)*$info)*(0.95))/100;

    ...pour l'implémenter dans mon calcul final ($pue_hz)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $pue_hz = (($clim+$total_info)/$total_info);

    Je limite par la suite le nombre de chiffre significatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #Nombre de chiffre après la virgule
    $pue_hz = sprintf ("%0.4f", $pue_hz);
    Au final, ce script est lancé toutes les 5min via un logiciel et cela me permet d'avoir un historique et de concevoir une courbe.


    J'espère que c'est un peu plus clair pour toi

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Et tu stockes tes valeurs récoltées/calculées toutes les 5 minutes dans un fichier ou une base de données?

    Si le script est lancé toutes les 5 minutes, il ne peut connaître les valeurs recueillies lors des lancements précédents, il faut donc que ces valeurs soient stockées de façon persistante quelque part pour pouvoir ensuite les récupérer et faire une moyenne.

    Si c'est dans un fichier, donne le format de ce fichier. Il suffit alors de relire le fichier. C'est encore plus simple dans une base de données.

    Autre point: Philou t'a donné du code pour calculer une moyenne glissante, par exemple sur 10 mesures, afin de lisser les pointes que l'on voit dans ton graphique, car c'est ce que tu semblais demander initialement. Au fil de tes posts, on a maintenant l'impression que tu recherches plutôt une moyenne générale. De quoi as-tu vraiment besoin?

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    J'attends les mêmes réponses que Lolo. En effet, le bout de code que je t'ai donné était destiné à être introduit dans la "boucle" qui lit toutes les 5mn.
    Comme tu sembles l'expliquer, cette boucle est réalisée en dehors du script.
    Cela dit, avec quoi cette boucle est-elle réalisée ? (cron ?) Elle pourrait être réalisée par ton script perl (qui deviendrait alors un service fonctionnant en continu, par pooling). Dans ce cas, il n'est pas nécessaire d'avoir une stockage externe au script des valeurs de température mesurées.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Et tu stockes tes valeurs récoltées/calculées toutes les 5 minutes dans un fichier ou une base de données?

    Si le script est lancé toutes les 5 minutes, il ne peut connaître les valeurs recueillies lors des lancements précédents, il faut donc que ces valeurs soient stockées de façon persistante quelque part pour pouvoir ensuite les récupérer et faire une moyenne.

    Si c'est dans un fichier, donne le format de ce fichier. Il suffit alors de relire le fichier. C'est encore plus simple dans une base de données.
    Effectivement, je ne m'étais pas posé les bonnes questions.

    En définitive, le logiciel (Nagios) va lancé le script toutes les 5" donc il ne sauvegarde pas les valeurs dans un fichier.
    La construction de la courbe doit être réalisée en calculant la moyenne de toutes les valeurs intant 't' sur 24h00 glissant.

    Donc que dois-je faire ?
    - Stocker toutes les valeurs dans un fichier ;
    - Faire appel à ce fichier dans mon script ;
    - Additionner toutes les valeurs ;
    - Diviser la somme par le nombre de valeur.

    J'essaie de diviser le problème en petites étapes histoire de bien comprendre le déroulement des choses.

  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Ton script actuel est-il un plugin Nagios ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Ton script actuel est-il un plugin Nagios ?
    Exactement

  13. #13
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne connais pas du tout Nagios, mais il existe sans doute une possibilité de stockage persistant dans le plugin ou dans Nagios de sorte qu'à chaque appel (et calcul de la température), on puisse retrouver ces anciennes données. Dans ce contexte, les données qu'il conviendrait de "sauver" sont celles du tableau @moy (et qui contiendrait n valeur de température au maximum). À chaque appel et calcul de la température, il faudrait donc :
    - récupérer le tableau @moy
    - calculer $pue_hz
    - exécuter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    shift @moy if @moy >= 10;
            push @moy, $pue_hz;
            $moy_gliss = sum(@moy)/@moy;
    - sauver à nouveau le tableau @moy

    Désolé, j'aurais pu voir dès le premier message que c'était un plugin Nagios
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Désolé de ne pas avoir suivit le post, mais me revoici sur ce problème.

    J'ai pris en compte de vos remarques, et j'ai par conséquent stocké mes variables dans un fichier à part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    open (ECRIRE,">>test.txt") || die ("Erreur d'ouverture de test");
    printf ( ECRIRE "$pue_hz\n" );
    close (ECRIRE);
    Maintenant lorsque je lance mon script je constate l'incrémentation d'une nouvelle valeur dans le fichier test.txt.

    Par contre, je ne sais pas comment faire ma moyenne... si je dois toujours passer par un tableau ou s'il est possible de faire la moyenne directement.
    Je pense que le plus simple serait de :
    - lire le fichier
    - additionner les chiffres (1 par ligne)
    - diviser le tout par le nombre de nombre

    Mais je ne sais si c'est la meilleur méthode en perl :/

  15. #15
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par musha76 Voir le message
    Par contre, je ne sais pas comment faire ma moyenne... si je dois toujours passer par un tableau ou s'il est possible de faire la moyenne directement.
    Je pense que le plus simple serait de :
    - lire le fichier
    - additionner les chiffres (1 par ligne)
    - diviser le tout par le nombre de nombre

    Mais je ne sais si c'est la meilleur méthode en perl :/
    Pourquoi pas?

    Il existe des modules pour calculer la moyenne et toutes sortes d'autres valeurs statistiques (variance, écart-type, médiane, quartiles, déciles, etc.) pour des données généralement stockées dans un tableau ou d'autre structures de données, mais là, pour une simple moyenne, inutile de se casse la tête: autant calculer la somme directement à la lecture de chaque ligne (ainsi qu'incrémenter un compteur) et faire la division à la fin.

  16. #16
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    On peut même compter et faire la somme dans une même variable (tableau de 2 entrées) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $moy = [0, 0];
    # boucle ...
    $moy->[0] += $valeur, $moy->[1]++;
    # fin boucle ...
    print "moyenne = ", $moy->[0]/$moy->[1];
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  17. #17
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour vos réponses !

    Par contre, je n'ai pas réussi à implémenter ton bout de script dans le mien.

    J'ai donc déposer les valeurs dans un fichier, puis calculer la moyenne depuis ces valeurs.

    Voilà pour ceux qui cherche également :

    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
    #On ouvre le fichier (en ajout) pour écrire les nouvelles valeurs dans le fichier
    open (ECRIRE,">>/tmp/test.txt") || die ("Erreur d'ouverture du fichier");
    printf ( ECRIRE "$pue_hz\n" );
    close (ECRIRE);
     
     
    #On déclare nos variables pour effectuer la moyenne
    my $sum = 0;
    my $score = 0;
    my $filename = "/tmp/test.txt";
     
     
    #On ouvre le fichier en lecture
    open (my $fh, '<', $filename) or die "Erreur d'ouverture du fichier '$filename'\n";
    while (my $line = <$fh>) {
    	$sum += $line;		#On additionne tout les chiffres
    	$score++;		#On compte le nombre de lignes
    }
    my $moy = $sum / $score;	#On calcul la moyenne

  18. #18
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Hum par contre je me rends compte qu'au final le script de ma moyenne ne convient pas car à terme ma valeur va converger et je ne constaterais plus de changement de variation :/

    Je dois au final bien avoir un moyenne glissante, sur 8 jours

    Mais par contre je ne sais pas comment procéder ne serai-ce pour calculer ma moyenne sur 8jours.
    Pour expliquer au mieux, au terme de ces 8 jours, je dois obtenir une moyenne sur ces 8 jours donc une valeur que je reporte sur ma courbe, donc 8 jours = 1 point sur ma courbe

    Comment dois-je procéder ? Récolter tous les points sur 8 jours et effectuer la moyenne de ces points pour obtenir 1 point sur ma courbe ou il y a-t-il une autre méthode plus performante et plus simple ?

  19. #19
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Du coup, ton fichier doit aussi contenir une date, et il faut t'arranger pour ne prendre en compte que les 8 derniers jours, soit en ne gardant pour ton calcul que les huit dernières lignes de ton fichier (par exemple avec un buffer circulaire de 8 cases), soit en purgeant ton fichier de ses enregistrements les plus anciens, ce qui est sans doute meilleur (pas d'accroissement continuel du fichier) et plus simple.

    Ne t'inquiète pas trop des performances, avec des données aussi petites, tu n'auras guère de problème.

  20. #20
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Oula ! On a attaqué la chimie organique pour moi

    Alors, pour la première solution, dans mon fichier j'ai 1 ligne toutes les 5mins, donc sur 8 jours je ne sais pas ce que cela représente mais ça fait beaucoup de ligne.

    J'avais également pensé à la purge du fichier contenant les valeurs, mais j'avais un doute quant à l'historique de la courbe si les valeurs étaient purgées.
    Si je pars sur la purge du fichier tous les 8 jours, comment puis-je le mettre en place ? via un autre script qui purge le fichier tous les 8 jours ou c'est possible de l'implémenter directement dans mon script ?

    Aussi comment faire pour avoir 1 point sur ma courbe tous les 8 jours ?
    Je m'explique, à l'heure actuelle dès que je lance mon script, cela me fait une moyenne, donc j'obtiens une valeur qui va s'ajouter à ma courbe.
    Sauf que maintenant, il faudra attendre 8 jours, faire la moyenne des valeurs obtenu depuis 8 jours pour j'obtenir 1 point, puis purger le fichier et recommencer.

    Je sais pas si c'est compréhensible

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment créer une somme dans un état?
    Par ivan rung dans le forum Access
    Réponses: 6
    Dernier message: 20/01/2006, 07h56
  2. [C#][ MSI] Comment effectuer une mise à jour d'application ?
    Par th3r1ddl3r dans le forum Windows Forms
    Réponses: 6
    Dernier message: 15/12/2005, 10h09
  3. Réponses: 4
    Dernier message: 19/10/2005, 09h20
  4. Réponses: 6
    Dernier message: 24/03/2005, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo