mirror of https://github.com/Aidaho12/haproxy-wi
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
683 lines
20 KiB
683 lines
20 KiB
function getHttpChartData(server) { |
|
var hide_http_metrics = localStorage.getItem('hide_http_metrics'); |
|
if (hide_http_metrics == 'disabled') { |
|
return false; |
|
} |
|
$.ajax({ |
|
url: "/app/metrics/haproxy/" + server + "/http", |
|
data: { |
|
time_range: $( "#time-range option:selected" ).val(), |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.http_2xx); |
|
data.push(result.chartData.http_3xx); |
|
data.push(result.chartData.http_4xx); |
|
data.push(result.chartData.http_5xx); |
|
data.push('HTTP statuses for '+result.chartData.server); |
|
|
|
var labels = result.chartData.labels; |
|
renderHttpChart(data, labels, server); |
|
} |
|
}); |
|
} |
|
var charts = [] |
|
function renderHttpChart(data, labels, server) { |
|
// Преобразование данных в массивы |
|
const dataArray0 = data[0].split(','); |
|
const dataArray1 = data[1].split(','); |
|
const dataArray2 = data[2].split(','); |
|
const dataArray3 = data[3].split(','); |
|
|
|
// Удаление последнего пустого элемента в каждом массиве |
|
dataArray0.pop(); |
|
dataArray1.pop(); |
|
dataArray2.pop(); |
|
dataArray3.pop(); |
|
|
|
var ctx = document.getElementById('http_' + server).getContext('2d'); |
|
var myChart = new Chart(ctx, { |
|
type: 'line', |
|
data: { |
|
labels: labels.split(','), |
|
datasets: [ |
|
{ |
|
normalized: true, |
|
label: '2xx', |
|
data: dataArray0, |
|
borderColor: 'rgba(75, 192, 192, 1)', |
|
backgroundColor: 'rgba(75, 192, 192, 0.2)', |
|
fill: true |
|
}, |
|
{ |
|
normalized: true, |
|
label: '3xx', |
|
data: dataArray1, |
|
borderColor: 'rgba(54, 162, 235, 1)', |
|
backgroundColor: 'rgba(54, 162, 235, 0.2)', |
|
fill: true |
|
}, |
|
{ |
|
normalized: true, |
|
label: '4xx', |
|
data: dataArray2, |
|
borderColor: 'rgba(255, 206, 86, 1)', |
|
backgroundColor: 'rgba(255, 206, 86, 0.2)', |
|
fill: true |
|
}, |
|
{ |
|
normalized: true, |
|
label: '5xx', |
|
dataArray3, |
|
borderColor: 'rgb(255,86,86)', |
|
backgroundColor: 'rgba(255,86,86,0.2)', |
|
fill: true |
|
}, |
|
], |
|
}, |
|
options: { |
|
maintainAspectRatio: false, |
|
plugins: { |
|
title: { |
|
display: true, |
|
text: data[4], |
|
font: { |
|
size: 20, |
|
}, |
|
padding: { |
|
top: 0, |
|
}, |
|
}, |
|
}, |
|
scales: { |
|
y: { |
|
ticks: { |
|
beginAtZero: true, |
|
}, |
|
}, |
|
x: { |
|
ticks: { |
|
beginAtZero: true, |
|
major: { |
|
enabled: true, |
|
fontStyle: 'bold', |
|
}, |
|
source: 'data', |
|
autoSkip: true, |
|
autoSkipPadding: 45, |
|
maxRotation: 0, |
|
}, |
|
}, |
|
}, |
|
legend: { |
|
display: true, |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { |
|
size: 10, |
|
family: 'BlinkMacSystemFont', |
|
}, |
|
}, |
|
}, |
|
}, |
|
}); |
|
charts.push(myChart); |
|
} |
|
function getChartData(server) { |
|
$.ajax({ |
|
url: "/app/metrics/haproxy/" + server, |
|
data: { |
|
time_range: $( "#time-range option:selected" ).val(), |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.curr_con); |
|
data.push(result.chartData.curr_ssl_con); |
|
data.push(result.chartData.sess_rate); |
|
data.push(result.chartData.server); |
|
|
|
var labels = result.chartData.labels; |
|
renderChart(data, labels, server); |
|
} |
|
}); |
|
} |
|
function renderChart(data, labels, server) { |
|
// Преобразование данных в массивы |
|
const dataArray0 = data[0].split(','); |
|
const dataArray1 = data[1].split(','); |
|
const dataArray2 = data[2].split(','); |
|
|
|
// Удаление последнего пустого элемента в каждом массиве |
|
dataArray0.pop(); |
|
dataArray1.pop(); |
|
dataArray2.pop(); |
|
var ctx = document.getElementById(server); |
|
var myChart = new Chart(ctx, { |
|
type: 'line', |
|
data: { |
|
labels: labels.split(','), |
|
datasets: [ |
|
{ |
|
normalized: true, |
|
label: 'Connections', |
|
data: dataArray0, |
|
borderColor: 'rgba(75, 192, 192, 1)', |
|
backgroundColor: 'rgba(75, 192, 192, 0.2)', |
|
fill: true |
|
}, |
|
{ |
|
normalized: true, |
|
label: 'SSL Connections', |
|
data: dataArray1, |
|
borderColor: 'rgba(54, 162, 235, 1)', |
|
backgroundColor: 'rgba(54, 162, 235, 0.2)', |
|
fill: true |
|
}, |
|
{ |
|
normalized: true, |
|
label: 'Session rate', |
|
data: dataArray2, |
|
borderColor: 'rgba(255, 206, 86, 1)', |
|
backgroundColor: 'rgba(255, 206, 86, 0.2)', |
|
fill: true |
|
} |
|
] |
|
}, |
|
options: { |
|
maintainAspectRatio: false, |
|
scales: { |
|
y: { |
|
beginAtZero: true, |
|
}, |
|
x: { |
|
ticks: { |
|
major: { |
|
enabled: true, |
|
fontStyle: 'bold' |
|
}, |
|
source: 'data', |
|
autoSkip: true, |
|
autoSkipPadding: 45, |
|
maxRotation: 0 |
|
} |
|
} |
|
}, |
|
plugins: { |
|
title: { |
|
display: true, |
|
text: data[3], |
|
font: { |
|
size: 20, |
|
}, |
|
padding: { |
|
top: 0, |
|
}, |
|
}, |
|
legend: { |
|
display: true, |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { |
|
size: 10, |
|
family: 'BlinkMacSystemFont' |
|
} |
|
}, |
|
} |
|
} |
|
} |
|
}); |
|
charts.push(myChart); |
|
} |
|
function getWafChartData(server) { |
|
$.ajax({ |
|
url: "/app/metrics/waf/" + server, |
|
data: { |
|
time_range: $( "#time-range option:selected" ).val(), |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.curr_con); |
|
data.push(result.chartData.server); |
|
var labels = result.chartData.labels; |
|
renderServiceChart(data, labels, server, 'waf'); |
|
} |
|
}); |
|
} |
|
function renderServiceChart(data, labels, server, service) { |
|
const dataArray = data[0].split(','); |
|
|
|
// Удаление последнего пустого элемента в каждом массиве |
|
dataArray.pop(); |
|
var ctx = document.getElementById(service + '_' + server).getContext('2d'); |
|
var additional_title = ''; |
|
if (service === 'waf') { |
|
additional_title = 'WAF '; |
|
} |
|
var myChart = new Chart(ctx, { |
|
type: 'line', |
|
data: { |
|
labels: labels.split(','), |
|
datasets: [ |
|
{ |
|
normalized: true, |
|
label: 'Connections', |
|
data: dataArray, |
|
borderColor: 'rgba(75, 192, 192, 1)', |
|
backgroundColor: 'rgba(75, 192, 192, 0.2)', |
|
fill: true |
|
} |
|
] |
|
}, |
|
options: { |
|
animation: false, |
|
maintainAspectRatio: false, |
|
plugins: { |
|
title: { |
|
display: true, |
|
text: additional_title + data[1], |
|
font: { |
|
size: 20 |
|
}, |
|
padding: { |
|
top: 0 |
|
} |
|
}, |
|
legend: { |
|
display: true, |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { |
|
size: '10', |
|
family: 'BlinkMacSystemFont' |
|
} |
|
} |
|
} |
|
}, |
|
scales: { |
|
y: { |
|
beginAtZero: true |
|
}, |
|
x: { |
|
ticks: { |
|
major: { |
|
enabled: true, |
|
fontStyle: 'bold' |
|
}, |
|
source: 'data', |
|
autoSkip: true, |
|
autoSkipPadding: 45, |
|
maxRotation: 0 |
|
} |
|
} |
|
} |
|
} |
|
}); |
|
charts.push(myChart); |
|
} |
|
function getNginxChartData(server) { |
|
$.ajax({ |
|
url: "/app/metrics/nginx/" + server, |
|
data: { |
|
time_range: $( "#time-range option:selected" ).val(), |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.curr_con); |
|
data.push(result.chartData.server); |
|
var labels = result.chartData.labels; |
|
renderServiceChart(data, labels, server, 'nginx'); |
|
} |
|
}); |
|
} |
|
function getApacheChartData(server) { |
|
$.ajax({ |
|
url: "/app/metrics/apache/" + server, |
|
data: { |
|
time_range: $( "#time-range option:selected" ).val(), |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.curr_con); |
|
data.push(result.chartData.server); |
|
var labels = result.chartData.labels; |
|
renderServiceChart(data, labels, server, 'apache'); |
|
} |
|
}); |
|
} |
|
function loadMetrics() { |
|
var service = $('#service').val(); |
|
$.ajax({ |
|
url: "/app/metrics/" + service + "/table-metrics", |
|
beforeSend: function () { |
|
$('#table_metrics').html('<img class="loading_full_page" src="/app/static/images/loading.gif" />') |
|
}, |
|
type: "GET", |
|
success: function (data) { |
|
if (data.indexOf('error:') != '-1') { |
|
toastr.error(data); |
|
} else { |
|
$("#table_metrics").html(data); |
|
} |
|
} |
|
}); |
|
} |
|
function getChartDataHapWiRam(ip) { |
|
$.ajax({ |
|
url: "/app/metrics/ram", |
|
data: { |
|
metrics_hapwi_ram: '1', |
|
ip: ip, |
|
token: $('#token').val() |
|
}, |
|
beforeSend: function() { |
|
$('#ram').html('<img class="loading_hapwi_overview" src="/app/static/images/loading.gif" />') |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.rams); |
|
// Получение значений из строки и разделение их на массив |
|
const ramsData = data[0].trim().split(' '); |
|
|
|
// Преобразование значений в числа |
|
const formattedData = ramsData.map(value => parseFloat(value)); |
|
renderChartHapWiRam(formattedData); |
|
} |
|
}); |
|
} |
|
function renderChartHapWiRam(data) { |
|
var ctx = document.getElementById('ram').getContext('2d'); |
|
var myChart = new Chart(ctx, { |
|
type: 'bar', |
|
data: { |
|
labels: ['total','used','free','shared','buff','available'], |
|
datasets: [ |
|
{ |
|
normalized: true, |
|
data: data, |
|
backgroundColor: [ |
|
'#36a2eb', |
|
'#ff6384', |
|
'#33ff26', |
|
'#ff9f40', |
|
'#ffcd56', |
|
'#4bc0c0', |
|
] |
|
} |
|
] |
|
}, |
|
options: { |
|
maintainAspectRatio: false, |
|
plugins: { |
|
title: { |
|
display: true, |
|
text: "RAM usage in Mb", |
|
font: { |
|
size: 15 |
|
}, |
|
padding: { |
|
top: 10, |
|
bottom: 0 |
|
} |
|
}, |
|
legend: { |
|
display: false, |
|
align: 'start', |
|
position: 'left', |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { |
|
size: 5, |
|
family: 'BlinkMacSystemFont' |
|
}, |
|
boxWidth: 13, |
|
padding: 5 |
|
}, |
|
} |
|
} |
|
} |
|
}); |
|
charts.push(myChart); |
|
} |
|
function getChartDataHapWiCpu(ip) { |
|
$.ajax({ |
|
url: "/app/metrics/cpu", |
|
data: { |
|
metrics_hapwi_cpu: '1', |
|
ip: ip, |
|
token: $('#token').val() |
|
}, |
|
type: "POST", |
|
success: function (result) { |
|
// Получение значений из строки и разделение их на массив |
|
const ramsData = result.chartData.cpus.trim().split(' ').map(parseFloat); |
|
|
|
// Преобразование значений в числа |
|
const formattedData = ramsData.map(value => parseFloat(value)); |
|
renderChartHapWiCpu(formattedData); |
|
} |
|
}); |
|
} |
|
function renderChartHapWiCpu(data) { |
|
var ctx = document.getElementById('cpu').getContext('2d'); |
|
var myChart = new Chart(ctx, { |
|
type: 'bar', |
|
data: { |
|
labels: ['user','sys','nice','idle','wait','hi','si','steal'], |
|
datasets: [ |
|
{ |
|
normalized: true, |
|
data: data, |
|
backgroundColor: [ |
|
'#ff6384', |
|
'#36a2eb', |
|
'#ff9f40', |
|
'#ffcd56', |
|
'#4bc0c0', |
|
'#5d9ceb', |
|
'#2c6969', |
|
] |
|
} |
|
] |
|
}, |
|
options: { |
|
animation: true, |
|
maintainAspectRatio: false, |
|
plugins: { |
|
title: { |
|
display: true, |
|
text: "CPU usage in %", |
|
font: { size: 15 }, |
|
padding: { top: 10 } |
|
}, |
|
legend: { |
|
display: false, |
|
position: 'left', |
|
align: 'end', |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { size: 10, family: 'BlinkMacSystemFont' }, |
|
color: 'black', |
|
boxWidth: 13, |
|
padding: 5 |
|
}, |
|
} |
|
}, |
|
scales: { |
|
x: { |
|
ticks: { |
|
max: 100, |
|
min: 100 |
|
} |
|
} |
|
}, |
|
} |
|
}); |
|
charts.push(myChart); |
|
} |
|
$( function() { |
|
$('#dis_table_metric').click(function() { |
|
localStorage.setItem('table_metrics', 0); |
|
$('#body_table_metrics').css('display', 'none'); |
|
$('#en_table_metric').css('display', 'inline'); |
|
$('#dis_table_metric').css('display', 'none'); |
|
}); |
|
$('#en_table_metric').click(function() { |
|
localStorage.setItem('table_metrics', 1); |
|
$('#en_table_metric').css('display', 'none'); |
|
$('#dis_table_metric').css('display', 'inline'); |
|
loadMetrics(); |
|
}); |
|
|
|
// Check is showing http metrics enabled |
|
var hide_http_metrics = localStorage.getItem('hide_http_metrics'); |
|
if(hide_http_metrics === null) { |
|
$('#hide_http_metrics').prop('checked', false); |
|
$('#hide_http_metrics').checkboxradio('refresh'); |
|
$('.http_metrics_div').show(); |
|
} else if (hide_http_metrics === 'disabled') { |
|
$('#hide_http_metrics').prop('checked', true); |
|
$('#hide_http_metrics').checkboxradio('refresh'); |
|
$('.http_metrics_div').hide(); |
|
} |
|
// Disable or enable showing http metrics |
|
$('#hide_http_metrics').change(function() { |
|
if($(this).is(':checked')) { |
|
localStorage.setItem('hide_http_metrics', 'disabled'); |
|
$('.http_metrics_div').hide(); |
|
showMetrics(); |
|
} else { |
|
localStorage.removeItem('hide_http_metrics'); |
|
$('.http_metrics_div').show(); |
|
showMetrics(); |
|
} |
|
}); |
|
}); |
|
function removeData() { |
|
for (i = 0; i < charts.length; i++) { |
|
chart = charts[i]; |
|
chart.destroy(); |
|
} |
|
} |
|
function showOverviewHapWI() { |
|
removeData(); |
|
getChartDataHapWiCpu('1'); |
|
getChartDataHapWiRam('1'); |
|
NProgress.configure({showSpinner: false}); |
|
} |
|
function updatingCpuRamCharts() { |
|
if (cur_url[0] == 'overview.py') { |
|
showOverviewHapWI(); |
|
} else if (cur_url[0] == 'hapservers.py' && cur_url[1].split('=')[0] == 'service') { |
|
NProgress.configure({showSpinner: false}); |
|
showOverviewHapWI(); |
|
getChartData(server_ip); |
|
getHttpChartData(server_ip); |
|
getWafChartData(server_ip); |
|
} else { |
|
removeData(); |
|
} |
|
} |
|
function getSmonHistoryCheckData(server, check_id) { |
|
$.ajax({ |
|
url: "/app/smon/history/metric/" + server + "/" + check_id, |
|
// data: { |
|
// time_range: $( "#time-range option:selected" ).val(), |
|
// }, |
|
// type: "POST", |
|
success: function (result) { |
|
var data = []; |
|
data.push(result.chartData.curr_con); |
|
var labels = result.chartData.labels; |
|
renderSMONChart(data[0], labels, '3'); |
|
} |
|
}); |
|
} |
|
function renderSMONChart(data, labels, server) { |
|
const resp_time_word = $('#translate').attr('data-resp_time'); |
|
const ctx = document.getElementById('metrics_' + server); |
|
|
|
// Преобразование данных в массивы |
|
const labelArray = labels.split(','); |
|
const dataArray = data.split(','); |
|
|
|
// Удаление последнего пустого элемента в каждом массиве |
|
labelArray.pop(); |
|
dataArray.pop(); |
|
|
|
// Создание объекта dataset |
|
const dataset = { |
|
label: resp_time_word + ' (ms)', |
|
data: dataArray, |
|
borderColor: 'rgba(92, 184, 92, 1)', |
|
backgroundColor: 'rgba(92, 184, 92, 0.2)', |
|
tension: 0.4, |
|
pointRadius: 3, |
|
borderWidth: 1, |
|
fill: true |
|
}; |
|
|
|
const config = { |
|
type: 'line', |
|
data: { |
|
labels: labelArray, |
|
datasets: [dataset] |
|
}, |
|
options: { |
|
animation: true, |
|
maintainAspectRatio: false, |
|
plugins: { |
|
title: { |
|
display: true, |
|
font: { size: 15 }, |
|
padding: { top: 10 } |
|
}, |
|
legend: { |
|
display: false, |
|
position: 'left', |
|
align: 'end', |
|
labels: { |
|
color: 'rgb(255, 99, 132)', |
|
font: { size: 10, family: 'BlinkMacSystemFont' }, |
|
color: 'black', |
|
boxWidth: 13, |
|
padding: 5 |
|
}, |
|
} |
|
}, |
|
scales: { |
|
x: { |
|
title: { |
|
display: true, |
|
text: 'Time' |
|
}, |
|
ticks: { |
|
source: 'data', |
|
autoSkip: true, |
|
autoSkipPadding: 45, |
|
maxRotation: 0 |
|
} |
|
}, |
|
y: { |
|
title: { |
|
display: true, |
|
text: resp_time_word + ' (ms)' |
|
}, |
|
ticks: { |
|
font: { |
|
size: 10 |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}; |
|
|
|
const myChart = new Chart(ctx, config); |
|
charts.push(myChart); |
|
}
|
|
|