Status

Row

general

bigmem

gpu

Row

CPU Usage

GPU Usage

Memory (GB) Usage

Queue Status

Row

Queue History

Row

% Usage History

Row

CPU Usage Summary

GPU Usage Summary

Summary

Row

Usage

Row

Running Jobs

Row

Pending Jobs

general

Row

total usage

cpu usage per node

memory usage per node

Row

Running Jobs

Row

Pending Jobs

bigmem

Row

total usage

cpu usage per node

memory usage per node

Row

Running Jobs

Row

Pending Jobs

gpu

Row

total usage

cpu usage per node

gpu usage per node

memory usage per node

Row

Running Jobs

Row

Pending Jobs

Node Status

Row

Today

Row

Summary

Row

QOS Summary

Row

Yesterday

Row

Summary

Row

QOS Summary

Row

This Month

Row

Summary

Row

QOS Summary

Row

This Year

Row

Summary

Row

QOS Summary

Row

---
title: "HPC Monitoring"
date: '`r format(Sys.time(), "%m/%d/%y %X")`'
output:
  flexdashboard::flex_dashboard:
    orientation: rows
    vertical_layout: scroll
    source: embed
    smart: false
    navbar: 
      - { title: "NJIT HPC", href: "https://hpc.njit.edu"}
---

<style>
.navbar {
    background-color:#cc0000;
}
.navbar-brand {
    color:white!important;
}
.navbar-inverse .navbar-nav>.active>a, .navbar-inverse .navbar-nav>.active>a:hover, .navbar-inverse .navbar-nav>.active>a:focus {
    color: #ffffff;
    background-color: #1c1475;
    font-weight: 900;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
    background-color: #1c1475;
    color: white;
}
</style>

```{r setup, include=F}
library(flexdashboard)
library(tidyverse)
library(lubridate)
library(dygraphs)
library(reshape2)
library(stringr)
library(plotly)
library(knitr)
library(xts)
library(DT)
options(DT.options = list(dom = 'ltip', pageLength = 10, lengthMenu = c(10, 100, 500, 1000), autoWidth = TRUE) )

node_load <- read_delim('load.csv',delim=";") 
colnames(node_load) <- c("Nodes","Partition","CPUs","Load","Available Memory","Free Memory")
queue_status <- read_delim('queue.csv',delim=";" )
colnames(queue_status) =  c("Job ID","Partition","Job Name","User","Allocation","State",
   "Elapsed Time","Start Time","Submit Time","Time Requested","CPUs Requested",
   "Nodes Requested","Memory/Core Requested","Nodelist","Reason","Priority","GPUs","QOS")
queue_status <- as_tibble(lapply(queue_status,trimws)) %>% mutate_at(c(1,11,12,16),as.integer)
#jobs_now <- as_tibble(lapply(queue_status,trimws)) %>% group_by(State) %>% summarize(Jobs=n()) %>% mutate(Time=now()) %>% spread(State,Jobs)
# If no PENDING jobs, then make sure that PENDING is added to jobs_now
tmp1 <- as_tibble(lapply(queue_status,trimws)) %>% group_by(State) %>% summarize(Jobs=n()) %>% mutate(Time=now()) %>% spread(State,Jobs)
tmp2 <- tibble(Time=tmp1$Time,PENDING=0,RUNNING=0)
jobs_now <- rbind(tmp1,tmp2) %>% group_by(Time) %>% summarize(PENDING=sum(PENDING),RUNNING=sum(RUNNING))
write_delim(jobs_now, gzfile('jobshistory.csv.gz'),delim=";", append = TRUE)
jobshistory <- read_delim('jobshistory.csv.gz',delim=";") %>% filter(Time >= today() %m-% months(12))

node_load %>% 
  separate(CPUs, c("Allocated","Idle","Drained","Total"),sep='/',convert=TRUE) -> clean_nodeload

clean_nodeload %>% 
  group_by(Partition=trimws(Partition)) %>%
  summarize(
    Nodes = sum(n()),
    Cores = sum(as.numeric(Total)), 
    Load = sum(as.numeric(Load)),
    Consumed = sum(as.numeric(Allocated)),
    Idle = sum(as.numeric(Idle)),
    Drained = sum(as.numeric(Drained)),
    Memory = sum(round(as.numeric(`Available Memory`),0)),
    Free_Memory = sum(round(as.numeric(`Free Memory`),0))
  ) %>% 
  mutate(
    Used=round(Consumed/Cores*100,2),
    Available=round(Idle/Cores*100,2),
    Unavailable=round(Drained/Cores*100,2)
  ) -> Wulver


info <-  read_delim('gpuinfo.csv',delim=";",trim_ws=TRUE)
load <-  read_delim('gpuload.csv',delim=";",trim_ws=TRUE) %>% drop_na()
colnames(info) <- c('Node','Partition','Available')
colnames(load) <- c('Node','Partition','GPU')
load %>% group_by(Node,Partition) %>% summarize(Usage=sum(as.double(GPU))) %>% drop_na()  -> usage
full_join(info,usage) -> gpuload
gpuload[is.na(gpuload)] <- 0

gpu_usage <- sum(gpuload$Usage)/sum(info$Available)*100
cpu_usage <- sum(clean_nodeload$Allocated)/sum(clean_nodeload$Total)*100
cpugpu_usage <- as.tibble(cbind(CPU=cpu_usage,GPU=gpu_usage)) %>% mutate(Time=now()) %>% select(c(Time,CPU,GPU))
#gpu_now <- gpuload %>% summarize(Usage=sum(Usage)/gpu_total*100) %>% mutate(Time=now(),) %>% select(c(Time,Usage))
write_delim(cpugpu_usage, gzfile('cpugpuhistory.csv.gz'),delim=";", append = TRUE)
gpuhistory <- read_delim('cpugpuhistory.csv.gz',delim=";") %>% filter(Time >= today() - months(12))
```


