Skip to content

Commit

Permalink
Updated efficiency look and feel to highlight values
Browse files Browse the repository at this point in the history
  • Loading branch information
abujeda committed Nov 15, 2024
1 parent 51fdb12 commit dc203f9
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 58 deletions.
16 changes: 13 additions & 3 deletions dev/metrics/lib/slurm_metrics/metrics_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,21 @@ def efficiency_class(efficiency_value)
return 'bg-primary' if efficiency_value.nil?

if efficiency_value > 74
return "bg-success"
return 'bg-success'
elsif efficiency_value < 25
return "bg-danger"
return 'bg-danger'
else
return "bg-warning"
return 'bg-warning'
end
end

def efficiency_icon(efficiency_value)
if efficiency_value > 74
return '<i class="fa fa-check-circle fa-fw text-success" title="Good efficiency"></i>'
elsif efficiency_value < 25
return '<i class="fa fa-times-circle fa-fw text-danger" title="Bad efficiency, consider adjusting the parameter values"></i>'
else
return '<i class="fa fa-exclamation-circle fa-fw text-warning" title="Medium efficiency, consider adjusting the parameter values"></i>'
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
<%= render_card_partial('support_ticket', session) if Configuration.support_ticket_enabled? %>
<%= render_card_partial('display_choices', session) %>
<%= render_card_partial('session_job_metrics', session) if session.completed?%>
<%= render_card_partial('custom_info_view', session) if session.app.session_info_view %>
<%= render_card_partial('completed_view', session) if session.app.session_completed_view && session.completed? %>
<%= render_connection(session) %>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<style>

table.metrics th {
font-size: 0.9rem;
}
table.metrics td {
font-size: 0.8rem;
}

.job-metrics i.app-icon {
width: 0.8rem;
height: 0.8rem;
font-size: 0.8rem;
vertical-align: 1px;
color: #6c757d;
}

div.job-metric-details {
overflow: hidden;
}

div.job-metric-details [title]{
cursor: default;
}

div.job-metric-details table {
margin-top: 0.5rem;
}

div.job-metric-details .text-dark {
--bs-text-opacity: 0.8;
}

p.job-metrics-description {
cursor: pointer;
margin: 0;
}

p[aria-expanded=true] .closed {
display: none;
}

p[aria-expanded=false] .open {
display: none;
}

</style>
<script>
// TESTED WITH OOD 3.x and 4.0
// OVERRIDE OOD replaceHTML FUNCTION TO INTERCEPT THE AJAX RESPONSE FOR THE SESSION CARDS.
// WE WANT TO KEEP THE METRICS COLLAPSABLE STATE BETWEEN AJAX REFRESH
const originalFunction = window.replaceHTML;
const metricsCollapseState = {};

window.replaceHTML = function(id, html) {
const ele = document.getElementById(id);

if(ele == null) {
return;
}

const tmp = document.createElement('div');
tmp.innerHTML = html;
const sessionCards = tmp.querySelector('template');

// UPDATE COLLAPSABLE ITEMS
sessionCards.content.querySelectorAll('.job-metric-details .collapse').forEach((element) => {
const jobMetricsId = element.dataset.sessionId;
const isOpen = metricsCollapseState[jobMetricsId];

if (isOpen) {
element.classList.remove('collapse');
element.classList.add('show');
}
});

// UPDATE BUTTONS
sessionCards.content.querySelectorAll('.job-metrics-description').forEach((element) => {
const jobMetricsId = element.dataset.sessionId;
const isOpen = metricsCollapseState[jobMetricsId];

if (isOpen) {
element.setAttribute('aria-expanded', 'true');
}
});

const updatedSessionCards = sessionCards.innerHTML;
tmp.remove();

setInnerHTML(ele, updatedSessionCards);
};

// LISTEN TO BOOTSTRAP COLLAPSABLE OPEN AND CLOSE EVENTS
jQuery(function (){
$('#batch_connect_sessions').on('hide.bs.collapse', function (element) {
// ENSURE IS ONE OF THE METRICS COLLAPSABLE
if (element.target.dataset.sessionId) {
metricsCollapseState[element.target.dataset.sessionId] = false;
}
})

$('#batch_connect_sessions').on('show.bs.collapse', function (element) {
// ENSURE IS ONE OF THE METRICS COLLAPSABLE
if (element.target.dataset.sessionId) {
metricsCollapseState[element.target.dataset.sessionId] = true;
}
})
});

</script>
Original file line number Diff line number Diff line change
@@ -1,61 +1,12 @@
<%

metrics_service = SlurmMetrics::MetricsService.new
job_metrics = metrics_service.read_job_metrics(session)
metrics_helper = SlurmMetrics::MetricsHelper.new
metric_details_id = "#{session.id}_metric"
metric_details_id = "m_#{session.id}"
%>

<style>

table.metrics th {
font-size: 0.9rem;
}
table.metrics td {
font-size: 0.8rem;
}

.job-metrics i.app-icon {
width: 0.8rem;
height: 0.8rem;
font-size: 0.8rem;
vertical-align: 1px;
color: #6c757d;
}

