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 )