| Class | MCollective::RPC::Stats |
| In: |
lib/mcollective/rpc/stats.rb
|
| Parent: | Object |
Class to wrap all the stats and to keep track of some timings
| aggregate_failures | [RW] | |
| aggregate_summary | [RW] | |
| blocktime | [RW] | |
| ddl | [RW] | |
| discovered | [RW] | |
| discovered_nodes | [RW] | |
| discoverytime | [RW] | |
| failcount | [RW] | |
| noresponsefrom | [RW] | |
| noresponsefrom | [RW] | |
| okcount | [RW] | |
| requestid | [RW] | |
| responses | [RW] | |
| responsesfrom | [RW] | |
| starttime | [RW] | |
| totaltime | [RW] |
Fake hash access to keep things backward compatible
# File lib/mcollective/rpc/stats.rb, line 51
51: def [](key)
52: to_hash[key]
53: rescue
54: nil
55: end
Re-initializes the object with stats from the basic client
# File lib/mcollective/rpc/stats.rb, line 72
72: def client_stats=(stats)
73: @noresponsefrom = stats[:noresponsefrom]
74: @responses = stats[:responses]
75: @starttime = stats[:starttime]
76: @blocktime = stats[:blocktime]
77: @totaltime = stats[:totaltime]
78: @requestid = stats[:requestid]
79: @discoverytime = stats[:discoverytime] if @discoverytime == 0
80: end
Update discovered and discovered_nodes based on discovery results
# File lib/mcollective/rpc/stats.rb, line 110
110: def discovered_agents(agents)
111: @discovered_nodes = agents
112: @discovered = agents.size
113: end
increment the count of failed hosts
# File lib/mcollective/rpc/stats.rb, line 65
65: def fail
66: @failcount += 1
67: rescue
68: @failcount = 1
69: end
Helper to calculate total time etc
# File lib/mcollective/rpc/stats.rb, line 116
116: def finish_request
117: @totaltime = @blocktime + @discoverytime
118:
119: # figures out who we had no responses from
120: dhosts = @discovered_nodes.clone
121: @responsesfrom.each {|r| dhosts.delete(r)}
122: @noresponsefrom = dhosts
123: rescue
124: @totaltime = 0
125: @noresponsefrom = []
126: end
Returns a blob of text indicating what nodes did not respond
# File lib/mcollective/rpc/stats.rb, line 237
237: def no_response_report
238: result_text = StringIO.new
239:
240: if @noresponsefrom.size > 0
241: result_text.puts
242: result_text.puts Util.colorize(:red, "No response from:")
243: result_text.puts
244:
245: @noresponsefrom.sort.in_groups_of(3) do |c|
246: result_text.puts " %-30s%-30s%-30s" % c
247: end
248:
249: result_text.puts
250: end
251:
252: result_text.string
253: end
Helper to keep track of who we received responses from
# File lib/mcollective/rpc/stats.rb, line 129
129: def node_responded(node)
130: @responsesfrom << node
131: rescue
132: @responsesfrom = [node]
133: end
Returns a blob of text representing the request status based on the stats contained in this class
# File lib/mcollective/rpc/stats.rb, line 187
187: def report(caption = "rpc stats", summarize = true, verbose = false)
188: result_text = []
189:
190: if verbose
191: if @aggregate_summary.size > 0 && summarize
192: result_text << text_for_aggregates
193: else
194: result_text << ""
195: end
196:
197: result_text << Util.colorize(:yellow, "---- #{caption} ----")
198:
199: if @discovered
200: @responses < @discovered ? color = :red : color = :reset
201: result_text << " Nodes: %s / %s" % [ Util.colorize(color, @discovered), Util.colorize(color, @responses) ]
202: else
203: result_text << " Nodes: #{@responses}"
204: end
205:
206: @failcount < 0 ? color = :red : color = :reset
207:
208: result_text << " Pass / Fail: %s / %s" % [Util.colorize(color, @okcount), Util.colorize(color, @failcount) ]
209: result_text << " Start Time: %s" % [Time.at(@starttime)]
210: result_text << " Discovery Time: %.2fms" % [@discoverytime * 1000]
211: result_text << " Agent Time: %.2fms" % [@blocktime * 1000]
212: result_text << " Total Time: %.2fms" % [@totaltime * 1000]
213: else
214: if @discovered
215: @responses < @discovered ? color = :red : color = :green
216:
217: if @aggregate_summary.size + @aggregate_failures.size > 0 && summarize
218: result_text << text_for_aggregates
219: else
220: result_text << ""
221: end
222:
223: result_text << "Finished processing %s / %s hosts in %.2f ms" % [Util.colorize(color, @responses), Util.colorize(color, @discovered), @blocktime * 1000]
224: else
225: result_text << "Finished processing %s hosts in %.2f ms" % [Util.colorize(:bold, @responses), @blocktime * 1000]
226: end
227: end
228:
229: if no_response_report != ""
230: result_text << "" << no_response_report
231: end
232:
233: result_text.join("\n")
234: end
Resets stats, if discovery time is set we keep it as it was
# File lib/mcollective/rpc/stats.rb, line 14
14: def reset
15: @noresponsefrom = []
16: @responsesfrom = []
17: @responses = 0
18: @starttime = Time.now.to_f
19: @discoverytime = 0 unless @discoverytime
20: @blocktime = 0
21: @totaltime = 0
22: @discovered = 0
23: @discovered_nodes = []
24: @okcount = 0
25: @failcount = 0
26: @noresponsefrom = []
27: @requestid = nil
28: @aggregate_summary = []
29: @aggregate_failures = []
30: end
# File lib/mcollective/rpc/stats.rb, line 135
135: def text_for_aggregates
136: result = StringIO.new
137:
138: @aggregate_summary.each do |aggregate|
139: output_item = aggregate.result[:output]
140:
141: begin
142: action_interface = @ddl.action_interface(aggregate.action)
143: display_as = action_interface[:output][output_item][:display_as]
144: rescue
145: display_as = output_item
146: end
147:
148: if aggregate.is_a?(Aggregate::Result::Base)
149: aggregate_report = aggregate.to_s
150: else
151: next
152: end
153:
154: result.puts Util.colorize(:bold, "Summary of %s:" % display_as)
155: result.puts
156: unless aggregate_report == ""
157: result.puts aggregate.to_s.split("\n").map{|x| " " + x}.join("\n")
158: else
159: result.puts Util.colorize(:yellow, " No aggregate summary could be computed")
160: end
161: result.puts
162: end
163:
164: @aggregate_failures.each do |failed|
165: case(failed[:type])
166: when :startup
167: message = "exception raised while processing startup hook"
168: when :create
169: message = "unspecified output '#{failed[:name]}' for the action"
170: when :process_result
171: message = "exception raised while processing result data"
172: when :summarize
173: message = "exception raised while summarizing"
174: end
175:
176: result.puts Util.colorize(:bold, "Summary of %s:" % failed[:name])
177: result.puts
178: result.puts Util.colorize(:yellow, " Could not compute summary - %s" % message)
179: result.puts
180: end
181:
182: result.string
183: end
helper to time block execution time
# File lib/mcollective/rpc/stats.rb, line 96
96: def time_block_execution(action)
97: if action == :start
98: @block_start = Time.now.to_f
99: elsif action == :end
100: @blocktime += Time.now.to_f - @block_start
101: else
102: raise("Uknown block action #{action}")
103: end
104: rescue
105: @blocktime = 0
106: end
Utility to time discovery from :start to :end
# File lib/mcollective/rpc/stats.rb, line 83
83: def time_discovery(action)
84: if action == :start
85: @discovery_start = Time.now.to_f
86: elsif action == :end
87: @discoverytime = Time.now.to_f - @discovery_start
88: else
89: raise("Uknown discovery action #{action}")
90: end
91: rescue
92: @discoverytime = 0
93: end
returns a hash of our stats
# File lib/mcollective/rpc/stats.rb, line 33
33: def to_hash
34: {:noresponsefrom => @noresponsefrom,
35: :starttime => @starttime,
36: :discoverytime => @discoverytime,
37: :blocktime => @blocktime,
38: :responses => @responses,
39: :totaltime => @totaltime,
40: :discovered => @discovered,
41: :discovered_nodes => @discovered_nodes,
42: :noresponsefrom => @noresponsefrom,
43: :okcount => @okcount,
44: :requestid => @requestid,
45: :failcount => @failcount,
46: :aggregate_summary => @aggregate_summary,
47: :aggregate_failures => @aggregate_failures}
48: end