From e9a26521bbefbd6ccde21224cdf741db08c7a5a2 Mon Sep 17 00:00:00 2001 From: "Steve Nyemba, The Architect" Date: Tue, 16 Oct 2018 13:26:26 -0500 Subject: [PATCH] bug fix with graphical layout --- src/api/templates/dashboard/apps/summary.html | 101 ++++++++++++------ src/utils/charting.py | 4 +- src/utils/ml/analytics.py | 20 +++- 3 files changed, 89 insertions(+), 36 deletions(-) diff --git a/src/api/templates/dashboard/apps/summary.html b/src/api/templates/dashboard/apps/summary.html index 93a1cf5..c2cd796 100644 --- a/src/api/templates/dashboard/apps/summary.html +++ b/src/api/templates/dashboard/apps/summary.html @@ -39,11 +39,12 @@ } .widget .title { - font-size:22px; + font-size:18px; align-items: center; display:grid; grid-template-columns: auto 95px; grid-gap:2px; + min-height:24px; } .widget .chart { display:grid; @@ -102,7 +103,7 @@ .fa-ellipsis-h {color:orange} .fa-times {color:maroon} .fa-folder-open {color:#FF7F24;} - .fa-cog {color:#d3d3d3} + .fa-cog {color:gray} .busy { display:flex ; align-items: center; @@ -127,13 +128,14 @@ // }) {{app_summary|tojson}} var render_grid = function(name){ - var logs = {{app_logs|tojson}} + var logs = {{app_logs|tojson}}[name]['logs'] + var config = {{ app_grid|tojson}} - config.data = logs[name] + config.data = logs config.fields[config.fields.length-1].itemTemplate = function(value,item){ var p = {"X":"fa fa-times","S":"fa fa-ellipsis-h","S+":"fa fa-ellipsis-h","R":"fa fa-check"} var i = jx.dom.get.instance('I') - i.className = p[value] + i.className = p[value] != null? p[value]: 'fa fa-cog fa-spin' return i } var id = '#app_grid_'+name @@ -163,7 +165,7 @@
@@ -182,8 +184,9 @@
-
-

Crash Analysis

+
+
Crash Analysis
+
{{ app_summary[loop.index -1 ].formatted_date }}
@@ -205,19 +208,20 @@
-
-

Resource Usage

+
+
Resource Usage
+
{{ app_summary[loop.index -1 ].formatted_date }}
- Total Resource Usage + Total Resource Usage

- {{session['apps.resource'][loop.index -1].x[0][1] + session['apps.resource'][loop.index -1].x[0][0] }} + {{ (session['apps.resource'][loop.index -1].x[0][1] + session['apps.resource'][loop.index -1].x[0][0]) | round(2) }} %
CPU
@@ -225,7 +229,7 @@
- {{session['apps.resource'][loop.index -1].x[1][0] + session['apps.resource'][loop.index -1].x[1][1]}} + {{ (session['apps.resource'][loop.index -1].x[1][0] + session['apps.resource'][loop.index -1].x[1][1]) | round(2)}} %
@@ -234,26 +238,59 @@
-
-

Folder Analysis

-
- {%for row in folders_summary %} - +
+
Folder Analysis
+
{{ row.formatted_date }}
+
+ {%if row.node == name %} +
+ + +
  • + + Monitoring {{row.folders}} Folder + {% if row.folders > 1%} + s + {% endif %} +
  • +
  • + + + + {% if row.avg_folder_size > 1000 %} + {{ (row.avg_folder_size/1000)|round(2)}} GB + {% else %} + {{ row.avg_folder_size}} MB + {% endif %} + /Folder monitored + +
  • +
  • + + {{row.avg_files_folder}} Files / Folder +
  • + + + +

    +

    +
    The largest folder analysis, provides insight into what the largest folder size is, and if it has reached the archiving threshold. +
    +

    + +
    +
    + Largest Folder +
    +
    -
    -
    {{ row.folders}}
    -
    Folders
    -
    -
    -
    {{ row.files}}
    -
    Files
    -
    + - {% if row.size > 1000 %} + {% if row.max_folder_size > 1000 %}
    -
    {{ (row.size / 1000) | round(2) }}
    +
    {{ (row.max_folder_size / 1000) | round(2) }}
    GB Used
    @@ -262,7 +299,7 @@
    {% else %}
    -
    {{ row.size }}
    +
    {{ row.max_folder_size }}
    MB Used
    @@ -276,7 +313,11 @@ {% endif %} {% if loop.index == nodes|length %} - + {% endif %} {% endfor %}
    diff --git a/src/utils/charting.py b/src/utils/charting.py index db0d2f2..28865ed 100644 --- a/src/utils/charting.py +++ b/src/utils/charting.py @@ -42,7 +42,9 @@ class Graph : def scatter(self,**args): pass class ImageGraphs (Graph) : - + """ + This framework is designed around matplotlib and generates an image that can be downloaded + """ def __init__(self,format,**args) : """ @param width width in pixels diff --git a/src/utils/ml/analytics.py b/src/utils/ml/analytics.py index 04a2039..7870752 100644 --- a/src/utils/ml/analytics.py +++ b/src/utils/ml/analytics.py @@ -20,6 +20,9 @@ class analytics : self.cache['key'] = args['key'] self.cache['name'] = self.__class__.__name__ self.init() + def get_formatted_date(self,row): + m = {1:"Jan",2:"Feb",3:"Mar",4:"Apr",5:"May",6:"Jun",7:"Jul",8:"Aug",9:"Sep",10:"Oct",11:"Nov",12:"Dec"} + return "-".join([m[row['month']],str(row['day']),str(row['year'])]) +" "+ " ".join([str(row['hour']),'h :',str(row['minute']),'min' ]) def init(self): """ Store logs as is per node i.e this enables to see the latest pull @@ -83,7 +86,7 @@ class apps(analytics) : """ analytics.init(self) grid = {"width":"100%","editing":False,"rowClass":"small"} - grid['fields'] = [{"name":"name","title":"Process","headercss":"small"},{"name":"cpu","title":"CPU Usage","headercss":"small","type":"number"},{"name":"mem","title":"RAM Usage","headercss":"small","type":"number"},{"name":"status","title":"Status","headercss":"small","align":"center"}] + grid['fields'] = [{"name":"name","title":"Process","headercss":"small"},{"name":"cpu","title":"CPU Usage","headercss":"small","type":"number"},{"name":"mem","title":"RAM Usage","headercss":"small","type":"number"},{"name":"status","title":"Status","headercss":"small","align":"center","width":"32px"}] self.set('grid',grid) def summary(self,data): @@ -92,15 +95,17 @@ class apps(analytics) : In terms of {crash,idle,running} counts """ r = [] + for node in data : logs = data[node]['logs'] date = data[node]['date']['long'] + formatted_date = self.get_formatted_date(data[node]['date']) df = pd.DataFrame(logs) df = df[df.name.str.contains('other',na=False)==False] crash = df.status.str.contains('X').sum() idle = df.status.str.contains('S').sum() running = df.shape[0] - crash - idle - r.append({"date":date,"node":node,"running":running,"idle":idle,"crash":crash}) + r.append({"date":date,"node":node,"running":running,"idle":idle,"crash":crash,"formatted_date":formatted_date}) return r # logs = pd.DataFrame(self.get('logs')) @@ -137,11 +142,12 @@ class apps(analytics) : X = [[other_df.cpu.sum(),watch_df.cpu.sum()],[other_df.mem.sum(),watch_df.mem.sum()]] date= data[node]['date']['long'] + formatted_date = self.get_formatted_date(data[node]['date']) q.append({"node":node, "x":X,"labels":labels, "title":title,"series":series,"ylabel":ylabel}) crash = watch_df.status.str.contains('X').sum() idle = watch_df.status.str.contains('S').sum() running = N - crash - idle - r.append( {"x":[crash,idle,running],"labels":['Crash','Idle','Running'],"title":"","date":date}) + r.append( {"x":[crash,idle,running],"labels":['Crash','Idle','Running'],"title":"","date":date,"formatted_date":formatted_date}) self.set("resource",q) self.set("status",r) @@ -187,12 +193,16 @@ class folders(analytics): else: max_size = 0 self.set('max_size',max_size) + q = [] for node in data : df = pd.DataFrame(data[node]['logs']) N = df.shape[0] df = pd.DataFrame(df.mean()[['size_in_kb','files','age_in_days']]).T - - r.append({"node":node,"folders":N, "max_size":max_size,"size":np.round(df.size_in_kb.values[0]*.000001,2),"age":df.age_in_days.values[0].round(2),"files":df.files.values[0].round(2)}) + formatted_date = self.get_formatted_date(data[node]['date']) + r.append({"node":node,"folders":N, "max_size":max_size,"max_folder_size":np.round(df.size_in_kb.max()*.000001,2),"avg_folder_size":np.round(df.size_in_kb.mean()*.000001,2),"age":df.age_in_days.values[0].round(2),"avg_files_folder":df.files.max().round(2),"formatted_date":formatted_date}) + X = [[np.round(df.size_in_kb.mean()*.000001,2),np.round(df.size_in_kb.max()*.000001,2)],[df.files.mean().round(2),df.files.max().round(2)]] + q.append({"node":node, "x":X,"labels":['Average','Largest'], "title":"","series":['Size (MB)','Files'],"ylabel":""}) + self.set("analysis",q) return r # for id in logs :