blob: 8d5d5d28b52658c2b1f0c65d3e5fb20e3ea0f6c6 [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.
*/
app.controller('AppCtrl', ['$scope','$rootScope','$cookies','$location','$translate', function ($scope,$rootScope,$cookies,$location,$translate) {
$scope.changeTranslate = function(langKey){
$translate.use(langKey);
}
}]);
app.controller('dashboardCtrl', ['$scope','$rootScope','$translate','$filter','Notification','remoteApi','tools', function ($scope,$rootScope,$translate,$filter,Notification,remoteApi,tools) {
$scope.barChart = echarts.init(document.getElementById('main'));
$scope.lineChart = echarts.init(document.getElementById('line'));
$scope.topicBarChart = echarts.init(document.getElementById('topicBar'));
$scope.topicLineChart = echarts.init(document.getElementById('topicLine'));
$scope.timepickerOptions ={format: 'YYYY-MM-DD', showClear: true};
$scope.topicNames = [];
$translate('BROKER').then(function (broker) {
$scope.BROKER_TITLE = broker;
initBrokerBarChart();
initBrokerLineChart();
}, function (translationId) {
$scope.BROKER_TITLE = translationId;
});
$translate('TOPIC').then(function (topic) {
$scope.TOPIC_TITLE = topic;
initTopicBarChart();
initTopicLineChart();
}, function (translationId) {
$scope.TOPIC_TITLE = translationId;
});
var initBrokerBarChart = function(){
$scope.barChart.setOption({
title: {
text:$scope.BROKER_TITLE + ' TOP 10'
},
tooltip: {},
legend: {
data:['TotalMsg']
},
axisPointer : {
type : 'shadow'
},
xAxis: {
data: [],
axisLabel: {
inside: false,
textStyle: {
color: '#000000'
},
rotate: 0,
interval:0
},
axisTick: {
show: true
},
axisLine: {
show: true
},
z: 10
},
yAxis: {
type: 'value',
boundaryGap: [0, '100%'],
axisLabel: {
formatter: function(value){
return value.toFixed(2);
}
},
splitLine: {
show: true
}
},
series: [{
name: 'TotalMsg',
type: 'bar',
data: []
}]
})
}
var initBrokerLineChart = function(){
$scope.lineChart.setOption({
title: {
text: $scope.BROKER_TITLE + ' 5min trend'
},
toolbox: {
feature: {
dataZoom: {
yAxisIndex: 'none'
},
restore: {},
saveAsImage: {}
}
},
tooltip: {
trigger: 'axis',
axisPointer: {
animation: false
}
},
yAxis: {
type: 'value',
boundaryGap: [0, '80%'],
axisLabel: {
formatter: function(value){
return value.toFixed(2);
}
},
splitLine: {
show: true
}
},
dataZoom: [{
type: 'inside',
start: 90,
end: 100
}, {
start: 0,
end: 10,
handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
handleSize: '80%',
handleStyle: {
color: '#fff',
shadowBlur: 3,
shadowColor: 'rgba(0, 0, 0, 0.6)',
shadowOffsetX: 2,
shadowOffsetY: 2
}
}],
legend: {
data: [],
top:30
},
xAxis: {
type: 'time',
boundaryGap: false,
data: []
},
series: []
})
}
var initTopicBarChart = function(){
$scope.topicBarChart.setOption({
title: {
text:$scope.TOPIC_TITLE + ' TOP 10'
},
tooltip: {},
legend: {
data:['TotalMsg']
},
axisPointer : {
type : 'shadow'
},
xAxis: {
data: [],
axisLabel: {
inside: false,
textStyle: {
color: '#000000'
},
rotate: 0,
interval:0
},
axisTick: {
show: true
},
axisLine: {
show: true
},
z: 10
},
yAxis: {
type: 'value',
boundaryGap: [0, '100%'],
axisLabel: {
formatter: function(value){
return value.toFixed(2);
}
},
splitLine: {
show: true
}
},
series: [{
name: 'TotalMsg',
type: 'bar',
data: []
}]
})
}
var initTopicLineChart = function(){
var _option = {
baseOption:{
title: {
text: $scope.TOPIC_TITLE + ' 5min trend'
},
toolbox: {
feature: {
dataZoom: {
yAxisIndex: 'none'
},
restore: {},
saveAsImage: {}
}
},
grid:{
top:100
},
tooltip: {
trigger: 'axis',
axisPointer: {
animation: false
}
},
yAxis: {
type: 'value',
boundaryGap: [0, '80%'],
axisLabel: {
formatter: function(value){
return value.toFixed(2);
}
},
splitLine: {
show: true
}
},
dataZoom: [{
type: 'inside',
start: 90,
end: 100
}, {
start: 0,
end: 10,
handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
handleSize: '80%',
handleStyle: {
color: '#fff',
shadowBlur: 3,
shadowColor: 'rgba(0, 0, 0, 0.6)',
shadowOffsetX: 2,
shadowOffsetY: 2
}
}],
legend:{
data:[],
top:30
},
xAxis: {
type: 'time',
boundaryGap: false,
data: []
},
series: []
}
}
$scope.topicLineChart.setOption(_option)
}
var getBrokerBarChartOp = function(xAxisData,data){
// 指定图表的配置项和数据
var option = {
xAxis: {
data: xAxisData,
axisLabel: {
inside: false,
textStyle: {
color: '#000000'
},
rotate: 0,
interval:0
},
axisTick: {
show: true
},
axisLine: {
show: true
},
z: 10
},
series: [{
name: 'TotalMsg',
type: 'bar',
data: data
}]
};
$scope.barChart.setOption(option);
}
var callback = function (resp) {
$scope.barChart.hideLoading();
if (resp.status == 0) {
var clusterAddrTable = resp.data.clusterInfo.clusterAddrTable;
var brokerMap = resp.data.clusterInfo.brokerAddrTable;
var brokerDetail = resp.data.brokerServer;
var clusterMap = tools.generateBrokerMap(brokerDetail,clusterAddrTable,brokerMap);
$scope.brokerArray = [];
$.each(clusterMap,function(clusterName,brokers){
$.each(brokers,function(i,broker){
$scope.brokerArray.push(broker)
})
});
//sort the brokerArray
$scope.brokerArray.sort(function(firstBroker,lastBroker){
var firstTotalMsg = parseFloat(firstBroker.msgGetTotalTodayNow);
var lastTotalMsg = parseFloat(lastBroker.msgGetTotalTodayNow);
return lastTotalMsg-firstTotalMsg;
});
var xAxisData = [],
data = [];
$.each($scope.brokerArray,function(i,broker){
if(i > 9){
return false;
}
xAxisData.push(broker.brokerName + ":" + broker.index);
data.push(broker.msgGetTotalTodayNow);
})
getBrokerBarChartOp(xAxisData,data);
}else{
Notification.error({message: resp.errMsg, delay: 2000});
}
}
$scope.barChart.showLoading();
remoteApi.queryClusterList(callback);
$scope.topicBarChart.showLoading();
remoteApi.queryTopicCurrentData(function(resp){
$scope.topicBarChart.hideLoading();
if (resp.status == 0) {
var topicList = resp.data;
topicList.sort(function(first,last){
var firstTotalMsg = parseFloat(first.split(",")[1]);
var lastTotalMsg = parseFloat(last.split(",")[1]);
return lastTotalMsg-firstTotalMsg;
})
var xAxisData = [];
var data = [];
$.each(topicList,function (i,currentData) {
var currentArray = currentData.split(",");
$scope.topicNames.push(currentArray[0]);
if(!angular.isDefined($scope.selectedTopic)){
$scope.selectedTopic = currentArray[0];
}
})
$.each(topicList,function (i, currentData) {
if(i > 9){
return false;
}
var currentArray = currentData.split(",");
xAxisData.push(currentArray[0]);
data.push(currentArray[1]);
})
// 指定图表的配置项和数据
var option = {
xAxis: {
data: xAxisData,
axisLabel: {
inside: false,
textStyle: {
color: '#000000'
},
rotate: 60,
interval:0
},
axisTick: {
show: true
},
axisLine: {
show: true
},
z: 10
},
series: [{
name: 'TotalMsg',
type: 'bar',
data: data
}]
};
$scope.topicBarChart.setOption(option);
queryLineData();
}else{
Notification.error({message: resp.errMsg, delay: 2000});
}
})
var getBrokerLineChart = function(legend,data){
var series = [];
var xAxisData = [];
var flag = true;
var i = 0;
$.each(data,function(key,value){
// if(i > 9 ){
// return false;
// }
var _tps = [];
$.each(value,function(i,tpsValue){
var tpsArray = tpsValue.split(",");
if(flag){
xAxisData.push($filter('date')(tpsArray[0], "HH:mm:ss"));
}
_tps.push(tpsArray[1]);
})
flag = false;
var _series = {
name:key,
type:'line',
smooth:true,
symbol: 'none',
sampling: 'average',
data: _tps
}
series.push(_series);
i++
})
var option = {
legend: {
data: legend
},
color: ["#FF0000", "#00BFFF", "#FF00FF", "#1ce322", "#000000", '#EE7942'],
xAxis: {
type: 'category',
boundaryGap: false,
data: xAxisData
},
series: series
};
return option;
}
var getTopicLineChart = function(legend,data){
var series = [];
var xAxisData = [];
var flag = true;
var i = 0;
$.each(data,function(key,value){
var _tps = [];
$.each(value,function(i,tpsValue){
var tpsArray = tpsValue.split(",");
if(flag){
xAxisData.push($filter('date')(tpsArray[0], "HH:mm:ss"));
}
_tps.push(tpsArray[3]);
})
flag = false;
var _series = {
name:key,
type:'line',
smooth:true,
symbol: 'none',
sampling: 'average',
data: _tps
}
series.push(_series);
i++
})
var option = {
baseOption:{
legend: {
data: legend
},
// color: ["#FF0000", "#00BFFF", "#FF00FF", "#1ce322", "#000000", '#EE7942'],
xAxis: {
type: 'category',
boundaryGap: false,
data: xAxisData
},
series: series
},
media:[
{
query:{},
option:{
}
}
]
};
return option;
}
var queryLineData = function () {
var _date;
if($scope.date != null){
_date = $filter('date')($scope.date.valueOf(), "yyyy-MM-dd");
}else{
_date = $filter('date')(new Date(), "yyyy-MM-dd");
}
// $scope.lineChart.showLoading();
remoteApi.queryBrokerHisData(_date,function(resp){
// $scope.lineChart.hideLoading();
if (resp.status == 0) {
var _data = {}
var _xAxisData = [];
$.each(resp.data,function(address,values){
_data[address] = values;
_xAxisData.push(address);
})
$scope.lineChart.setOption(getBrokerLineChart(_xAxisData,_data));
}else{
Notification.error({message: "" + resp.errMsg, delay: 2000});
}
})
$scope.topicLineChart.showLoading();
remoteApi.queryTopicHisData(_date,$scope.selectedTopic,function (resp) {
$scope.topicLineChart.hideLoading();
if (resp.status == 0) {
var _data = {};
_data[$scope.selectedTopic] = resp.data;
var _xAxisData = $scope.selectedTopic;
$scope.topicLineChart.setOption(getTopicLineChart(_xAxisData,_data));
}else{
Notification.error({message: "" + resp.errMsg, delay: 2000});
}
})
}
//router after will clear this thread
$rootScope._thread = setInterval( queryLineData, tools.dashboardRefreshTime);
}]);