def show(args)
options = {}
optparse = Morpheus::Cli::OptionParser.new do |opts|
opts.banner = usage
opts.on('-a', '--details', "Display all details: more instance usage stats, etc" ) do
options[:details] = true
end
build_standard_list_options(opts, options)
opts.footer = <<-EOT
View Morpheus Dashboard.
This includes instance and backup counts, favorite instances, monitoring and recent activity.
EOT
end
optparse.parse!(args)
verify_args!(args:args, optparse:optparse, count:0)
connect(options)
params = {}
params.merge!(parse_list_options(options))
@dashboard_interface.setopts(options)
if options[:dry_run]
print_dry_run @dashboard_interface.dry.get(params)
return
end
json_response = @dashboard_interface.get(params)
render_response(json_response, options) do
print_h1 "Morpheus Dashboard", [], options
status_column_definitions = {
"Instances" => lambda {|it|
format_number(it['instanceStats']['total']) rescue nil
},
"Running" => lambda {|it|
format_number(it['instanceStats']['running']) rescue nil
},
}
print as_description_list(json_response, status_column_definitions, options)
stats = json_response['instanceStats']
if stats
print_h2 "Instance Usage", options
print_stats_usage(stats, {include: [:max_cpu, :avg_cpu, :memory, :storage]})
end
open_incident_count = json_response['monitoring']['openIncidents'] rescue (json_response['appStatus']['openIncidents'] rescue nil)
avg_response_time = json_response['monitoring']['avgResponseTime'] rescue nil
warning_apps = json_response['monitoring']['warningApps'] rescue 0
warning_checks = json_response['monitoring']['warningChecks'] rescue 0
fail_checks = json_response['monitoring']['failChecks'] rescue 0
fail_apps = json_response['monitoring']['failApps'] rescue 0
success_checks = json_response['monitoring']['successChecks'] rescue 0
success_apps = json_response['monitoring']['successApps'] rescue 0
monitoring_status_color = cyan
if fail_checks > 0 || fail_apps > 0
monitoring_status_color = red
elsif warning_checks > 0 || warning_apps > 0
monitoring_status_color = yellow
end
print_h2 "Monitoring"
monitoring_column_definitions = {
"Status" => lambda {|it|
if fail_apps > 0
red + "ERROR" + cyan
elsif warning_apps > 0 || warning_checks > 0
yellow + "WARNING" + cyan
else
cyan + "HEALTHY" + cyan
end
},
"Response Time" => lambda {|it|
(avg_response_time.round).to_s + "ms"
},
"Open Incidents" => lambda {|it|
monitoring_status_color = cyan
if open_incident_count.nil?
yellow + "n/a" + cyan + "\n"
elsif open_incident_count == 0
monitoring_status_color + "0 Open Incidents" + cyan
elsif open_incident_count == 1
monitoring_status_color + "1 Open Incident" + cyan
else
monitoring_status_color + "#{open_incident_count} Open Incidents" + cyan
end
}
}
print as_pretty_table([json_response], monitoring_column_definitions.upcase_keys!, options)
if json_response['logStats'] && json_response['logStats']['data']
log_period_display = "7 Days"
print_h2 "Logs (#{log_period_display})", options
error_log_data = json_response['logStats']['data'].find {|it| it['key'].to_s.upcase == 'ERROR' }
error_count = error_log_data["count"] rescue 0
fatal_log_data = json_response['logStats']['data'].find {|it| it['key'].to_s.upcase == 'FATAL' }
fatal_count = fatal_log_data["count"] rescue 0
total_error_count = error_count + fatal_count
if total_error_count == 0
print cyan + "(0 Errors)" + cyan + "\n"
end
if error_count > 0
if error_log_data["values"]
log_plot = ""
plot_index = 0
error_log_data["values"].each do |k, v|
if v.to_i == 0
log_plot << cyan + v.to_s
else
log_plot << red + v.to_s
end
if plot_index != error_log_data["values"].size - 1
log_plot << cyan + "-"
end
plot_index +=1
end
print log_plot
print " "
if error_count == 0
print cyan + "(0 Errors)" + cyan
elsif error_count == 1
print red + "(1 Errors)" + cyan
else
print red + "(#{error_count} Errors)" + cyan
end
print reset + "\n"
end
end
if fatal_count > 0
if fatal_log_data["values"]
log_plot = ""
plot_index = 0
fatal_log_data["values"].each do |k, v|
if v.to_i == 0
log_plot << cyan + v.to_s
else
log_plot << red + v.to_s
end
if plot_index != fatal_log_data["values"].size - 1
log_plot << cyan + "-"
end
plot_index +=1
end
print log_plot
print " "
if fatal_count == 0
print cyan + "(0 FATAL)" + cyan
elsif fatal_count == 1
print red + "(1 FATAL)" + cyan
else
print red + "(#{fatal_count} FATAL)" + cyan
end
print reset + "\n"
end
end
end
print_h2 "Backups (7 Days)"
backup_status_column_definitions = {
"Successful" => lambda {|it|
it['backups']['accountStats']['lastSevenDays']['successful'] rescue nil
},
"Failed" => lambda {|it|
n = it['backups']['accountStats']['lastSevenDays']['failed'] rescue nil
if n == 0
cyan + n.to_s + reset
else
red + n.to_s + reset
end
}
}
print as_description_list(json_response, backup_status_column_definitions, options)
favorite_instances = json_response["provisioning"]["favoriteInstances"] || [] rescue []
if favorite_instances.empty?
else
print_h2 "My Instances"
favorite_instances_columns = {
"ID" => lambda {|instance|
instance['id']
},
"Name" => lambda {|instance|
instance['name']
},
"Type" => lambda {|instance|
instance['instanceType']['name'] rescue nil
},
"IP/PORT" => lambda {|instance|
format_instance_connection_string(instance)
},
"Status" => lambda {|it| format_instance_status(it) }
}
print as_pretty_table(favorite_instances, favorite_instances_columns, options)
end
activity = json_response["activity"] || json_response["recentActivity"] || []
print_h2 "Recent Activity", [], options
if activity.empty?
print cyan, "No activity found.",reset,"\n"
else
columns = [
{"TYPE" => lambda {|record| record['activityType'] } },
{"NAME" => lambda {|record| record['name'] } },
options[:details] ? {"RESOURCE" => lambda {|record| "#{record['objectType']} #{record['objectId']}" } } : nil,
{"MESSAGE" => lambda {|record| record['message'] || '' } },
{"USER" => lambda {|record| record['user'] ? record['user']['username'] : record['userName'] } },
{"DATE" => lambda {|record|
if params['start'] || params['end'] || params['timeframe'] || options[:details]
"#{format_local_dt(record['ts'] || record['timestamp'])}"
else
"#{format_duration_ago(record['ts'] || record['timestamp'])}"
end
} },
].compact
print as_pretty_table(activity, columns, options)
end
end
print reset,"\n"
return 0, nil
end