stats pages
This commit is contained in:
parent
be03e0b4e8
commit
2b6c15d87f
4 changed files with 452 additions and 0 deletions
33
src/cmd/venti/srv/www/stats.html
Normal file
33
src/cmd/venti/srv/www/stats.html
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<base href="/">
|
||||||
|
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<script language="javascript" src="stats.js"></script>
|
||||||
|
<script language="javascript" src="status.js"></script>
|
||||||
|
</head>
|
||||||
|
<body bgcolor=#ffffff>
|
||||||
|
|
||||||
|
<center>
|
||||||
|
<b>venti.your-domain.com – venti server statistics</b>
|
||||||
|
<p>
|
||||||
|
<a href="javascript:redraw()">redraw</a>
|
||||||
|
<p>
|
||||||
|
<table id="statgraphs">
|
||||||
|
<tr><td>JavaScript is required to view the graphs.
|
||||||
|
</table>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
<font size=-1>the small graphs show the past ten minutes of operation.</font>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
<tt>http://venti.yourdomain.com:8001/</tt>
|
||||||
|
<p id="settings">JavaScript is required to change the settings.</p>
|
||||||
|
<p>
|
||||||
|
<p id="debug"></p>
|
||||||
|
</center>
|
||||||
|
<script language="javascript">
|
||||||
|
loadsettings()
|
||||||
|
redraw()
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
389
src/cmd/venti/srv/www/stats.js
Normal file
389
src/cmd/venti/srv/www/stats.js
Normal file
|
|
@ -0,0 +1,389 @@
|
||||||
|
|
||||||
|
biggraph = "rpctotal/diff"
|
||||||
|
|
||||||
|
graphname = new Array(
|
||||||
|
"*/diskbw",
|
||||||
|
"<b>disk</b> bytes/second",
|
||||||
|
"*/netbw",
|
||||||
|
"<b>network</b> bytes/second",
|
||||||
|
"*/iobw",
|
||||||
|
"total: <b>disk+net</b> bytes/second",
|
||||||
|
|
||||||
|
"apartreadbyte/diff",
|
||||||
|
"arena read bytes/second",
|
||||||
|
"apartwritebyte/diff",
|
||||||
|
"arena write bytes/second",
|
||||||
|
|
||||||
|
"bloomfalsemiss/pctdiff=bloomlookup",
|
||||||
|
"bloom false hit %",
|
||||||
|
"bloomhit/pctdiff=bloomlookup",
|
||||||
|
"bloom miss %",
|
||||||
|
"bloomlookuptime/divdiff=bloomlookup",
|
||||||
|
"bloom lookup time",
|
||||||
|
"bloomones/pct=bloombits",
|
||||||
|
"bloom usage %",
|
||||||
|
|
||||||
|
"dcachedirty/pct=dcachesize",
|
||||||
|
"dcache dirty %",
|
||||||
|
"dcachehit/pctdiff=dcachelookup",
|
||||||
|
"dcache hit %",
|
||||||
|
"dcachelookuptime/divdiff=dcachelookup",
|
||||||
|
"dcache lookup time",
|
||||||
|
"dcachelookup/diff",
|
||||||
|
"dcache lookups/second",
|
||||||
|
"dcachewrite/diff",
|
||||||
|
"dcache writes/second",
|
||||||
|
|
||||||
|
"icachedirty/pct=icachesize",
|
||||||
|
"icache dirty %",
|
||||||
|
"icachehit/pctdiff=icachelookup",
|
||||||
|
"icache hit %",
|
||||||
|
"icachelookuptime/divdiff=icachelookup",
|
||||||
|
"icache lookup time",
|
||||||
|
"icacheprefetch/diff",
|
||||||
|
"icache prefetches/second",
|
||||||
|
"icachewrite/diff",
|
||||||
|
"icache writes/second",
|
||||||
|
|
||||||
|
"isectreadbyte/diff",
|
||||||
|
"isect read bytes/second",
|
||||||
|
"isectwritebyte/diff",
|
||||||
|
"isect write bytes/second",
|
||||||
|
|
||||||
|
"lcachehit/pctdiff=lcachelookup",
|
||||||
|
"lump cache hit %",
|
||||||
|
"lcachelookuptime/divdiff=lcachelookup",
|
||||||
|
"lump cache lookup time",
|
||||||
|
"lcachewrite/diff",
|
||||||
|
"lcache writes/second",
|
||||||
|
|
||||||
|
"rpcreadbyte/diff",
|
||||||
|
"read RPC bytes/second",
|
||||||
|
"rpctotal/diff",
|
||||||
|
"RPCs/second",
|
||||||
|
"rpcwritebyte/diff",
|
||||||
|
"write RPC bytes/second",
|
||||||
|
"rpcreadtime/divdiff=rpcread",
|
||||||
|
"read RPC time",
|
||||||
|
"rpcwritetime/divdiff=rpcwrite",
|
||||||
|
"write RPC time",
|
||||||
|
"rpcreadcachedtime/divdiff=rpcreadcached",
|
||||||
|
"cached read RPC time",
|
||||||
|
"rpcreaduncachedtime/divdiff=rpcreaduncached",
|
||||||
|
"uncached read RPC time",
|
||||||
|
"rpcwritenewtime/divdiff=rpcwritenew",
|
||||||
|
"fresh write RPC time",
|
||||||
|
"rpcwriteduptime/divdiff=rpcwritedup",
|
||||||
|
"dup write RPC time",
|
||||||
|
|
||||||
|
"sumreadbyte/diff",
|
||||||
|
"checksum bytes/second",
|
||||||
|
|
||||||
|
"dblockstall",
|
||||||
|
"threads stalled: dblock",
|
||||||
|
"dcachestall",
|
||||||
|
"threads stalled: dcache",
|
||||||
|
"icachestall",
|
||||||
|
"threads stalled: icache",
|
||||||
|
"lumpstall",
|
||||||
|
"threads stalled: lump",
|
||||||
|
|
||||||
|
"END"
|
||||||
|
)
|
||||||
|
|
||||||
|
column0 = new Array(
|
||||||
|
"column0",
|
||||||
|
"!bandwidth",
|
||||||
|
"*/iobw",
|
||||||
|
"*/netbw",
|
||||||
|
"rpcreadbyte/diff",
|
||||||
|
"rpcwritebyte/diff",
|
||||||
|
"*/diskbw",
|
||||||
|
"isectreadbyte/diff",
|
||||||
|
"isectwritebyte/diff",
|
||||||
|
"apartreadbyte/diff",
|
||||||
|
"apartwritebyte/diff",
|
||||||
|
"sumreadbyte/diff",
|
||||||
|
|
||||||
|
"!bloom filter",
|
||||||
|
"bloomhit/pctdiff=bloomlookup",
|
||||||
|
"bloomfalsemiss/pctdiff=bloomlookup",
|
||||||
|
"bloomones/pct=bloombits",
|
||||||
|
|
||||||
|
"END"
|
||||||
|
)
|
||||||
|
|
||||||
|
column1 = new Array(
|
||||||
|
"column1",
|
||||||
|
"!icache",
|
||||||
|
"icachedirty/pct=icachesize",
|
||||||
|
"icachehit/pctdiff=icachelookup",
|
||||||
|
"icachewrite/diff",
|
||||||
|
"icacheprefetch/diff",
|
||||||
|
|
||||||
|
"!dcache",
|
||||||
|
"dcachedirty/pct=dcachesize",
|
||||||
|
"dcachehit/pctdiff=dcachelookup",
|
||||||
|
"dcachelookup/diff",
|
||||||
|
"dcachewrite/diff",
|
||||||
|
|
||||||
|
"!lump cache",
|
||||||
|
"lcachehit/pctdiff=lcachelookup",
|
||||||
|
"lcachewrite/diff",
|
||||||
|
|
||||||
|
"END"
|
||||||
|
)
|
||||||
|
|
||||||
|
column2 = new Array(
|
||||||
|
"column2",
|
||||||
|
|
||||||
|
"!stalls",
|
||||||
|
"icachestall",
|
||||||
|
"dcachestall",
|
||||||
|
"dblockstall",
|
||||||
|
"lumpstall",
|
||||||
|
|
||||||
|
"!timings",
|
||||||
|
"bloomlookuptime/divdiff=bloomlookup",
|
||||||
|
"icachelookuptime/divdiff=icachelookup",
|
||||||
|
"lcachelookuptime/divdiff=lcachelookup",
|
||||||
|
"dcachelookuptime/divdiff=dcachelookup",
|
||||||
|
"rpcreadtime/divdiff=rpcread",
|
||||||
|
"rpcwritetime/divdiff=rpcwrite",
|
||||||
|
"rpcreadcachedtime/divdiff=rpcreadcached",
|
||||||
|
"rpcreaduncachedtime/divdiff=rpcreaduncached",
|
||||||
|
"rpcwritenewtime/divdiff=rpcwritenew",
|
||||||
|
"rpcwriteduptime/divdiff=rpcwritedup",
|
||||||
|
|
||||||
|
"END"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
col0info = new Array(column0.length)
|
||||||
|
col1info = new Array(column1.length)
|
||||||
|
col2info = new Array(column2.length)
|
||||||
|
|
||||||
|
function cleardebug() {
|
||||||
|
var p = document.getElementById("debug")
|
||||||
|
p.innerHTML = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function debug(s) {
|
||||||
|
var p = document.getElementById("debug")
|
||||||
|
if(p.innerHTML == "")
|
||||||
|
p.innerHTML = "<a href=\"javascript:cleardebug()\">clear</a>\n"
|
||||||
|
p.innerHTML += "<br>"+s
|
||||||
|
}
|
||||||
|
|
||||||
|
function Ginfo(y, fill, name) {
|
||||||
|
var g = new Object()
|
||||||
|
g.y = y
|
||||||
|
g.fill = fill
|
||||||
|
g.name = name
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
|
||||||
|
function cleartable(t) {
|
||||||
|
for(var i=t.rows.length-1; i>=0; i--)
|
||||||
|
t.deleteRow(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
function textofname(name)
|
||||||
|
{
|
||||||
|
for(var i=0; i<graphname.length; i+=2)
|
||||||
|
if(name == graphname[i])
|
||||||
|
return graphname[i+1]
|
||||||
|
}
|
||||||
|
|
||||||
|
function graphrow(row, span, name, dt, wid, ht, fill, text) {
|
||||||
|
var url = "/graph/"+name
|
||||||
|
url = url+"/min=0"
|
||||||
|
url = url+"/t0=-"+dt
|
||||||
|
url = url+"/wid="+wid
|
||||||
|
url = url+"/ht="+ht
|
||||||
|
url = url+"/fill="+fill
|
||||||
|
|
||||||
|
var s = "<td colSpan="+span
|
||||||
|
s = s+" valign=bottom"
|
||||||
|
s = s+" align=center"
|
||||||
|
s = s+" width="+wid
|
||||||
|
s = s+" height="+ht
|
||||||
|
s = s+" style=\"background-image: url("+url+");\""
|
||||||
|
s = s+">"+textofname(name)+text+"</td>"
|
||||||
|
row.innerHTML = s
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function graphcell(cell, name, dt, wid, ht, fill) {
|
||||||
|
cell.vAlign = "bottom"
|
||||||
|
cell.align = "center"
|
||||||
|
cell.width = wid
|
||||||
|
cell.height = ht
|
||||||
|
}
|
||||||
|
|
||||||
|
function redraw() {
|
||||||
|
redrawgraphs()
|
||||||
|
redrawsettings()
|
||||||
|
}
|
||||||
|
|
||||||
|
function redrawgraphs() {
|
||||||
|
var t = document.getElementById("statgraphs")
|
||||||
|
|
||||||
|
cleartable(t)
|
||||||
|
for(var i=0; i<4; i++)
|
||||||
|
t.insertRow(i)
|
||||||
|
|
||||||
|
graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " – showing 24 hours")
|
||||||
|
debug("t.rows.length="+t.rows.length)
|
||||||
|
graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – showing 1 hour")
|
||||||
|
debug("t.rows.length="+t.rows.length)
|
||||||
|
t.rows[2].innerHTML = "<td height=10></td>"
|
||||||
|
|
||||||
|
var r = t.rows[3]
|
||||||
|
graphtable(r.insertCell(0), column0, col0info, 0)
|
||||||
|
graphtable(r.insertCell(1), column1, col1info, 2)
|
||||||
|
graphtable(r.insertCell(2), column2, col2info, 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
function graphtable(bigcell, list, infolist, fill) {
|
||||||
|
bigcell.innerHTML = "<table id=\""+list[0]+"\"></table>"
|
||||||
|
bigcell.vAlign = "top"
|
||||||
|
var t = document.getElementById(list[0])
|
||||||
|
t.onclick = columnclick
|
||||||
|
|
||||||
|
for(var i=1; i<list.length; i++){
|
||||||
|
var r = t.insertRow(t.rows.length)
|
||||||
|
name = list[i]
|
||||||
|
infolist[i] = Ginfo(t.offsetHeight, fill, name)
|
||||||
|
if(name == "END")
|
||||||
|
break
|
||||||
|
if(name.substring(0,1) == "!"){
|
||||||
|
name = name.substring(1)
|
||||||
|
if(i > 1){
|
||||||
|
r.innerHTML = "<td height=10></td>"
|
||||||
|
r = t.insertRow(t.rows.length)
|
||||||
|
}
|
||||||
|
r.innerHTML = "<td align=center><b>"+name+"</b>"
|
||||||
|
}else{
|
||||||
|
graphrow(r, 1, name, 600, 300, 30, fill++, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function xpos(obj) {
|
||||||
|
var x = 0
|
||||||
|
if(obj.fixedx)
|
||||||
|
return obj.fixedx
|
||||||
|
if(obj.offsetParent){
|
||||||
|
while(obj.offsetParent){
|
||||||
|
x += obj.offsetLeft
|
||||||
|
obj = obj.offsetParent
|
||||||
|
}
|
||||||
|
}else if(obj.x)
|
||||||
|
x = obj.x
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
function ypos(obj) {
|
||||||
|
var y = 0
|
||||||
|
if(obj.fixedy)
|
||||||
|
return obj.fixedy
|
||||||
|
if(obj.offsetParent){
|
||||||
|
while(obj.offsetParent){
|
||||||
|
y += obj.offsetTop
|
||||||
|
obj = obj.offsetParent
|
||||||
|
}
|
||||||
|
}else if(obj.y)
|
||||||
|
y = obj.y
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollleft() {
|
||||||
|
return document.body.scrollLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrolltop() {
|
||||||
|
return document.body.scrollTop
|
||||||
|
}
|
||||||
|
|
||||||
|
function columnclick(e) {
|
||||||
|
if(e.which && e.which != 1)
|
||||||
|
return
|
||||||
|
var g = findgraph(scrollleft()+e.clientX, scrolltop()+e.clientY)
|
||||||
|
if(g && g.name.substring(0,1) != "!"){
|
||||||
|
biggraph = g.name
|
||||||
|
var t = document.getElementById("statgraphs")
|
||||||
|
graphrow(t.rows[0], 3, biggraph, 86400, 900, 30, 0, " – showing 24 hours")
|
||||||
|
graphrow(t.rows[1], 3, biggraph, 3600, 900, 30, 1, " – showing 1 hour")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function findgraph(x, y) {
|
||||||
|
var g
|
||||||
|
|
||||||
|
if(g = findgraphin(x, y, "column2", col2info))
|
||||||
|
return g
|
||||||
|
if(g = findgraphin(x, y, "column1", col1info))
|
||||||
|
return g
|
||||||
|
if(g = findgraphin(x, y, "column0", col0info))
|
||||||
|
return g
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
function findgraphin(x, y, tname, info) {
|
||||||
|
var t = document.getElementById(tname)
|
||||||
|
if(x < xpos(t))
|
||||||
|
return
|
||||||
|
y = y - ypos(t)
|
||||||
|
for(var i=info.length-2; i>=1; i--)
|
||||||
|
if(y > info[i].y)
|
||||||
|
return info[i]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
function setof(name, val, list) {
|
||||||
|
var s = ""
|
||||||
|
for(var i=0; i<list.length; i++){
|
||||||
|
if(val == list[i])
|
||||||
|
s = s+" <b>"+val+"</b>"
|
||||||
|
else
|
||||||
|
s = s+" <a href=\"javascript:set('"+name+"', '"+list[i]+"')\">"+list[i]+"</a>"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
function loglinks(list) {
|
||||||
|
var s = ""
|
||||||
|
for(var i=0; i<list.length; i++){
|
||||||
|
s = s+" <a href=\"/log/"+list[i]+"\">"+list[i]+"</a>"
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
first = 1
|
||||||
|
function redrawsettings() {
|
||||||
|
if(first){
|
||||||
|
loadsettings()
|
||||||
|
first = 0
|
||||||
|
}
|
||||||
|
var s = ""
|
||||||
|
s = s+"<font size=-1>\n"
|
||||||
|
s = s+"logging:"+setof("logging", logging, loggingchoices)
|
||||||
|
s = s+" "
|
||||||
|
s = s+"stats:"+setof("stats", stats, statschoices)
|
||||||
|
s = s+"\n<p/>\n"
|
||||||
|
s = s+"compression:"+setof("compress", compress, compresschoices1)
|
||||||
|
s = s+"<br>"+setof("compress", compress, compresschoices2)
|
||||||
|
s = s+"\n<p/>\n"
|
||||||
|
s = s+"<a href=/index>index</a> | <a href=/storage>storage</a> | "
|
||||||
|
s = s+"log:"+loglinks(logs)
|
||||||
|
s = s+"</font>"
|
||||||
|
document.getElementById("settings").innerHTML = s
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(name, value) {
|
||||||
|
eval(name+"= \""+value+"\"")
|
||||||
|
redrawsettings()
|
||||||
|
// Works in FireFox, not in Safari
|
||||||
|
parent.hidden.location.href = "/set/"+name+"/"+value
|
||||||
|
}
|
||||||
16
src/cmd/venti/srv/www/status.js
Normal file
16
src/cmd/venti/srv/www/status.js
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
function loadsettings() {
|
||||||
|
logging = "off"
|
||||||
|
loggingchoices = new Array("0", "1")
|
||||||
|
|
||||||
|
stats = "on"
|
||||||
|
statschoices = new Array("0", "1")
|
||||||
|
|
||||||
|
compress = "whack"
|
||||||
|
compresschoices1 = new Array("none",
|
||||||
|
"flate1", "flate2", "flate3", "flate4", "flate5",
|
||||||
|
"flate6", "flate7", "flate8", "flate9")
|
||||||
|
compresschoices2 = new Array("smack1", "smack2", "smack3", "whack")
|
||||||
|
|
||||||
|
logs = new Array("all", "libventi/server", "disk", "lump", "block", "proc", "quiet", "rpc")
|
||||||
|
}
|
||||||
|
|
||||||
14
src/cmd/venti/srv/www/status1.js
Normal file
14
src/cmd/venti/srv/www/status1.js
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
logging = "on"
|
||||||
|
loggingchoices = new Array("off", "on")
|
||||||
|
|
||||||
|
stats = "on"
|
||||||
|
statschoices = new Array("off", "on")
|
||||||
|
|
||||||
|
compress = "whack"
|
||||||
|
compresschoices1 = new Array("none",
|
||||||
|
"flate1", "flate2", "flate3", "flate4", "flate5",
|
||||||
|
"flate6", "flate7", "flate8", "flate9")
|
||||||
|
compresschoices2 = new Array("smack1", "smack2", "smack3", "whack")
|
||||||
|
|
||||||
|
logs = new Array("all", "libventi/server", "disk", "lump", "block", "proc", "quiet", "rpc")
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue