256 lines
7.3 KiB
HTML
256 lines
7.3 KiB
HTML
<%frame "frame.html"%>
|
|
|
|
<h1>Aktuelle Störfälle (<span id="lastUpdate"></span>)</h1>
|
|
<div style="background-color: #404040; color: white;">
|
|
Kritisch: <span id="nCRITICAL" class="CRITICAL"></span>
|
|
Warnungen: <span id="nWARN" class="WARN"></span>
|
|
OK < 600s: <span id="nOK" class="OK"></span><br/>
|
|
</div>
|
|
|
|
<table id="issues">
|
|
<thead>
|
|
<tr>
|
|
<td>Knoten</td>
|
|
<td>Anmerkungen</td>
|
|
<td>Check</td>
|
|
<td>Zeit in aktuellem Status ( / im letzten Status)</td>
|
|
<td>Relevante Messwerte</td>
|
|
<td>Weboberfläche</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
</tbody>
|
|
</table>
|
|
|
|
<script type="text/javascript">
|
|
var STATES = [ "OK", "WARN", "CRITICAL" ];
|
|
|
|
|
|
moment.defaultFormat = "DD.MM.YYYY HH:mm:ss";
|
|
moment.tz.setDefault("Europe/Berlin");
|
|
|
|
var currentUpdateCycle = 0;
|
|
var listedNodes = {}
|
|
|
|
var charts = []
|
|
var chartTimeout = null;
|
|
|
|
function ntos(n,l){
|
|
n = n.toString();
|
|
while (n.length < l){
|
|
n = "0" + n;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
function timespan(value){
|
|
var days, hours, minutes, seconds;
|
|
value = parseInt(value);
|
|
|
|
days = parseInt(value / 86400);
|
|
value %= 86400;
|
|
hours = parseInt(value / 3600);
|
|
value %= 3600;
|
|
minutes = parseInt(value / 60);
|
|
value %= 60;
|
|
seconds = parseInt(value);
|
|
|
|
var r = "";
|
|
if (days > 0)
|
|
r += `${days}d `;
|
|
r += `${ntos(hours,2)}:${ntos(minutes,2)}:${ntos(seconds,2)}`;
|
|
|
|
return r;
|
|
}
|
|
|
|
|
|
|
|
function updateNode(node)
|
|
{
|
|
//console.log(JSON.stringify(node));
|
|
|
|
var IID = node.ID;
|
|
var currentNode = null;
|
|
if (issues[IID])
|
|
{
|
|
currentNode = listedNodes[IID];
|
|
} else {
|
|
currentNode = {};
|
|
listedNodes[IID] = currentNode;
|
|
}
|
|
|
|
currentNode.Node = node;
|
|
currentNode.updateCyle = currentUpdateCycle;
|
|
|
|
if (!currentNode.html)
|
|
{
|
|
currentNode.html = $("<tr></tr>");
|
|
|
|
for (var i=0;i<6;i++){
|
|
$("<td></td>")
|
|
.appendTo(currentNode.html);
|
|
}
|
|
|
|
currentNode.html.data("node", currentNode);
|
|
currentNode.html.appendTo($("#issues > tbody"));
|
|
}
|
|
|
|
$($("td", currentNode.html).get(0))
|
|
.empty()
|
|
.append(
|
|
$("<a></a>")
|
|
.text(node.Name + " [ "+ node.UniqueIdentity +" ]")
|
|
.attr("href","/static/checks/node.html#" + node.ID)
|
|
.attr("target","_blank")
|
|
);
|
|
|
|
$($("td", currentNode.html).get(1))
|
|
.text(node.Comment);
|
|
|
|
$($("td", currentNode.html).get(2))
|
|
.empty();
|
|
$($("td", currentNode.html).get(3))
|
|
.empty();
|
|
$($("td", currentNode.html).get(4))
|
|
.empty();
|
|
|
|
var tzOffset = new Date().getTimezoneOffset() * 60;
|
|
|
|
currentNode.highestStateTime = 0;
|
|
currentNode.checkState = "OK";
|
|
|
|
$.each(node.CheckStates, function(){
|
|
var now = moment.unix((Date.now()/1000) - tzOffset);
|
|
var m1 = this.History.length > 0 ? moment.unix(this.History.slice(-1)[0].Timestamp) : moment();
|
|
var m2 = this.History.length > 1 ? moment.unix(this.History.slice(-2)[0].Timestamp) : moment();
|
|
|
|
var currentStateTime = (now - m1)/1000;
|
|
|
|
if (STATES.indexOf(currentNode.checkState) < STATES.indexOf(this.CheckState))
|
|
{
|
|
currentNode.checkState = this.CheckState;
|
|
currentNode.highestStateTime = 0;
|
|
}
|
|
|
|
if (currentNode.highestStateTime < currentStateTime)
|
|
currentNode.highestStateTime = currentStateTime;
|
|
|
|
|
|
$($("td", currentNode.html).get(2))
|
|
.append(
|
|
$("<span></span><br>")
|
|
.text(this.CheckName)
|
|
.addClass("issue-" + this.CheckState )
|
|
);
|
|
$($("td", currentNode.html).get(3))
|
|
.append(
|
|
$("<span></span><br>")
|
|
.text( timespan(currentStateTime) + (this.History.length > 1 ? " ( " + this.History.slice(-2)[0].NewState + "=" + timespan((m1 - m2)/1000) + " )" : "") )
|
|
.addClass("issue-" + this.CheckState )
|
|
);
|
|
|
|
$.each( this.PerformanceValues, function(){
|
|
if (this.CheckState != "OK")
|
|
{
|
|
$($("td", currentNode.html).get(4))
|
|
.append(
|
|
$("<span></span><br>")
|
|
.text(this.PerfName)
|
|
.addClass("issue-" + this.CheckState )
|
|
);
|
|
}
|
|
});
|
|
});
|
|
|
|
currentNode.html.removeClass("issue-WARN issue-CRITICAL issue-OK");
|
|
currentNode.html.addClass("issue-" + currentNode.checkState );
|
|
|
|
$($("td", currentNode.html).get(5))
|
|
.empty()
|
|
.text(currentNode.highestStateTime);
|
|
/*
|
|
currentNode.issue.Node.URIs.forEach(function(e,i){
|
|
if (e.Scheme == "http"){
|
|
var url = "http://" + e.Host + ":" + e.Port;
|
|
$($("td", currentNode.html).get(5))
|
|
.append(
|
|
$("<a target=_blank></a>")
|
|
.attr("href",url)
|
|
.text(url)
|
|
);
|
|
}
|
|
}, this);
|
|
*/
|
|
}
|
|
|
|
|
|
function updateIssueList(nodes)
|
|
{
|
|
var startTime = new Date().getTime();
|
|
|
|
currentUpdateCycle++;
|
|
|
|
//console.log(JSON.stringify(nodes));
|
|
|
|
$.each( nodes , function(){
|
|
updateNode(this);
|
|
});
|
|
|
|
$.each( $("#issues > tbody > tr"), function(){
|
|
var currentNode = $(this).data("node");
|
|
if (currentNode.updateCyle != currentUpdateCycle)
|
|
{
|
|
delete issues[currentNode.Node.ID];
|
|
currentNode.html.detach();
|
|
}
|
|
});
|
|
|
|
var rows = $("#issues > tbody > tr");
|
|
var sortList = Array.prototype.sort.bind(rows);
|
|
|
|
sortList(function(a,b){
|
|
var anode = $(a).data("node");
|
|
var bnode = $(b).data("node");
|
|
|
|
var ta = anode.highestStateTime;
|
|
var tb = bnode.highestStateTime;
|
|
|
|
if (ta < tb)
|
|
return -1;
|
|
else if (ta > tb)
|
|
return 1;
|
|
return 0;
|
|
});
|
|
|
|
$("#issues > tbody").append(rows);
|
|
|
|
$("#nCRITICAL").text( $("#issues > tbody > .issue-CRITICAL").length );
|
|
$("#nWARN").text( $("#issues > tbody > .issue-WARN").length );
|
|
$("#nOK").text( $("#issues > tbody > .issue-OK").length );
|
|
$("#lastUpdate").text( moment().format() );
|
|
|
|
var stopTime = new Date().getTime();
|
|
|
|
console.log("Refresh Time: " + (stopTime - startTime) + "ms");
|
|
|
|
}
|
|
|
|
function refresh()
|
|
{
|
|
LN().rpc("CheckService","GetIssueList",[],function(r,e){
|
|
if (e){
|
|
alert("Error fetching current issue list!\n" + JSON.stringify(e));
|
|
} else {
|
|
updateIssueList(r);
|
|
}
|
|
});
|
|
|
|
setTimeout(refresh, 15000);
|
|
}
|
|
|
|
refresh();
|
|
|
|
// skyapi().addRefresh( refresh, 15 );
|
|
|
|
</script>
|