Status
====================================

Row {data-height=240}
-----------------------------------

```{r include=F}
general <- Wulver %>% filter(Partition=="general") 
bigmem <- Wulver %>% filter(Partition=="bigmem") 
gpu <- Wulver %>% filter(Partition=="gpu") 
```

### general

```{r}
gauge(round(general$Used), min = 0, max = 100, symbol = '%', gaugeSectors(colors = c('red')), href="#general-1")
```

### bigmem

```{r}
gauge(round(bigmem$Used), min = 0, max = 100, symbol = '%', gaugeSectors(colors = c('red')), href="#bigmem-1")
```

### gpu


```{r}
gauge(round(gpu$Used), min = 0, max = 100, symbol = '%', gaugeSectors(colors = c('red')), href="#gpu-1")
```


Row
----------------------------------------------------------

### CPU Usage

```{r}
colors = c('#d62728','#2ca02c','#000000')
Wulver %>%
  select(c("Consumed","Idle","Drained")) %>%
  summarize(Used = sum(Consumed), Available=sum(Idle), Drained=sum(Drained)) %>%
  mutate(Cluster="Wulver") %>%
  melt(id='Cluster') %>%
  plot_ly(labels = ~ variable, values = ~value, type = "pie", 
    marker = list(colors = colors ))
```

### GPU Usage

```{r}
gpuload %>%
  mutate(Idle=(Available-Usage)) %>% 
  summarize(Used=sum(Usage),Idle=sum(Idle)) %>% 
  mutate(Cluster='Wulver') %>% 
  melt(id='Cluster') %>%
  plot_ly(labels = ~ variable, values = ~value, type = "pie",
    marker = list(colors = colors ))
```

### Memory (GB) Usage

```{r}
Wulver %>% 
  select(c("Memory","Free_Memory")) %>%
  summarize(Total=round(sum(Memory)/1000),Free=round(sum(Free_Memory)/1000)) %>%
  mutate(Cluster="Wulver",Used=round(Total-Free)) %>% select(c(Cluster,Used,Free)) %>%
  melt(id='Cluster') %>%
  plot_ly(labels = ~ variable, values = ~value, type = "pie", 
    marker = list( colors = colors))
```


