Net-Hadoop-YARN
view release on metacpan or search on metacpan
lib/Net/Hadoop/YARN/Roles/JMX.pm view on Meta::CPAN
@stats = qw( all ) if $has_all; # ignore the rest, if any
my $uri_tmpl = $has_all ? 'http://%s/jmx' : 'http://%s/jmx?qry=%s';
my $is_flat = $self->flat;
my %rv;
STATS: foreach my $stat ( @stats ) {
my $uri = sprintf $uri_tmpl, $host_port, ( $has_all ? () : ( $stat ) );
my $resp;
eval {
my $start = time;
$resp = $self->agent_request( $uri ) || next STATS;
DEBUG && sprintf "[ %s REST ] Took %.2f seconds\n", ref $self, time - $start;
1;
} or do {
my $eval_error = $@ || 'Zombie error';
my $msg = "Error from $host_port: $eval_error";
die $msg;
};
next if ! keys %{ $resp };
if ( $is_flat ) {
if ( $has_all ) {
foreach my $bean ( @{ $resp->{beans} } ) {
my $name = $bean->{ObjectName} || $bean->{name};
$rv{ $name } = $bean;
}
}
else {
$rv{ $stat } = $resp;
}
next STATS;
}
if ( $has_all ) {
foreach my $bean ( @{ $resp->{beans} } ) {
my $name = $bean->{ObjectName} || $bean->{name};
$self->_expand( $name, $bean, \%rv );
}
}
else {
$self->_expand( $stat, $resp, \%rv );
}
}
if ( $self->decode_json_substrings ) {
$self->_expand_json_substrings_in_place( \%rv );
}
return \%rv;
}
sub _expand {
my $self = shift;
my $stat_name = shift;
my $response = shift;
my $rv = shift;
my @names = split m{ [.,=:] }xms, $stat_name;
if ( @names > 1 ) {
my $slot = $rv->{ shift @names } ||= {};
while ( my $name = shift @names ) {
if ( @names ) {
$slot = $slot->{ $name } ||= {};
}
else {
$slot->{$name} = $response;
}
}
}
else {
$rv->{ $stat_name } = $response;
}
return;
}
sub _expand_json_substrings_in_place {
my $self = shift;
my $rv = shift || die "No data set specified!";
my $re_json = qr{ \A \{\" }xms;
my $callback = sub {
my($thing, $name_or_index, $is_hash) = @_;
if ( $is_hash ) {
my $item = $thing->{ $name_or_index };
if ( $item =~ $re_json ) {
$thing->{ $name_or_index } = JSON::XS::decode_json( $item ); # loop?
}
}
else {
my $item = $thing->[ $name_or_index ];
# Array: We don't seem to have such a thing, but you can never know
if ( $item =~ $re_json ) {
$thing->[ $name_or_index ] = JSON::XS::decode_json( $item ); # loop?
}
}
return;
};
$self->_looper( $rv, $callback );
return;
}
sub _looper {
my $self = shift;
my $rv = shift || die 'No data was specified!';
my $callback = shift;
if ( ! is_coderef $callback ) {
die "callback needs to be a CODE ref";
}
my $looper;
$looper = sub {
my $thing = shift;
( run in 0.688 second using v1.01-cache-2.11-cpan-5fbc6bb55f2 )