You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
6.4 KiB
249 lines
6.4 KiB
#!/usr/bin/perl
|
|
|
|
# Program name: metricator_reader.pl
|
|
# Compatibility: Perl x
|
|
# Purpose - read nmon data from fifo file
|
|
# Author - Guilhem Marchand
|
|
|
|
my $version = "2.0.0";
|
|
|
|
use Getopt::Long;
|
|
use File::stat;
|
|
use File::Copy;
|
|
use POSIX 'strftime';
|
|
|
|
#################################################
|
|
## Arguments Parser
|
|
#################################################
|
|
|
|
# Default values
|
|
my $APP = "";
|
|
my $fifo_name = "";
|
|
my $VERSION = "";
|
|
my $help = "";
|
|
|
|
my $result = GetOptions(
|
|
"fifo=s" => \$fifo_name, # string
|
|
"version" => \$VERSION, # flag
|
|
"help" => \$help # flag
|
|
);
|
|
|
|
# Show version
|
|
if ($VERSION) {
|
|
print("metricator_reader.pl version $version \n");
|
|
|
|
exit 0;
|
|
}
|
|
|
|
# Show help
|
|
if ($help) {
|
|
|
|
print( "
|
|
|
|
Help for metricator_reader.pl:
|
|
|
|
The script should be run in the backgroud to continously read nmon data from fifo files.
|
|
|
|
Available options are:
|
|
|
|
--fifo <name of fifo> :Name of the pre-configured fifo file
|
|
--version :Show current program version \n
|
|
"
|
|
);
|
|
|
|
exit 0;
|
|
}
|
|
|
|
# Local time
|
|
my $time = strftime "%d-%m-%Y %H:%M:%S", localtime;
|
|
|
|
# Default Environment Variable SPLUNK_HOME, this shall be automatically defined if as the script shall be launched by Splunk
|
|
my $SPLUNK_HOME = $ENV{SPLUNK_HOME};
|
|
|
|
# Verify SPLUNK_HOME definition
|
|
if ( not $SPLUNK_HOME ) {
|
|
print(
|
|
"\n$time ERROR: The environment variable SPLUNK_HOME could not be verified, if you want to run this script manually you need to export it before processing \n"
|
|
);
|
|
die;
|
|
}
|
|
|
|
# Discover TA-metricator-for-nmon path
|
|
if ( length($APP) == 0 ) {
|
|
|
|
if ( -d "$SPLUNK_HOME/etc/apps/TA-metricator-for-nmon" ) {
|
|
$APP = "$SPLUNK_HOME/etc/apps/TA-metricator-for-nmon";
|
|
}
|
|
elsif ( -d "$SPLUNK_HOME/etc/peer-apps/TA-metricator-for-nmon" ) {
|
|
$APP = "$SPLUNK_HOME/etc/peer-apps/TA-metricator-for-nmon";
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if ( !-d "$APP" ) {
|
|
print(
|
|
"\n$time ERROR: The Application root directory could be verified using your custom setting: $APP \n"
|
|
);
|
|
die;
|
|
}
|
|
|
|
}
|
|
|
|
# Verify existence of APP
|
|
if ( !-d "$APP" ) {
|
|
print(
|
|
"\n$time ERROR: The Application root directory could not be found, is the TA-metricator-for-nmon installed ?\n"
|
|
);
|
|
die;
|
|
}
|
|
|
|
# var directories
|
|
my $APP_MAINVAR = "$SPLUNK_HOME/var/log/metricator";
|
|
my $APP_VAR = "$APP_MAINVAR/var";
|
|
|
|
if ( !-d "$APP_MAINVAR" ) {
|
|
print(
|
|
"\n$time INFO: main var directory not found ($APP_MAINVAR), no need to run.\n"
|
|
);
|
|
exit 0;
|
|
}
|
|
|
|
# check fifo_name
|
|
if ( not "$fifo_name" ) {
|
|
print("\n$time ERROR: the --fifo_name <name of fifo> is mandatory\n");
|
|
die;
|
|
}
|
|
|
|
# define the full path to the fifo file
|
|
my $fifo_path = "$APP_VAR/nmon_repository/$fifo_name/nmon.fifo";
|
|
|
|
# At startup, rotate any existing non empty .dat file if nmon_data.dat is not empty
|
|
|
|
# define the various files to be written
|
|
|
|
# realtime files
|
|
my $nmon_config_dat = "$APP_VAR/nmon_repository/$fifo_name/nmon_config.dat";
|
|
my $nmon_header_dat = "$APP_VAR/nmon_repository/$fifo_name/nmon_header.dat";
|
|
my $nmon_data_dat = "$APP_VAR/nmon_repository/$fifo_name/nmon_data.dat";
|
|
my $nmon_external_dat = "$APP_VAR/nmon_repository/$fifo_name/nmon_external.dat";
|
|
my $nmon_external_header_dat =
|
|
"$APP_VAR/nmon_repository/$fifo_name/nmon_external_header.dat";
|
|
my $nmon_timestamp_dat =
|
|
"$APP_VAR/nmon_repository/$fifo_name/nmon_timestamp.dat";
|
|
my $nmon_error_dat = "$APP_VAR/nmon_repository/$fifo_name/nmon_error.dat";
|
|
|
|
my @nmon_dat = (
|
|
"$nmon_config_dat", "$nmon_header_dat",
|
|
"$nmon_data_dat", "$nmon_timestamp_dat",
|
|
"$nmon_external_dat", "$nmon_external_header_dat",
|
|
"$nmon_error_dat"
|
|
);
|
|
|
|
my $file;
|
|
my $rotated_file;
|
|
|
|
# Remove any existing rotated file
|
|
foreach $file (@nmon_dat) {
|
|
$rotated_file = "$file.rotated";
|
|
if ( -e $rotated_file ) {
|
|
unlink $rotated_file;
|
|
}
|
|
}
|
|
|
|
# Manage existing files and do the rotation if required
|
|
if ( !-z $nmon_data_dat ) {
|
|
foreach $file (@nmon_dat) {
|
|
$rotated_file = "$file.rotated";
|
|
move( $file, $rotated_file );
|
|
}
|
|
}
|
|
else {
|
|
foreach $file (@nmon_dat) {
|
|
if ( -e $file ) {
|
|
unlink $file;
|
|
}
|
|
}
|
|
}
|
|
|
|
####################################################################
|
|
############# Main Program
|
|
####################################################################
|
|
|
|
if ( !-p $fifo_path ) {
|
|
print(
|
|
"\n$time INFO: The fifo file $fifo_path does not exist yet, we are not ready to start.\n"
|
|
);
|
|
exit 0;
|
|
|
|
}
|
|
else {
|
|
|
|
my $fifoh;
|
|
|
|
# Open the named pipe "a la shell" to ensure that we we will quite when the nmon process has ended as well
|
|
open( $fifoh, "$APP/bin/metricator_reader.sh $fifo_path|" );
|
|
|
|
while (<$fifoh>) {
|
|
chomp($_);
|
|
|
|
my $nmon_config_match = '^[AAA|BBB].+';
|
|
my $nmon_header_match =
|
|
'^(?!AAA|BBB|TOP)[a-zA-Z0-9\-\_]*,(?!T\d{3,})[^,]*,(?!T\d{3,})[^,]*.*';
|
|
my $nmon_header_TOP_match = '^TOP,(?!\d*,)';
|
|
my $nmon_timestamp_match = '^ZZZZ,T\d*';
|
|
my $nmon_error_match = '^ERROR,T\d*';
|
|
|
|
if ( $_ =~ /$nmon_config_match/ ) {
|
|
open( my $fh, '>>', $nmon_config_dat )
|
|
or die "Could not open file '$nmon_config_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
elsif ( $_ =~ /$nmon_header_match/ ) {
|
|
open( my $fh, '>>', $nmon_header_dat )
|
|
or die "Could not open file '$nmon_header_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
elsif ( $_ =~ /$nmon_header_TOP_match/ ) {
|
|
open( my $fh, '>>', $nmon_header_dat )
|
|
or die "Could not open file '$nmon_header_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
elsif ( $_ =~ /$nmon_error_match/ ) {
|
|
open( my $fh, '>>', $nmon_error_dat )
|
|
or die "Could not open file '$nmon_error_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
elsif ( $_ =~ /$nmon_timestamp_match/ ) {
|
|
open( my $fh, '>>', $nmon_timestamp_dat )
|
|
or die "Could not open file '$nmon_timestamp_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
open( my $fh, '>>', $nmon_data_dat )
|
|
or die "Could not open file '$nmon_data_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
else {
|
|
open( my $fh, '>>', $nmon_data_dat )
|
|
or die "Could not open file '$nmon_data_dat' $!";
|
|
print $fh "$_\n";
|
|
close $fh;
|
|
}
|
|
|
|
}
|
|
close $fifoh;
|
|
exit(0);
|
|
|
|
}
|