### Queue Status

```{r}
queue_status %>%
  group_by(State) %>%
  summarize(Jobs=n()) %>%
  plot_ly(labels = ~ State, values = ~ Jobs, type = "pie" )
```

Row
-------------------------------------------------------------------

### Queue History

```{r}
queuehist <- cbind(jobshistory$RUNNING,jobshistory$PENDING) 
colnames(queuehist) <- c("Running","Pending")
dateWindow = c(as.POSIXct(today() - 7 ), now())
dygraph( xts( queuehist, order.by = jobshistory$Time) ) %>% 
  dyOptions(stackedGraph = TRUE) %>%
  dyRangeSelector(height = 20, dateWindow = dateWindow)
```

Row
-------------------------------------------------------------------

### % Usage History

```{r}
dateWindow = c(as.POSIXct(today() - 7 ), now())
dygraph( xts( gpuhistory, order.by = gpuhistory$Time) ) %>%
  dyAxis("y", valueRange = c(0, 105)) %>%
  dyOptions(stackedGraph = FALSE) %>%
  dyRangeSelector(height = 20, dateWindow = dateWindow)
```

Row 
--------------------------------------------------------------------

### CPU Usage Summary

```{r}
Wulver %>% plot_ly(x = ~Partition, y = ~Used, name="% Used", type = "bar", marker = list(color = colors[1])) %>%
  add_trace(y = ~Available, name="% Available", marker = list(color = colors[2])) %>%
  add_trace(y = ~Unavailable, name="% Unavailable", marker = list(color = colors[3])) %>%
  layout(yaxis = list(title = '% CPU Usage' ), xaxis = list(title = 'Partition' ), barmode = 'stack')
```


### GPU Usage Summary

```{r}
gpuload %>% 
  group_by(Partition) %>% 
  summarize(
    Available=sum(Available),
    Used=sum(Usage)
  ) %>% 
  mutate(Free=round(Available-Used)) %>%
  select(c(Partition,Used,Free)) %>%
  plot_ly(x = ~Partition, y = ~Used, name="Used", type = "bar", marker = list(color = colors[1])) %>%
  add_trace(y = ~Free, name="Available", marker = list(color = colors[2])) %>%
  layout(yaxis = list(title = 'GPU Usage' ), xaxis = list(title = 'Partition' ), barmode = 'stack')
```


Summary
====================================

Row {data-height=200}
-----------------------------------

### Usage

```{r}
Wulver %>% datatable(rowname=FALSE, options = list(dom = 't', pageLength = 25, autoWidth = TRUE),
  colnames = c("Partition","Total Nodes","Total Cores","Current Load",
    "Cores Consumed","Cores Idle","Cores Drained",
    "Total Memory","Free Memory","% Used","% Available", "% Unavailable"))
```


Row {data-height=800}
-------------------------------------------------------------------

### Running Jobs

```{r}
queue_status %>% 
  filter(State=="RUNNING") %>% select(-c(State,Reason,GPUs)) %>%
  datatable(filter = 'top' )
```

Row {data-height=800}
-------------------------------------------------


### Pending Jobs

```{r}
queue_status %>% 
  filter(State=="PENDING") %>% select(-c(State,`Elapsed Time`,Nodelist)) %>%
  datatable(filter = 'top')
```



general {data-navmenu="Partitions"}
===================================


Row 
--------------------------------------------------------------------

### total usage 

```{r}
Wulver %>% 
  filter(Partition=="general") %>% 
  select(c("Partition","Consumed","Idle","Drained")) %>% 
  melt(id='Partition') %>% 
  plot_ly(labels = ~ variable, values = ~value, type = "pie",
    marker = list(colors = colors ) )
```


