2017-08-31 6 views
-2

Donc, j'essaie de configurer check_json.pl dans NagiosXI pour surveiller certaines statistiques. J'utilise code with the modification I submitted in pull request #32, donc les numéros de ligne reflètent ce code.Syntaxe d'attribut pour la requête JSON dans check_json.pl

La requête JSON retourne quelque chose comme ceci:

[ 
    { 
     "total_bytes": 123456, 
     "customer_name": "customer1", 
     "customer_id": "1", 
     "indices": [ 
      { 
       "total_bytes": 12345, 
       "index": "filename1" 
      }, 
      { 
       "total_bytes": 45678, 
       "index": "filename2" 
      }, 

     ], 
     "total": "765.43gb" 
    }, 
    { 
     "total_bytes": 123456, 
     "customer_name": "customer2", 
     "customer_id": "2", 
     "indices": [ 
      { 
       "total_bytes": 12345, 
       "index": "filename1" 
      }, 
      { 
       "total_bytes": 45678, 
       "index": "filename2" 
      }, 

     ], 
     "total": "765.43gb" 
    } 
] 

Je suis en train de surveiller la taille des fichiers spécifiques. si un chèque devrait ressembler à:

/path/to/check_json.pl -u https://path/to/my/json -a "SOMETHING" -p "SOMETHING" 

... où je suis en train de comprendre les Somethings afin que je puisse suivre les total_bytes de filename1 dans client2 où je connais l'customer_id et l'index, mais pas leur position dans les tableaux respectifs.

Je peux surveiller le nombre total d'octets de customer1 en utilisant la chaîne "[0]->{'total_bytes'}" mais je dois pouvoir spécifier quel client et approfondir le nom de fichier (connu) et la taille du fichier (stat à surveiller) ET la requête de travail moi le statut (OK, WARNING, ou CRITICAL). Ajout -p tout ce que je reçois des erreurs ....

L'erreur avec -p peu importe comment je suis en mesure de l'exprimer est toujours:

Not a HASH reference at ./check_json.pl line 235. 

Même quand je peux obtenir un OK valide à partir de l'exemple "[0]->{'total_bytes'}", l'utilisation de -p donne toujours la même erreur. Des liens vers la documentation sur le format à utiliser seraient très utiles. Des exemples dans le fichier README pour le script ou dans la sortie -h m'abandonnent ici. Des idées?

+0

Si vous allez marquer ce poste vers le bas, je vous serais reconnaissant si vous avez au moins la courtoisie de me la moindre idée de pourquoi. –

+0

Il semble que la grande déconnexion entre vous et l'original check_json est que l'original s'attend à ce que le JSON retourné soit un seul objet, tandis que votre JSON est un tableau d'objets.Votre $ json_response est un ref ARRAY: la ligne 235 (et les lignes 229, 259, 265) s'attend à ce que ce soit une référence HASH. –

Répondre

0

Je n'ai vraiment aucune idée de votre question. Je suis sûr que je ne suis pas seul, d'où les downvotes.

Une fois que vous avez le JSON décodée, si vous avez un customer_id pour rechercher, vous pouvez faire:

my ($customer_info) = grep {$_->{customer_id} eq $customer_id} @$json_response; 

En ce qui concerne l'erreur sur la ligne 235, cela semble étrange:

foreach my $key ($np->opts->perfvars eq '*' ? map { "{$_}"} sort keys %$json_response : split(',', $np->opts->perfvars)) { 
    # ....................................... ^^^^^^^^^^^^^ 
    $perf_value = $json_response->{$key}; 

si perfvars eq "*", vous semblez rechercher $json_reponse->{"{total}"} par exemple. Vous pouvez valider la saisie de l'utilisateur:

die "no such key in json data: '$key'\n" unless exists $json_response->{$key}; 

Cette entreprise de toute stringifying les recherches ref hash odeurs tout simplement mauvais.

Une meilleure question ressemblerait à ceci:

Je ces données JSON. Comment puis-je obtenir la somme de total_bytes pour le client avec l'ID 1?

Voir https://stackoverflow.com/help/mcve