class MCollective::RPC::Stats

Class to wrap all the stats and to keep track of some timings

Attributes

blocktime[R]
discovered[R]
discovered_nodes[R]
discoverytime[R]
failcount[R]
noresponsefrom[R]
okcount[R]
responses[R]
responsesfrom[R]
starttime[R]
totaltime[R]

Public Class Methods

new() click to toggle source
# File lib/mcollective/rpc/stats.rb, line 8
def initialize
    reset
end

Public Instance Methods

[](key) click to toggle source

Fake hash access to keep things backward compatible

# File lib/mcollective/rpc/stats.rb, line 44
def [](key)
    to_hash[key]
rescue
     nil
end
client_stats=(stats) click to toggle source

Re-initializes the object with stats from the basic client

# File lib/mcollective/rpc/stats.rb, line 65
def client_stats=(stats)
    @noresponsefrom = stats[:noresponsefrom]
    @responses = stats[:responses]
    @starttime = stats[:starttime]
    @blocktime = stats[:blocktime]
    @totaltime = stats[:totaltime]
    @discoverytime = stats[:discoverytime] if @discoverytime == 0
end
discovered_agents(agents) click to toggle source

Update discovered and #discovered_nodes based on discovery results

# File lib/mcollective/rpc/stats.rb, line 102
def discovered_agents(agents)
    @discovered_nodes = agents
    @discovered = agents.size
end
fail() click to toggle source

increment the count of failed hosts

# File lib/mcollective/rpc/stats.rb, line 58
def fail
    @failcount += 1
rescue
    @failcount = 1
end
finish_request() click to toggle source

Helper to calculate total time etc

# File lib/mcollective/rpc/stats.rb, line 108
def finish_request
    @totaltime = @blocktime + @discoverytime

    # figures out who we had no responses from
    dhosts = @discovered_nodes.clone
    @responsesfrom.each {|r| dhosts.delete(r)}
    @noresponsefrom = dhosts
rescue
    @totaltime = 0
    @noresponsefrom = []
end
no_response_report() click to toggle source

Returns a blob of text indicating what nodes did not respond

# File lib/mcollective/rpc/stats.rb, line 167
def no_response_report
    result_text = []

    if @noresponsefrom.size > 0
        result_text << Helpers.colorize(:red, "\nNo response from:\n")

        @noresponsefrom.each_with_index do |c,i|
            result_text << "" if i % 4 == 0
            result_text << "%30s" % [c]
        end

        result_text << ""
    end

    result_text.join("\n")
end
node_responded(node) click to toggle source

Helper to keep track of who we received responses from

# File lib/mcollective/rpc/stats.rb, line 121
def node_responded(node)
    @responsesfrom << node
rescue
    @responsesfrom = [node]
end
ok() click to toggle source

increment the count of ok hosts

# File lib/mcollective/rpc/stats.rb, line 51
def ok
    @okcount += 1
rescue
    @okcount = 1
end
report(caption = "rpc stats", verbose = false) click to toggle source

Returns a blob of text representing the request status based on the stats contained in this class

# File lib/mcollective/rpc/stats.rb, line 129
def report(caption = "rpc stats", verbose = false)
    result_text = []

    if verbose
        result_text << Helpers.colorize(:yellow, "---- #{caption} ----")

        if @discovered
            @responses < @discovered ? color = :red : color = :reset
            result_text << "           Nodes: %s / %s" % [ Helpers.colorize(color, @discovered), Helpers.colorize(color, @responses) ]
        else
            result_text << "           Nodes: #{@responses}"
        end

        @failcount < 0 ? color = :red : color = :reset

        result_text << "     Pass / Fail: %s / %s" % [Helpers.colorize(color, @okcount), Helpers.colorize(color, @failcount) ]
        result_text << "      Start Time: %s"      % [Time.at(@starttime)]
        result_text << "  Discovery Time: %.2fms"  % [@discoverytime * 1000]
        result_text << "      Agent Time: %.2fms"  % [@blocktime * 1000]
        result_text << "      Total Time: %.2fms"  % [@totaltime * 1000]
    else
        if @discovered
            @responses < @discovered ? color = :red : color = :green

            result_text << "Finished processing %s / %s hosts in %.2f ms" % [Helpers.colorize(color, @responses), Helpers.colorize(color, @discovered), @blocktime * 1000]
        else
            result_text << "Finished processing %s hosts in %.2f ms" % [Helpers.colorize(:bold, @responses), @blocktime * 1000]
        end
    end

    if no_response_report != ""
        result_text << "" << no_response_report
    end

    result_text.join("\n")
end
reset() click to toggle source

Resets stats, if discovery time is set we keep it as it was

# File lib/mcollective/rpc/stats.rb, line 13
def reset
    @noresponsefrom = []
    @responsesfrom = []
    @responses = 0
    @starttime = Time.now.to_f
    @discoverytime = 0 unless @discoverytime
    @blocktime = 0
    @totaltime = 0
    @discovered = 0
    @discovered_nodes = []
    @okcount = 0
    @failcount = 0
    @noresponsefrom = []
end
time_block_execution(action) click to toggle source

helper to time block execution time

# File lib/mcollective/rpc/stats.rb, line 88
def time_block_execution(action)
    if action == :start
        @block_start = Time.now.to_f
    elsif action == :end
        @blocktime += Time.now.to_f - @block_start
    else
        raise("Uknown block action #{action}")
    end
rescue
    @blocktime = 0
end
time_discovery(action) click to toggle source

Utility to time discovery from :start to :end

# File lib/mcollective/rpc/stats.rb, line 75
def time_discovery(action)
    if action == :start
        @discovery_start = Time.now.to_f
    elsif action == :end
        @discoverytime = Time.now.to_f - @discovery_start
    else
        raise("Uknown discovery action #{action}")
    end
rescue
    @discoverytime = 0
end
to_hash() click to toggle source

returns a hash of our stats

# File lib/mcollective/rpc/stats.rb, line 29
def to_hash
    {:noresponsefrom   => @noresponsefrom,
     :starttime        => @starttime,
     :discoverytime    => @discoverytime,
     :blocktime        => @blocktime,
     :responses        => @responses,
     :totaltime        => @totaltime,
     :discovered       => @discovered,
     :discovered_nodes => @discovered_nodes,
     :noresponsefrom   => @noresponsefrom,
     :okcount          => @okcount,
     :failcount        => @failcount}
end