All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.zookeeper.graph.resources.loggraph.js Maven / Gradle / Ivy

Go to download

LogGraph is an application for viewing and filtering zookeeper logs. It can handle transaction logs and message logs.

There is a newer version: 3.9.3
Show newest version
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

LogGraph = function(canvas, status) {
    this.canvas = document.getElementById(canvas);
    this.status = document.getElementById(status);
    this.starttime = 0;
    this.endtime = 0;
    this.period = 0;
    this.numEntries = 0;
    this.currentRender = 0;
    this.filter = "";

    this.saveFilters = function () {
	localStorage.starttime = this.starttime;
	localStorage.endtime = this.endtime;
	localStorage.period = this.period;
	localStorage.filter = this.filter;
	
    };
    this.loadFilters = function () {
	if (localStorage.starttime) { this.starttime = parseInt(localStorage.starttime); }
	if (localStorage.endtime) { this.endtime = parseInt(localStorage.endtime); }
	if (localStorage.period) { this.period = parseInt(localStorage.period); }
	if (localStorage.filter) { this.filter = localStorage.filter; }
    };
    this.loadFilters();
    var self = this;

    var updateStatus = function (starttime, period, filter, numEntries) {
	self.starttime = starttime;
	self.endtime = starttime + period;
	self.period = period;
	self.filter = filter;
	self.saveFilters(); 
       
	self.status.innerHTML = dateFormat(starttime, "HH:MM:ss,l") + " ⇒ " + dateFormat(self.endtime, "HH:MM:ss,l") + "    |    " + numEntries + " entries     |    " +  (filter ? filter : "No filter");
	
	if (self.currentRender) {
	    self.currentRender();
	}
    };
	
    YUI().use("io-base", function(Y) {
	    var uri = "/info";
	    if (self.starttime) {
		var uri = "/info?start=" + self.starttime + "&period=" + self.period + "&filter=" + self.filter;
	    }
	    
	    function complete(id, o, args) {
		var data = eval("(" + o.responseText + ")"); // Response data.
		var period = data.endTime - data.startTime;
		updateStatus(data.startTime, period, self.filter, data.numEntries);
	    };
	    
	    Y.on('io:complete', complete, Y, []);
	    var request = Y.io(uri);
	});
    
    this.addLogs = function() {
	new LogGraph.fileSelector(function (files) { new LogGraph.fileLoader(files); });
    };

    this.editFilters = function() {
	new LogGraph.filterSelector(this.starttime, this.period, this.filter, updateStatus);
    };	
	
    this.getCleanCanvas = function () {
	this.canvas.innerHTML = "";
	return this.canvas;
    };

    this.showLoadingScreen = function () {
	this.loadingScreen = document.createElement("div");
	this.loadingScreen.id = "loadingScreen";
	this.loadingScreen.innerHTML = " 

Loading...

"; document.body.appendChild(this.loadingScreen); }; this.hideLoadingScreen = function () { document.body.removeChild(this.loadingScreen); this.loadingScreen.style.visibility = "hidden"; }; /*** * TODO: refactor these to load the data first, before handing to a draw funciton. * We shouldn't pass the async q into the drawing function */ this.showLogs = function() { var self= this; YUI().use('async-queue', function(Y) { var q = new Y.AsyncQueue(self.showLoadingScreen, // The second callback will pause the Queue and send an XHR for data function () { q.pause(); var loggraph = new LogGraph.LogTable(q, self.getCleanCanvas(), self.starttime, self.endtime, self.filter); self.currentRender = self.showLogs; }, self.hideLoadingScreen); q.run(); } ); }; this.serverGraph = function() { var self= this; YUI().use('async-queue', function(Y) { var q = new Y.AsyncQueue(self.showLoadingScreen, // The second callback will pause the Queue and send an XHR for data function () { q.pause(); var servergraph = new LogGraph.ServerGraph(q, self.getCleanCanvas(), self.starttime, self.endtime, self.filter); self.currentRender = self.showLogs; }, self.hideLoadingScreen); q.run(); } ); }; this.sessionGraph = function() { var self= this; YUI().use('async-queue', function(Y) { var q = new Y.AsyncQueue(self.showLoadingScreen, // The second callback will pause the Queue and send an XHR for data function () { q.pause(); var sessiongraph = new LogGraph.SessionGraph(q, self.getCleanCanvas(), self.starttime, self.endtime, self.filter); self.currentRender = self.sessionGraph; }, self.hideLoadingScreen); q.run(); } ); }; this.showStats = function() { var self= this; YUI().use('async-queue', function(Y) { var q = new Y.AsyncQueue(self.showLoadingScreen, // The second callback will pause the Queue and send an XHR for data function () { q.pause(); var statgraph = new LogGraph.StatsGraph(q, self.getCleanCanvas(), self.starttime, self.endtime, self.filter); self.currentRender = self.showStats; }, self.hideLoadingScreen); q.run(); } ); }; }; LogGraph.error = function(description) { var errorPage = document.createElement("div"); errorPage.className = "errorpage"; var p = document.createElement("p"); p.innerHTML = description; errorPage.appendChild(p); var span = document.createElement("span"); p = document.createElement("p"); span.className = "actionButton"; span.innerHTML = "OK"; span.onclick = function (evt) { document.body.removeChild(errorPage); delete errorPage; } p.appendChild(span); errorPage.appendChild(p); document.body.appendChild(errorPage); }; LogGraph.ticker =function(allow_dups) { this.ticks = new Array(); this.current_tick = 0; this.allow_dups = allow_dups;; this.tick = function(time) { if (time == this.ticks[this.ticks.length - 1] && this.allow_dups == true) return this.current_tick; this.ticks.push(time); return this.current_tick++; }; this.current = function() { return this.current_tick; }; this.reset = function() { while (this.ticks.length) { this.ticks.pop(); } this.current_tick = 0; }; }; LogGraph.timescale = function(starttime, endtime) { this.starttime = starttime; this.endtime = endtime; this.millis = endtime - starttime; this.draw = function(paper) { var scale = paper.set(); scale.push(paper.path("M0 0 L" + paper.width + " 0")); for (var i = 0; i < paper.width; i += 100) { scale.push(paper.path("M" + i + " 0 L" + i + " 5")); // var time = dateFormat((this.starttime + (i*ms_per_pixel)), "h:MM:ss,l"); // paper.text(i + 5, 10, time); } scale.attr({"stroke-width": 2}); }; }; /* Fetch data from an uri and process it, the process data func returns true if any of the data is useful */ LogGraph.loadData = function (asyncq, uri, processdata) { YUI().use("io-base", function(Y) { function success(id, o, args) { var data = eval("(" + o.responseText + ")"); // Response data. if (data.error) { LogGraph.error(data.error); } else { if (!processdata(data)) { LogGraph.error("No data. Perhaps you should loosen your filter criteria."); } } asyncq.run(); }; function failure(id, o, args) { LogGraph.error("Error contacting server: (" + o.status + ") " + o.statusText); asyncq.run(); }; Y.on('io:success', success, Y, []); Y.on('io:failure', failure, Y, []); var request = Y.io(uri); }); }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy