blob: 63771baee46dfca0b2eade618c20cd512553207f [file] [log] [blame]
/*
*
* 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.
*
*/
var type, columns, maxUpdateValue;
var REFRESH_INTERVAL = 300000;
var dataLoaded = true;
var timeInterval = '30 Min';
var applicationId = '';
var clusterId = '';
//loading gadget configuration
type = gadgetConfig.type;
var counter = 0;
maxUpdateValue = gadgetConfig.maxUpdateValue;
gadgets.HubSettings.onConnect = function () {
gadgets.Hub.subscribe('member-status-filter', function (topic, data) {
clusterId = data['clusterId'];
applicationId = data['applicationId'];
timeInterval = data['timeInterval'];
console.log("Member Filter Value:" + JSON.stringify(data));
fetchData(drawChart);
});
};
//first, fetch datasource schema
getColumns();
//load data immediately
fetchData(drawChart);
// then start periodic polling
setInterval(function () {
fetchData(drawChart);
}, REFRESH_INTERVAL);
function getColumns() {
columns = gadgetConfig.columns;
}
function fetchData(callback) {
//if previous operation is not completed, DO NOT fetch data
if (!dataLoaded) {
console.log("Waiting for data...");
return;
}
var application = applicationId;
var cluster = clusterId;
var time = timeInterval;
if (application != "") {
var request = {
applicationId: application,
clusterId: cluster,
time: time
};
jQuery("#placeholder").html("");
jQuery("#placeholder").append('<div id="noChart"><table><tr><td><b><p><br/>Updating</p></b></td></tr></table></div>');
$.ajax({
url: "/portal/apis/member-count",
method: "GET",
data: request,
contentType: "application/json",
success: function (data) {
if (callback != null) {
callback(makeRows(JSON.parse(data)));
}
}
});
dataLoaded = false; //setting the latch to locked position so that we block data fetching until we receive the response from backend
}
}
function makeDataTable(data) {
var dataTable = new igviz.DataTable();
if (columns.length > 0) {
columns.forEach(function (column) {
var type = "N";
if (column.DATA_TYPE == "varchar" || column.DATA_TYPE == "VARCHAR") {
type = "C";
} else if (column.DATA_TYPE == "TIME" || column.DATA_TYPE == "time") {
type = "T";
}
dataTable.addColumn(column.COLUMN_NAME, type);
});
}
data.forEach(function (row, index) {
for (var i = 0; i < row.length; i++) {
if (dataTable.metadata.types[i] == "N") {
data[index][i] = parseInt(data[index][i]);
}
}
});
dataTable.addRows(data);
return dataTable;
}
function makeRows(data) {
var rows = [];
for (var i = 0; i < data.length; i++) {
var record = data[i];
var format = d3.time.format("%Y-%m-%d %H:%M:%S");
var row = columns.map(function (column) {
if (column.COLUMN_NAME == 'Time') {
record[column.COLUMN_NAME]=format(new Date(parseInt(record[column.COLUMN_NAME])));
}
return record[column.COLUMN_NAME];
});
rows.push(row);
}
return rows;
}
function drawChart(data) {
var dataTable = makeDataTable(data);
if (dataTable.data.length != 0) {
gadgetConfig.chartConfig.width = $("#placeholder").width();
gadgetConfig.chartConfig.height = $("#placeholder").height() - 65;
var chartType = gadgetConfig.chartConfig.chartType;
var xAxis = gadgetConfig.chartConfig.xAxis;
var chart;
jQuery("#noChart").html("");
if (chartType === "bar" && dataTable.metadata.types[xAxis] === "N") {
dataTable.metadata.types[xAxis] = "C";
}
if (gadgetConfig.chartConfig.chartType === "tabular" || gadgetConfig.chartConfig.chartType === "singleNumber") {
gadgetConfig.chartConfig.height = $("#placeholder").height();
chart = igviz.draw("#placeholder", gadgetConfig.chartConfig, dataTable);
chart.plot(dataTable.data);
} else {
chart = igviz.setUp("#placeholder", gadgetConfig.chartConfig, dataTable);
chart.setXAxis({
"labelAngle": -35,
"labelAlign": "right",
"labelDy": 0,
"labelDx": 0,
"titleDy": 25
})
.setYAxis({
"titleDy": -30
});
chart.plot(dataTable.data);
}
} else {
jQuery("#placeholder").html("");
jQuery("#placeholder").append('<div id="noChart"><table><tr><td style="padding:30px 20px 0px 20px"><img src="../../portal/images/noEvents.png" align="left" style="width:24;height:24"/></td><td><br/><b><p><br/>Data is not available for selected application, cluster and time interval</p></b></td></tr></table></div>');
}
//releasing the latch so that we can request data again from the backend.
dataLoaded = true;
}