### cpu usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="general") %>%
  plot_ly(y = ~Nodes, x = ~Allocated, name = "Used", type = "bar", marker = list( color = colors[1]) ) %>%
  add_trace(x = ~Idle, name = "Idle", marker = list( color = colors[2]) ) %>%
  add_trace(x = ~Drained, name = "Drained", marker = list( color = colors[3])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Cores', dtick = 32 ), barmode = 'stack')
```

### memory usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="general") %>%
  mutate(Total=as.numeric(`Available Memory`)/1000,
  Free=as.numeric(`Free Memory`)/1000) %>%
  plot_ly(y = ~Nodes, x = ~ Free, name = "Available", type = "bar", marker = list( color = colors[2])) %>%
  add_trace(x = ~ (Total-Free), name = "Used", marker = list( color = colors[1])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Memory (GB)', dtick = 128 ), barmode = 'stack')
```

Row {data-height=800} 
-------------------------------------------------------------------

### Running Jobs

```{r}
queue_status %>% 
  filter(Partition=="general" & State=="RUNNING") %>% select(-c(Partition,State,Reason,Priority)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```

Row {data-height=800} 
-------------------------------------------------------------------

### Pending Jobs

```{r}
queue_status %>% 
  filter(Partition=="general" & State=="PENDING") %>% select(-c(Partition,State,`Elapsed Time`,Nodelist)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```


bigmem {data-navmenu="Partitions"}
===================================


Row 
--------------------------------------------------------------------

### total usage 

```{r}
Wulver %>% 
  filter(Partition=="bigmem") %>% 
  select(c("Partition","Consumed","Idle","Drained")) %>% 
  melt(id='Partition') %>% 
  plot_ly(labels = ~ variable, values = ~value, type = "pie",
    marker = list(colors = colors ) )
```


### cpu usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="bigmem") %>%
  plot_ly(y = ~Nodes, x = ~Allocated, name = "Used", type = "bar", marker = list( color = colors[1]) ) %>%
  add_trace(x = ~Idle, name = "Idle", marker = list( color = colors[2]) ) %>%
  add_trace(x = ~Drained, name = "Drained", marker = list( color = colors[3])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Cores', dtick = 32 ), barmode = 'stack')
```

### memory usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="bigmem") %>%
  mutate(Total=as.numeric(`Available Memory`)/1000,
  Free=as.numeric(`Free Memory`)/1000) %>%
  plot_ly(y = ~Nodes, x = ~ Free, name = "Available", type = "bar", marker = list( color = colors[2])) %>%
  add_trace(x = ~ (Total-Free), name = "Used", marker = list( color = colors[1])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Memory (GB)', dtick = 512 ), barmode = 'stack')
```

Row {data-height=800} 
-------------------------------------------------------------------

### Running Jobs

```{r}
queue_status %>% 
  filter(Partition=="bigmem" & State=="RUNNING") %>% select(-c(Partition,State,Reason,Priority)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```

Row {data-height=800} 
-------------------------------------------------------------------

### Pending Jobs

```{r}
queue_status %>% 
  filter(Partition=="bigmem" & State=="PENDING") %>% select(-c(Partition,State,`Elapsed Time`,Nodelist)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```


gpu {data-navmenu="Partitions"}
===================================


Row 
--------------------------------------------------------------------

### total usage 

```{r}
Wulver %>% 
  filter(Partition=="gpu") %>% 
  select(c("Partition","Consumed","Idle","Drained")) %>% 
  melt(id='Partition') %>% 
  plot_ly(labels = ~ variable, values = ~value, type = "pie",
    marker = list(colors = colors ) )
```


### cpu usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="gpu") %>%
  plot_ly(y = ~Nodes, x = ~Allocated, name = "Used", type = "bar", marker = list( color = colors[1]) ) %>%
  add_trace(x = ~Idle, name = "Idle", marker = list( color = colors[2]) ) %>%
  add_trace(x = ~Drained, name = "Drained", marker = list( color = colors[3])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Cores', dtick = 32 ), barmode = 'stack')
```

### gpu usage per node

```{r}
gpuload %>% filter(str_detect(Partition,"gpu")) %>%
  mutate(Idle=(Available-Usage)) %>%
  plot_ly(y = ~Node, x = ~Usage, name = "Used", type = "bar", marker = list( color = colors[1]) ) %>%
  add_trace(x = ~Idle, name = "Available", marker = list( color = colors[2]) ) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'GPUs', dtick = 1 ), barmode = 'stack')
```



### memory usage per node

```{r}
clean_nodeload %>% filter(trimws(Partition)=="gpu") %>%
  mutate(Total=as.numeric(`Available Memory`)/1000,
    Free=as.numeric(`Free Memory`)/1000) %>%
  plot_ly(y = ~Nodes, x = ~ Free, name = "Available", type = "bar", marker = list( color = colors[2])) %>%
  add_trace(x = ~ (Total-Free), name = "Used", marker = list( color = colors[1])) %>%
  layout(yaxis = list(title = '' ), xaxis = list(title = 'Memory (GB)', dtick = 128 ), barmode = 'stack')
```

Row {data-height=800} 
-------------------------------------------------------------------

### Running Jobs

```{r}
queue_status %>% 
  filter(Partition=="gpu" & State=="RUNNING") %>% select(-c(Partition,State,Reason,Priority)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```

Row {data-height=800} 
-------------------------------------------------


### Pending Jobs

```{r}
queue_status %>% 
  filter(Partition=="gpu" & State=="PENDING") %>% select(-c(Partition,State,`Elapsed Time`,Nodelist)) %>%
  datatable(filter = 'top', options = list(pageLength = 100))
```



Node Status
============================

Row {data-height=800}  
----------------------------------------

```{r}
#purrr::modify_if(clean_nodeload, is.character, trimws) %>%
clean_nodeload %>% 
  mutate(`Available Memory`=round(as.numeric(`Available Memory`)/1000),
     `Free Memory`=round(as.numeric(`Free Memory`)/1000)) %>%
  datatable(filter = 'top', options = list(pageLength = 200, dom = 't'))
```

Today {data-navmenu="Jobs Completed"}
==============================
Row
---------------------------------

### Summary

```{r echo=F}
jobstoday <- read_delim('jobs.csv',delim=";") %>% select(c(JobID:End)) 
jobstoday %>% 
  group_by(Partition) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobstoday %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ Partition) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various Partitions')
    )
  )
```

Row
---------------------------------

### QOS Summary

```{r echo=F}
jobstoday %>% 
  group_by(QOS) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobstoday %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ QOS) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various QOS')
    )
  )
```


Row {data-height=800} 
----------------------------------

```{r echo=F}
jobstoday %>%
  mutate(`Wait Time (min)`=round(difftime(Start,Submit,units="mins"),2),
    `Run Time (min)`=round(difftime(End,Start,units="mins"),2)) %>%
  select(-c(Start,Submit,End)) %>%
  datatable(filter = 'top', extensions = 'Scroller', 
    options = list(
      dom = 't',
      pageLength = 1000, 
      autoWidth = TRUE,
      deferRender = TRUE
    )
  )
```

Yesterday {data-navmenu="Jobs Completed"}
==============================
Row
---------------------------------

### Summary

```{r echo=F}
jobsyesterday <- read_delim('jobs-1.csv',delim=";") %>% select(c(JobID:End))
jobsyesterday %>% 
  group_by(Partition) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobsyesterday %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ Partition) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various Partitions')
    )
  )
```

Row
---------------------------------

### QOS Summary

```{r echo=F}
jobsyesterday %>% 
  group_by(QOS) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobsyesterday %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 1) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ QOS) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various QOS')
    )
  )
```


Row {data-height=800} 
----------------------------------

```{r echo=F}
jobsyesterday %>%
  mutate(`Wait Time (min)`=round(difftime(Start,Submit,units="mins"),2),
    `Run Time (min)`=round(difftime(End,Start,units="mins"),2)) %>%
  select(-c(Start,Submit,End)) %>%
  datatable(filter = 'top', extensions = 'Scroller', 
    options = list(
      dom = 't',
      pageLength = 1000, 
      autoWidth = TRUE,
      deferRender = TRUE
    )
  )
