Skip to content
This repository has been archived by the owner on Oct 7, 2020. It is now read-only.

Commit

Permalink
Merge pull request #30 from sergey-dryabzhinsky/container-cpu-usage
Browse files Browse the repository at this point in the history
Container cpu usage
  • Loading branch information
Sergey committed Jun 22, 2013
2 parents f8b3764 + bbb9db1 commit 9f2cd59
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 17 deletions.
28 changes: 22 additions & 6 deletions lwp.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def home():
for container in listx[status]:
item = {
'name': container,
'cpu': lwp.container_cpu_percent(container),
'memusg': lwp.memory_usage(container),
'max_memusg': lwp.max_memory_usage(container),
'settings': lwp.get_container_settings(container)
Expand Down Expand Up @@ -250,6 +251,7 @@ def edit(container=None):
'status': status,
'pid': pid,
'memusg': lwp.memory_usage(container),
'cpu': lwp.container_cpu_percent(container),
'max_memusg': lwp.max_memory_usage(container),
'diskusg': lwp.get_filesystem_usage(container)
}
Expand Down Expand Up @@ -685,12 +687,6 @@ def logout():
return redirect(url_for('login'))


@app.route('/_refresh_cpu_host')
def refresh_cpu_host():
if 'logged_in' in session:
return lwp.host_cpu_percent()


@app.route('/_refresh_uptime_host')
def refresh_uptime_host():
if 'logged_in' in session:
Expand Down Expand Up @@ -749,6 +745,26 @@ def refresh_disk_containers(name=None):
})


@app.route('/_refresh_cpu_<name>')
def refresh_cpu_containers(name=None):
if 'logged_in' in session:
if name == 'containers':
containers_running = lxc.running()
containers = []
for container in containers_running:
container = container.replace(' (auto)', '')
containers.append({
'name': container,
'cpu': lwp.container_cpu_percent(container),
})
return jsonify(data=containers)
elif name == 'host':
return jsonify(lwp.host_cpu_percent())
return jsonify({
'cpu': lwp.container_cpu_percent(name),
})


@app.route('/_get_container_help_<name>')
def _get_container_help(name=None):
if 'logged_in' in session:
Expand Down
15 changes: 15 additions & 0 deletions lwp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,21 @@ def real_ipv4_container(name):
return out


def container_cpu_percent(name):
'''
returns CPU usage in percent
'''
if name in stopped():
return '0'

cmd = ["lxc-ps --name %s -- u | awk 'BEGIN{s=0.0}{s+=$4}END{print s}'" % name]
try:
out = subprocess.check_output(cmd, shell=True)
except:
return '0'
return out


def get_template_help(name):
cmd = ["lxc-create -t %s -h" % name]
try:
Expand Down
15 changes: 15 additions & 0 deletions templates/edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,10 @@ <h3 class="head">{{ container|capitalize }}
{% if infos.status != 'STOPPED' %}
<li><strong>Pid :</strong> {{ infos.pid }}</li>
<li><strong>Network :</strong> {% if settings.flags == 'up' %}<span class="label label-success">Up</span>{% else %}<span class="label label-important">Down</span>{% endif %}</li>
{% if infos.cpu %}<li id="cpu_{{ container }}">
<strong>CPU :</strong> <span class="label label-success">updating...</span>
</li>{% endif %}
{% endif %}
{% if infos.memusg %}<li id="{{ container }}"><strong>Mem. usage :</strong> {{ render_memory_wrapper(infos.memusg, infos.max_memusg) }}</li>{% endif %}
{% if infos.diskusg.total %}<li id="disk_{{ container }}">
<strong>Disk usage :</strong> <span class="label label-success">updating...</span>
Expand Down Expand Up @@ -208,8 +212,19 @@ <h3 class="head">{{ container|capitalize }}
});
}

function refreshCPU(container){
$.getJSON($SCRIPT_ROOT + '/_refresh_cpu_'+container, function(data) {
var el = $('#cpu_'+container+' span');
el.text(data.cpu + ' %');
el[0].className = el[0].className.replace(
/label\-(success|warning|important)/g,
'label-'+percent_color(data.cpu));
});
}

function refresh() {
refreshMemory("{{ container }}");
refreshCPU("{{ container }}");
}

function refreshLong() {
Expand Down
71 changes: 60 additions & 11 deletions templates/index.html
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{% set td = {'running':'success','frozen':'info','stopped':'important'} %}
{% set tr = {'running':'success','frozen':'info','stopped':'error'} %}
{% set disabled = {'running':'success','frozen':'info','stopped':'important'} %}
{% set td = {'RUNNING':'success','FROZEN':'info','STOPPED':'important'} %}
{% set tr = {'RUNNING':'success','FROZEN':'info','STOPPED':'error'} %}
{% set disabled = {'RUNNING':'success','FROZEN':'info','STOPPED':'important'} %}
{% extends "layout.html" %}
{% block title %}Overview{% endblock %}
{% block content %}
<div class="span9">
{{ super() }}
{% if session.su == 'Yes' %}<p class="pull-right" style="margin:10px 10px 0 0;"><a class="btn btn-small btn-danger" data-toggle="modal" data-target="#reboot"><i class="icon-off icon-white"></i> Reboot</a></p>
{% if containers != [] %}<!--p class="pull-right" style="margin:10px 10px 0 0;"><a class="btn btn-small btn-inverse" data-toggle="modal" data-target="#cloneCT"> <i class="icon-repeat icon-white"></i> Clone <abbr title="Container">CT</abbr></a></p-->{% endif %}
{% if containers != [] %}<p class="pull-right" style="margin:10px 10px 0 0;"><a class="btn btn-small btn-inverse" data-toggle="modal" data-target="#cloneCT"> <i class="icon-repeat icon-white"></i> Clone <abbr title="Container">CT</abbr></a></p{% endif %}
<p class="pull-right" style="margin:10px 10px 0 0;"><a class="btn btn-small btn-success" data-toggle="modal" data-target="#createCT"><i class="icon-plus-sign icon-white"></i> Create <abbr title="Container">CT</abbr></a></p>{% endif %}

<div class="hero-unit">
<div id="host-area" class="hero-unit">
{% if dist == 'Unknown' %}<div class="alert alert-error">LXC Web Panel is optimized for Ubuntu 12.10 !</div>{% endif %}
<div class="row">
<div class="span3" style="margin-left:20px;">
Expand All @@ -22,10 +22,11 @@ <h3>{{ dist }} (host)</h3>
<p>Memory usage : <span id="memory-usage" class="hide"></span></p>
<div class="progress" style="width:250px;">
<div class="bar" id="memory-usage-bar" style="width: 0%;"></div>
<abbr title="Cached memory"><div class="bar bar-success" id="memory-cache-usage-bar" style="width: 0%;"></div></abbr>
<abbr title="Cached memory"><span class="bar bar-success" id="memory-cache-usage-bar" style="width: 0%;"></span></abbr>
</div>
</div>
<div class="span3" style="margin-top:29px; margin-left:20px;">
<h3>&nbsp;</h3><!-- Vertical align -->
<p>Disk usage : <span id="disk-usage" class="hide"></span></p>
<div class="progress" style="width:250px;">
<div class="bar" id="disk-usage-bar" style="width: 0%;"></div>
Expand Down Expand Up @@ -54,7 +55,7 @@ <h4>{{ vg.name }}</h4>
</div>
{% endif %}
</div>
<table class="table table-bordered">
<table id="containers-area" class="table table-bordered">
<thead>
</thead>
<tbody>
Expand All @@ -69,6 +70,7 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
<th>Name</th>
<th>Hostname</th>
<th>IP Address</th>
<th>CPU usage</th>
<th>Mem. usage</th>
<th>Disk usage</th>
<th>Actions</th>
Expand All @@ -78,6 +80,9 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
<td><a href="{{ url_for('edit',container=container.name) }}" title="Click to edit {{container.name}}">{{container.name}}</a></td>
<td>{{container.settings.utsname}}</td>
<td>{% if container.settings.flags == 'up' %}{% if container.settings.ipv4 != '' %}{{container.settings.ipv4}}{% else %}Undefined{% endif %}{% elif container.settings.flags == 'down' %}Link Down{% endif %}</td>
<td id="cpu_{{container.name}}">
<span class="label label-success"></span>
</td>
<td id="{{container.name}}">{{ render_memory_wrapper(container.memusg, container.max_memusg) }}</td>
<td id="disk_{{container.name}}">
<span class="label label-success"></span>
Expand Down Expand Up @@ -119,46 +124,75 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
{% block script %}
<script src="/static/js/bootstrapSwitch.js"></script>
<script type="text/javascript">


var updateRunning = 0;
function updateIndicatorFadeIn() {
if (!updateRunning) {
$('#home-load').fadeIn();
}
updateRunning++;
}
function updateIndicatorFadeOut() {
if (updateRunning) {
updateRunning--;
} else {
$('#home-load').fadeOut();
}
}


function refreshMemoryHost(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_memory_host', function(data) {
$('#memory-usage').text(data.used +' / '+ data.total +' MB').fadeIn();
$('#memory-usage-bar').css({'width':data.percent+'%'});
$('#memory-cache-usage-bar').css({'width':data.percent_cached+'%'});
updateIndicatorFadeOut();
});
}

