#!/usr/bin/perl
use v5.14;
use autodie;
#use Data::Dumper;
use Text::CSV::Slurp;
use XML::Simple;
my $n = 0;
####################################################################################
## Constantes
####################################################################################
my %medidas = (
cpu => {
caption => "Uso de la CPU",
xAxisName => "Mensual",
yAxisName => "% uso cpu",
yAxisMaxvalue => "100",
datos => [
qw(
CPU_%_libre_minimo
CPU_%_libre_maximo
CPU_%_libre_media
)
],
},
# mem => {
# caption => "Uso de la memoria",
# xAxisName => "Mensual",
# yAxisName => "% uso Memoria",
# datos => [
# qw(
# RAM_%_libre
# SWAP_%_libre
# )
# ],
# },
);
####################################################################################
## Argumentos
####################################################################################
@ARGV == 1 or die "Uso: $0 <archivo CSV a procesar>\n";
my $archivo_csv = shift;
####################################################################################
## Lectura del archivo
####################################################################################
my $datos = Text::CSV::Slurp->load(
file => $archivo_csv,
sep_char => ';',
quote_char => '"'
);
my %log;
for my $item (@$datos)
{
my ( $dia, $mes, $year, $hora, $minuto) =
$item->{Timestamp} =~ /(\d+)/g;
$item->{Timestamp} =
sprintf "%02d" . "/" . "%02d" . "/" . "%02d" . " " . "%02d" . ":" . "%02d" , $year, $mes, $dia, $hora, $minuto;
$log{ $item->{Entidad} }
->{ $item->{Metrica} }
# ->{ $item->{Operador} }
->{ $item->{Timestamp} } =
$item->{Valor};
}
#say Dumper \%log;
####################################################################################
## Salida
####################################################################################
for my $maquina ( keys %log )
{ # por cada máquina
say $maquina;
for my $medida ( keys %medidas )
{ # por cada medida
say "\t$medida";
# la raíz de todos los males
my $xml = {
chart => {
showValues => 0,
caption => $medidas{$medida}->{caption} . " " . $maquina, # los que no llevan $variables son comunes a todos los grafico
xAxisName => $medidas{$medida}->{xAxisName},
yAxisName => $medidas{$medida}->{yAxisName},
yAxisMaxvalue => $medidas{$medida}->{yAxisMaxvalue},
#paletteColors => "042936,006D9C,5DCF76,3F8A4F",
palette => 2,
#showToolTip => 1,
numDivLines => 8,
inThousandSeparator => ".",
inDecimalSeparator => ",",
#decimalSeparator => ",",
#thousandSeparator => ".",
decimals => "2",
legendIconScale => "1", #Tamaño icono de cada leyenda
legendCaption => "Servidores Fisicos", #Titulo
showExportDataMenuItem => "1", #Copiar datos al portapapeles
drawAnchors => "0", #Quita el punto de dato (circulo) y el toolTip
categories =>
{ # modelo para añadir o modificar atributos del XML
fontSize => 8,
}
}
};
# fechas
my @fechas =
sort keys %{ $log{$maquina}->{ ${ $medidas{$medida}->{datos} }[0] } };
$xml->{chart}->{categories}->{category} =
[ map { { label => $_ } } @fechas ];
# por cada magnitud
for my $item ( @{ $medidas{$medida}->{datos} } )
{
say "\t\t$item";
# sacamos el conjunto de datos, para esas fechas
my @set =
map { { value => $log{$maquina}->{$item}->{$_} } } @fechas;
push @{ $xml->{chart}->{dataset} },
{
SeriesName => $item,
set => [@set],
};
}
open my $SALIDA, '>', "data/fisico/"
. "${maquina}_$medida.xml"; # /vm/${maquina}_$medida.xml
print $SALIDA XMLout( $xml, KeepRoot => 1 );
close $SALIDA;
##############################################################
# Generar estructura HTML
##############################################################
open my $html, '>>', "tmpl/" . "dgpe_fisico_medias.tmpl"; # /vm/dgpe_vm.tmpl
$n += 1;
my $chartid = "ChartIdFIMed" . "_" . $n;
say $html
qq( <span id="${maquina}_$medida">FusionCharts will load here!</span>
<script type="text/javascript" >
/*FusionCharts.setCurrentRenderer('javascript');*/
var myChart = new FusionCharts("fusion/MSLine.swf",
"$chartid ","1100", "600", "0", "1");
myChart.setXMLUrl("data/fisico/${maquina}_$medida.xml");
myChart.render("${maquina}_$medida");
</script>);
}
}
__END__