div.job-metric-details {
overflow: hidden;
}

div.job-metric-details [title]{
cursor: default;
}

div.job-metric-details table {
margin-top: 0.5rem;
}

div.job-metric-details .text-dark {
--bs-text-opacity: 0.8;
}

p.job-metrics-description {
cursor: pointer;
margin: 0;
}

p[aria-expanded=true] .closed {
display: none;
}

p[aria-expanded=false] .open {
display: none;
}

</style>
<hr>
<div class="job-metrics">
<p class="job-metrics-description" data-toggle="collapse" data-target="#<%= metric_details_id %>" data-bs-toggle="collapse" data-bs-target="#<%= metric_details_id %>" aria-expanded="false">
<p class="job-metrics-description" data-toggle="collapse" data-target="#<%= metric_details_id %>" data-bs-toggle="collapse" data-bs-target="#<%= metric_details_id %>" data-session-id="<%= session.id %>" aria-expanded="false">
<i class="fa fa-plus fa-fw app-icon closed" aria-hidden="true"></i>
<i class="fa fa-minus fa-fw app-icon open" aria-hidden="true"></i>
<strong>Job Efficiency: </strong>
Expand All @@ -67,7 +18,7 @@
</p>

<div class="job-metric-details">
<div id="<%= metric_details_id %>" class="collapse">
<div id="<%= metric_details_id %>" class="collapse" data-session-id="<%= session.id %>">

<table class="table table-sm table-striped table-condensed metrics">
<thead>
Expand All @@ -82,21 +33,21 @@
<tbody>
<tr>
<td>CPU</td>
<td><%= "#{job_metrics.ave_cpu_eff.ceil(2)}%" %></td>
<td><%= metrics_helper.efficiency_icon(job_metrics.ave_cpu_eff).html_safe %><%= job_metrics.ave_cpu_eff.ceil(2) %>%</td>
<td><%= "#{job_metrics.ave_cpu_req.ceil(2)} CPU Hrs" %></td>
<td><%= "#{job_metrics.ave_cpu_use.ceil(2)} CPU Hrs" %></td>
<td>Walltime <%= "#{job_metrics.tot_cpu_walltime.ceil(2)} CPU Hrs" %></td>
</tr>
<tr>
<td>Memory</td>
<td><%= "#{job_metrics.ave_mem_eff.ceil(2)}%" %></td>
<td><%= metrics_helper.efficiency_icon(job_metrics.ave_mem_eff).html_safe %><%= job_metrics.ave_mem_eff.ceil(2) %>%</td>
<td><%= "#{job_metrics.ave_mem_req.ceil(2)}G" %></td>
<td><%= "#{job_metrics.ave_mem_use.ceil(2)}G" %></td>
<td>N/A</td>
</tr>
<tr>
<td>Time</td>
<td><%= "#{job_metrics.ave_time_eff.ceil(2)}%" %></td>
<td><%= metrics_helper.efficiency_icon(job_metrics.ave_time_eff).html_safe %><%= job_metrics.ave_time_eff.ceil(2) %>%</td>
<td><%= metrics_helper.format_duration(job_metrics.ave_time_req) %></td>
<td><%= metrics_helper.format_duration(job_metrics.ave_time_use) %></td>
<td>Waiting Time <%= metrics_helper.format_duration(job_metrics.ave_wait_time) %></td>
Expand Down
54 changes: 54 additions & 0 deletions dev/metrics/views/batch_connect/sessions/index.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<% content_for :title, "#{t('dashboard.breadcrumbs_my_sessions')} - #{@user_configuration.dashboard_title}" %>
<%-
any_apps = (@sys_app_groups + @usr_app_groups + @dev_app_groups).any?
-%>

<%= javascript_include_tag 'batch_connect_sessions', nonce: true %>

<%= render partial: '/batch_connect/sessions/card/session_card_assets' %>

<%= render partial: 'batch_connect/shared/breadcrumb',
locals: {
links: [
{
text: t('dashboard.breadcrumbs_home'),
href: root_path
},
{
text: t('dashboard.breadcrumbs_my_sessions')
}]
}
%>

<div class="row">
<%- if any_apps -%>
<div class="col-md-3">
<%= render partial: 'batch_connect/shared/saved_settings_menu' %>
<%=
render(
partial: "batch_connect/shared/app_menu",
locals: {
sys_app_groups: @sys_app_groups,
usr_app_groups: @usr_app_groups,
dev_app_groups: @dev_app_groups,
apps_menu_group: @apps_menu_group
}
)
%>
</div>
<div class="col-md-9">
<div id="batch_connect_sessions">
<%= render(partial: 'panels') %>
</div>
</div>
<%- else -%>
<div class="col-md-12">
<div class="ood-appkit markdown">
<p><%= t('dashboard.batch_connect_no_apps') %></p>
</div>
</div>
<%- end -%>
</div>
<div id="full-page-spinner" class="d-none">
<div class="spinner-border" role="status"></div>
</div>

0 comments on commit dc203f9

Please sign in to comment.