function refreshCPUHost(){
updateIndicatorFadeIn();
$.get($SCRIPT_ROOT + '/_refresh_cpu_host', function(data) {
$('#cpu-usage').text(data +'%').fadeIn();
$('#cpu-usage-bar').css({'width':data +'%'});
updateIndicatorFadeOut();
});
}

function refreshDiskHost(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_disk_host', function(data) {
if (!data) return;
$('#disk-usage').text(data.used +' ('+ data.free +' free)').fadeIn();
$('#disk-usage-bar').css({'width':data.percent});
updateIndicatorFadeOut();
});
}

function refreshLvmHost(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_lvm_host', function(data) {
if (!data || !data.vgs) return;
$.each(data.vgs, function(idx, vg){
$('#lvm-usage-'+vg.name).text(vg.used +' ('+ vg.free +' free) ' + vg.unit).fadeIn();
$('#lvm-usage-bar-'+vg.name).css({'width':vg.percent});
});
updateIndicatorFadeOut();
});
}

function refreshUptimeHost(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_uptime_host', function(data) {
$('#uptime').text(data.day +' day(s) '+ data.time).fadeIn();
updateIndicatorFadeOut();
});
}

function refreshMemoryContainers(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_memory_containers', function(data) {
data = data.data;
for (i in data) {
Expand All @@ -168,10 +202,12 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
/label\-(success|warning|important)/g,
'label-'+memory_color(data[i].memusg, data[i].max_memusg));
}
updateIndicatorFadeOut();
});
}

function refreshDiskContainers(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_disk_containers', function(data) {
data = data.data;
for (i in data) {
Expand All @@ -181,6 +217,22 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
/label\-(success|warning|important)/g,
'label-'+percent_color(data[i].diskusg.percent));
}
updateIndicatorFadeOut();
});
}

function refreshCpuContainers(){
updateIndicatorFadeIn();
$.getJSON($SCRIPT_ROOT + '/_refresh_cpu_containers', function(data) {
data = data.data;
for (i in data) {
var el = $('#cpu_'+data[i].name+' span');
el.text(data[i].cpu+' %');
el[0].className = el[0].className.replace(
/label\-(success|warning|important)/g,
'label-'+percent_color(data[i].cpu));
}
updateIndicatorFadeOut();
});
}

Expand Down Expand Up @@ -226,20 +278,17 @@ <h4><span class="label label-{{ td[container_status] }}">{{ status.status|capita
}

function refresh(){
$('#home-load').fadeIn();
refreshMemoryHost();
refreshCPUHost();
refreshUptimeHost();
refreshCpuContainers();
refreshMemoryContainers();
$('#home-load').fadeOut();
}

function refreshLong(){
$('#home-load').fadeIn();
refreshDiskHost();
refreshLvmHost();
refreshDiskContainers();
$('#home-load').fadeOut();
}

$(function() {
Expand Down

0 comments on commit 9f2cd59

Please sign in to comment.