#  datatable(filter = 'top', options = list(pageLength = 1000))
```

This Month {data-navmenu="Jobs Completed"}
==============================

Row 
---------------------------------

### Summary

```{r echo=F}
jobsthismonth <- read_delim('jobs-0.csv',delim=";") %>% select(c(JobID:End))
jobsthismonth %>% 
  group_by(Partition) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  drop_na() %>% 
  mutate_at(c("WaitTime","RunTime"), str_replace, " mins", "") %>% 
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
  )  -> Timing_Part
jobsthismonth %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  drop_na() %>% 
  mutate_at(c("WaitTime","RunTime"), str_replace, " mins", "") %>% 
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ Partition) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various Partitions')
    )
  )
```

Row
---------------------------------


### QOS Summary

```{r echo=F}
jobsthismonth %>% 
  group_by(QOS) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 1) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobsthismonth %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ QOS) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various QOS')
    )
  )
```



Row {data-height=800} 
----------------------------------

```{r echo=F}
#jobsthismonth %>%
#  mutate(`Wait Time (min)`=round(difftime(Start,Submit,units="mins"),2),
#    `Run Time (min)`=round(difftime(End,Start,units="mins"),2)) %>%
#  select(-c(Start,Submit,End)) %>%
#  datatable(filter = 'top', options = list(pageLength = 1000))
```



This Year {data-navmenu="Jobs Completed"}
==============================

Row 
---------------------------------

### Summary

```{r echo=F}
jobsthisyear <- read_delim('jobsalloc.csv.gz',delim=";") %>% select(c(JobID:End))
jobsthisyear <- rbind(jobsthisyear,jobsthismonth)
jobsthisyear %>% 
  group_by(Partition) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 0) %>%
  drop_na() %>% 
  mutate_at(c("WaitTime","RunTime"), str_replace, " mins", "") %>% 
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
  )  -> Timing_Part
jobsthisyear %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  drop_na() %>% 
  mutate_at(c("WaitTime","RunTime"), str_replace, " mins", "") %>% 
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ Partition) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various Partitions')
    )
  )
```

Row
---------------------------------


### QOS Summary

```{r echo=F}
jobsthisyear %>% 
  group_by(QOS) %>% 
  select(c(NCPUS,Start,Submit,End)) %>% 
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>% 
  filter(as.numeric(RunTime) > 1) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Part
jobsthisyear %>% 
  select(c(NCPUS,Start,Submit,End)) %>%
  mutate(WaitTime=round(difftime(Start,Submit,units="mins"),2),
    RunTime=round(difftime(End,Start,units="mins"),2)) %>%
  filter(as.numeric(RunTime) > 0) %>%
  summarize(
    Wait=round(mean(as.numeric(WaitTime)),2),
    Run=round(mean(as.numeric(RunTime)),2),
    Jobs=n(),
    CPUs=round(mean(as.numeric(NCPUS)))
   ) -> Timing_Total
full_join(Timing_Part,Timing_Total) -> Timing
Timing[is.na(Timing)] <- "Total"

Timing %>% melt()  %>% dcast(variable ~ QOS) %>%
  rename(" " = variable) %>%
  datatable(
    rownames = FALSE,
    options = list(dom = 't'),
    caption = htmltools::tags$caption(
      style = 'caption-side: top; text-align: center;',
      htmltools::strong('Average Wait and Run Time in mins for various QOS')
    )
  )
```



Row {data-height=800} 
----------------------------------

```{r echo=F}
#jobsthisyear %>%
#  mutate(`Wait Time (min)`=round(difftime(Start,Submit,units="mins"),2),
#    `Run Time (min)`=round(difftime(End,Start,units="mins"),2)) %>%
#  select(-c(Start,Submit,End)) %>%
#  datatable(filter = 'top', options = list(pageLength = 1000))
```