Bugs
pull/30/head
Aidaho12 2018-08-05 20:37:14 +06:00
parent 2cc270859f
commit b02cc2fc07
10 changed files with 212 additions and 36 deletions

View File

@ -361,12 +361,16 @@ if form.getvalue('metrics'):
from bokeh.layouts import widgetbox, gridplot from bokeh.layouts import widgetbox, gridplot
from bokeh.models.widgets import Button, RadioButtonGroup, Select from bokeh.models.widgets import Button, RadioButtonGroup, Select
import pandas as pd import pandas as pd
import json import http.cookies
servers = sql.select_servers_metrics() cookie = http.cookies.SimpleCookie(os.environ.get("HTTP_COOKIE"))
user_id = cookie.get('uuid')
servers = sql.select_servers_metrics(user_id.value)
p = {} p = {}
k = 0
for serv in servers: for serv in servers:
k += 1
serv = serv[0] serv = serv[0]
p[serv] = {} p[serv] = {}
metric = sql.select_metrics(serv) metric = sql.select_metrics(serv)
@ -394,7 +398,7 @@ if form.getvalue('metrics'):
x_max = df.index.max() + pd.Timedelta(minutes=1) x_max = df.index.max() + pd.Timedelta(minutes=1)
p[serv] = figure( p[serv] = figure(
tools="pan,box_zoom,reset,wheel_zoom", tools="pan,box_zoom,reset,xwheel_zoom",
title=metric[0][0], title=metric[0][0],
x_axis_type="datetime", y_axis_label='Connections', x_axis_type="datetime", y_axis_label='Connections',
x_range = (x_max.timestamp()*1000-60*100000, x_max.timestamp()*1000) x_range = (x_max.timestamp()*1000-60*100000, x_max.timestamp()*1000)
@ -404,25 +408,32 @@ if form.getvalue('metrics'):
tooltips=[ tooltips=[
("Connections", "@curr_con"), ("Connections", "@curr_con"),
("SSL connections", "@curr_ssl_con"), ("SSL connections", "@curr_ssl_con"),
("Sessions rate", "@sess_rate"), ("Sessions rate", "@sess_rate")
("Max sessions rate", "@max_sess_rate"),
], ],
mode='mouse' mode='mouse'
) )
p[serv].ygrid.band_fill_color = "olive" p[serv].ygrid.band_fill_color = "#f3f8fb"
p[serv].ygrid.band_fill_alpha = 0.1 #p[serv].ygrid.band_fill_alpha = 0.1
p[serv].y_range.start = 0 p[serv].y_range.start = 0
p[serv].y_range.end = int(df['max_sess_rate'].max()) + 100 p[serv].y_range.end = int(df['curr_con'].max()) + 150
p[serv].add_tools(hover) p[serv].add_tools(hover)
p[serv].title.text_font_size = "20px" p[serv].title.text_font_size = "20px"
p[serv].line("Date", "curr_con", source=source, alpha=0.5, color='#5cb85c', line_width=2, legend="Conn") if k == 1:
p[serv].line("Date", "curr_ssl_con", source=source, alpha=0.5, color="#5d9ceb", line_width=2, legend="SSL con") p[serv].line("Date", "curr_con", source=source, alpha=0.5, color='#5cb85c', line_width=2, legend="Conn")
p[serv].line("Date", "sess_rate", source=source, alpha=0.5, color="#33414e", line_width=2, legend="Sessions") p[serv].line("Date", "curr_ssl_con", source=source, alpha=0.5, color="#5d9ceb", line_width=2, legend="SSL con")
p[serv].line("Date", "max_sess_rate", source=source, alpha=0.5, color="red", line_width=2, legend="Max sess") p[serv].line("Date", "sess_rate", source=source, alpha=0.5, color="#33414e", line_width=2, legend="Sessions")
p[serv].legend.orientation = "horizontal" #p[serv].line("Date", "max_sess_rate", source=source, alpha=0.5, color="red", line_width=2, legend="Max sess")
p[serv].legend.orientation = "horizontal"
p[serv].legend.location = "top_left"
p[serv].legend.padding = 5
else:
p[serv].line("Date", "curr_con", source=source, alpha=0.5, color='#5cb85c', line_width=2)
p[serv].line("Date", "curr_ssl_con", source=source, alpha=0.5, color="#5d9ceb", line_width=2)
p[serv].line("Date", "sess_rate", source=source, alpha=0.5, color="#33414e", line_width=2)
#p[serv].line("Date", "max_sess_rate", source=source, alpha=0.5, color="red", line_width=2)
#select = Select(title="Option:", value="foo", options=["foo", "bar", "baz", "quux"]) #select = Select(title="Option:", value="foo", options=["foo", "bar", "baz", "quux"])
#show(widgetbox(select, width=300)) #show(widgetbox(select, width=300))
@ -430,8 +441,6 @@ if form.getvalue('metrics'):
i = 0 i = 0
for key, value in p.items(): for key, value in p.items():
plots.append(value) plots.append(value)
#plots = plots.sort()
grid = gridplot(plots, ncols=2, plot_width=800, plot_height=250, toolbar_location = "left", toolbar_options=dict(logo=None)) grid = gridplot(plots, ncols=2, plot_width=800, plot_height=250, toolbar_location = "left", toolbar_options=dict(logo=None))
show(grid) show(grid)

View File

@ -679,17 +679,33 @@ def select_metrics(serv, **kwargs):
cur.close() cur.close()
con.close() con.close()
def select_servers_metrics(**kwargs): def select_servers_metrics(uuid, **kwargs):
con, cur = create_db.get_cur() con, cur = create_db.get_cur()
sql = """ select ip from servers where metrics = '1' """ sql = """ select * from user where username = '%s' """ % get_user_name_by_uuid(uuid)
if kwargs.get('disable') == 0:
disable = 'or enable = 0'
else:
disable = ''
try: try:
cur.execute(sql) cur.execute(sql)
except sqltool.Error as e: except sqltool.Error as e:
print('<span class="alert alert-danger" id="error">An error occurred: ' + e + ' <a title="Close" id="errorMess"><b>X</b></a></span>') print("An error occurred:", e)
else: else:
return cur.fetchall() for group in cur:
if group[5] == '1':
sql = """ select ip from servers where enable = 1 %s and metrics = '1' """ % (disable)
else:
sql = """ select ip from servers where groups like '%{group}%' and metrics = '1'""".format(group=group[5])
try:
cur.execute(sql)
except sqltool.Error as e:
print("An error occurred:", e.args[0])
else:
return cur.fetchall()
cur.close() cur.close()
con.close() con.close()
def show_update_telegram(token, page): def show_update_telegram(token, page):
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader

View File

@ -31,7 +31,7 @@
</tr> </tr>
<tr> <tr>
{% for user in users %} {% for user in users %}
<tr id="user-{{user.0}}"> <tr id="user-{{user.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"><input type="text" id="login-{{user.0}}" value="{{user.1}}" class="form-control"></td> <td class="padding10 first-collumn"><input type="text" id="login-{{user.0}}" value="{{user.1}}" class="form-control"></td>
<td><input type="password" id="password-{{user.0}}" value="{{user.3}}" class="form-control"></td> <td><input type="password" id="password-{{user.0}}" value="{{user.3}}" class="form-control"></td>
<td><input type="text" id="email-{{user.0}}" value="{{user.2}}" class="form-control"></td> <td><input type="text" id="email-{{user.0}}" value="{{user.2}}" class="form-control"></td>
@ -116,7 +116,7 @@
<td></td> <td></td>
</tr> </tr>
{% for group in groups %} {% for group in groups %}
<tr id="group-{{ group.0 }}"> <tr id="group-{{ group.0 }}" class="{{ loop.cycle('odd', 'even') }}">
{% if group.1 == All %} {% if group.1 == All %}
<td class="padding10 first-collumn">{{ group.1 }}</td> <td class="padding10 first-collumn">{{ group.1 }}</td>
<td>{{ group.2 }}</td> <td>{{ group.2 }}</td>
@ -172,7 +172,7 @@
</tr> </tr>
{% for server in servers %} {% for server in servers %}
<tr id="server-{{server.0}}"> <tr id="server-{{server.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"> <td class="padding10 first-collumn">
<input type="text" id="hostname-{{server.0}}" value="{{server.1}}" class="form-control"> <input type="text" id="hostname-{{server.0}}" value="{{server.1}}" class="form-control">
</td> </td>
@ -324,7 +324,7 @@
</tr> </tr>
<tr> <tr>
{% for role in roles %} {% for role in roles %}
<tr id="group-{{role.0}}"> <tr id="group-{{role.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn">{{role.1}}</td> <td class="padding10 first-collumn">{{role.1}}</td>
<td>{{role.2}}</td> <td>{{role.2}}</td>
</tr> </tr>
@ -348,7 +348,7 @@
<td></td> <td></td>
</tr> </tr>
{% for ssh in sshs %} {% for ssh in sshs %}
<tr style="width: 50%;" id="ssh-table-{{ssh.0}}"> <tr style="width: 50%;" id="ssh-table-{{ssh.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="first-collumn"> <td class="first-collumn">
<input type="text" id="ssh_name-{{ssh.0}}" class="form-control" value="{{ssh.1}}" style="margin-bottom: 23px;"> <input type="text" id="ssh_name-{{ssh.0}}" class="form-control" value="{{ssh.1}}" style="margin-bottom: 23px;">
</td> </td>
@ -461,7 +461,7 @@
<td></td> <td></td>
</tr> </tr>
{% for telegram in telegrams %} {% for telegram in telegrams %}
<tr id="telegram-table-{{telegram.0}}"> <tr id="telegram-table-{{telegram.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="first-collumn" style="padding-top: 20px;"> <td class="first-collumn" style="padding-top: 20px;">
<input type="text" id="telegram-token-{{telegram.0}}" class="form-control" value="{{telegram.1}}" style="margin-bottom: 23px;"> <input type="text" id="telegram-token-{{telegram.0}}" class="form-control" value="{{telegram.1}}" style="margin-bottom: 23px;">
</td> </td>

View File

@ -1,5 +1,5 @@
{% for service in service_status %} {% for service in service_status %}
<tr> <tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"> <td class="padding10 first-collumn">
<a href="#{{ service.0 }}" title="Go to {{ service.0 }} status" style="color: #000">{{ service.0 }}</a> <a href="#{{ service.0 }}" title="Go to {{ service.0 }} status" style="color: #000">{{ service.0 }}</a>
</td> </td>

View File

@ -24,7 +24,7 @@
{% for USER in users %} {% for USER in users %}
{% set counter = counter + loop.index0 %} {% set counter = counter + loop.index0 %}
{% if counter <= 2 %} {% if counter <= 2 %}
<tr> <tr class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"> {{ USER.1 }}</td> <td class="padding10 first-collumn"> {{ USER.1 }}</td>
<td class="padding10"> {{ USER.2 }}</td> <td class="padding10"> {{ USER.2 }}</td>
{% for group in groups %} {% for group in groups %}
@ -36,7 +36,7 @@
<td></td> <td></td>
</tr> </tr>
{% else %} {% else %}
<tr style="display: none;" class="show-users"> <tr style="display: none;" class="show-users {{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"> {{ USER.1 }}</td> <td class="padding10 first-collumn"> {{ USER.1 }}</td>
<td class="padding10"> {{ USER.2 }}</td> <td class="padding10"> {{ USER.2 }}</td>
{% for group in groups %} {% for group in groups %}

View File

@ -32,7 +32,7 @@
{% set ssh_group = [] %} {% set ssh_group = [] %}
{% for server in servers %} {% for server in servers %}
{% do ssh_group.append(server.3) %} {% do ssh_group.append(server.3) %}
<tr id="server-{{server.0}}"> <tr id="server-{{server.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="padding10 first-collumn"> <td class="padding10 first-collumn">
<input type="text" id="hostname-{{server.0}}" value="{{server.1}}" class="form-control"> <input type="text" id="hostname-{{server.0}}" value="{{server.1}}" class="form-control">
</td> </td>
@ -177,7 +177,7 @@
</tr> </tr>
{% for ssh in sshs %} {% for ssh in sshs %}
{% if ssh.5|string() == group %} {% if ssh.5|string() == group %}
<tr style="width: 50%;" id="ssh-table-{{ssh.0}}"> <tr style="width: 50%;" id="ssh-table-{{ssh.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="first-collumn"> <td class="first-collumn">
<input type="text" id="ssh_name-{{ssh.0}}" class="form-control" value="{{ssh.1}}" style="margin-bottom: 23px;"> <input type="text" id="ssh_name-{{ssh.0}}" class="form-control" value="{{ssh.1}}" style="margin-bottom: 23px;">
<input type="hidden" id="new-ssh-group-add" name="new-ssh-group-add" value="{{ ssh_group }}" > <input type="hidden" id="new-ssh-group-add" name="new-ssh-group-add" value="{{ ssh_group }}" >
@ -275,7 +275,7 @@
</tr> </tr>
{% for telegram in telegrams %} {% for telegram in telegrams %}
{% if telegram.3|string() == group %} {% if telegram.3|string() == group %}
<tr style="width: 50%;" id="telegram-table-{{telegram.0}}"> <tr style="width: 50%;" id="telegram-table-{{telegram.0}}" class="{{ loop.cycle('odd', 'even') }}">
<td class="first-collumn" style="padding-top: 20px;"> <td class="first-collumn" style="padding-top: 20px;">
<input type="text" id="telegram-token-{{telegram.0}}" class="form-control" value="{{telegram.1}}" style="margin-bottom: 23px;"> <input type="text" id="telegram-token-{{telegram.0}}" class="form-control" value="{{telegram.1}}" style="margin-bottom: 23px;">
</td> </td>

View File

@ -0,0 +1,80 @@
#!/usr/bin/env python3
import subprocess
import time
import argparse
import os, sys
sys.path.append(os.path.join(sys.path[0], os.path.dirname(os.getcwd())))
sys.path.append(os.path.join(sys.path[0], os.getcwd()))
import funct
import sql
import signal
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
def main():
sql.delete_mentrics()
servers = sql.select_servers_metrics()
started_workers = get_worker()
servers_list = []
for serv in servers:
servers_list.append(serv[0])
need_kill=list(set(started_workers) - set(servers_list))
need_start=list(set(servers_list) - set(started_workers))
if need_kill:
for serv in need_kill:
kill_worker(serv)
if need_start:
for serv in need_start:
start_worker(serv)
def start_worker(serv):
port = funct.get_config_var('haproxy', 'haproxy_sock_port')
cmd = "tools/metrics_worker.py %s --port %s &" % (serv, port)
os.system(cmd)
funct.logging("localhost", " Masrer started new metrics worker for: "+serv, metrics=1)
def kill_worker(serv):
cmd = "ps ax |grep 'tools/metrics_worker.py %s'|grep -v grep |awk '{print $1}' |xargs kill" % serv
output, stderr = funct.subprocess_execute(cmd)
funct.logging("localhost", " Masrer killed metrics worker for: "+serv, metrics=1)
if stderr:
funct.logging("localhost", stderr, metrics=1)
def kill_all_workers():
cmd = "ps ax |grep 'tools/metrics_worker.py' |grep -v grep |awk '{print $1}' |xargs kill"
output, stderr = funct.subprocess_execute(cmd)
funct.logging("localhost", " Masrer killing all metrics workers", metrics=1)
if stderr:
funct.logging("localhost", stderr, metrics=1)
def get_worker():
cmd = "ps ax |grep 'tools/metrics_worker.py' |grep -v grep |awk '{print $7}'"
output, stderr = funct.subprocess_execute(cmd)
if stderr:
funct.logging("localhost", stderr, metrics=1)
return output
if __name__ == "__main__":
funct.logging("localhost", " Metrics master started", metrics=1)
killer = GracefulKiller()
while True:
main()
time.sleep(20)
if killer.kill_now:
break
kill_all_workers()
funct.logging("localhost", " Master shutdown", metrics=1)

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python3
import subprocess
from subprocess import check_output, CalledProcessError
import time
import argparse
import os, sys
sys.path.append(os.path.join(sys.path[0], os.path.dirname(os.getcwd())))
sys.path.append(os.path.join(sys.path[0], os.getcwd()))
import sql
import signal
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
def main(serv, port):
port = str(port)
firstrun = True
currentstat = []
readstats = ""
killer = GracefulKiller()
old_stat_service = ""
while True:
try:
cmd = "echo show info | nc "+serv+" "+port+" |grep -e 'Curr\|MaxSessRate:\|SessRate:'|awk '{print $2}'"
readstats = subprocess.check_output([cmd], shell=True)
except CalledProcessError as e:
print("Command error")
except OSError as e:
print(e)
sys.exit()
readstats = readstats.decode(encoding='UTF-8')
metric = readstats.splitlines()
metrics = []
for i in range(0,len(metric)):
metrics.append(metric[i])
sql.insert_mentrics(serv, metrics[0], metrics[1], metrics[2], metrics[3])
time.sleep(30)
if killer.kill_now:
break
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Metrics HAProxy service.', prog='check_haproxy.py', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('IP', help='Start get metrics from HAProxy service at this ip', nargs='?', type=str)
parser.add_argument('--port', help='Start get metrics from HAProxy service at this port', nargs='?', default=1999, type=int)
args = parser.parse_args()
if args.IP is None:
parser.print_help()
import sys
sys.exit()
else:
try:
main(args.IP, args.port)
except KeyboardInterrupt:
pass

View File

@ -26,7 +26,9 @@ window.onblur= function() {
showOverview(); showOverview();
} else if (cur_url[0] == "viewlogs.py") { } else if (cur_url[0] == "viewlogs.py") {
viewLogs(); viewLogs();
} } else if (cur_url[0] == "metrics.py") {
loadMetrics();
}
} }
} }
}; };

View File

@ -596,4 +596,7 @@ label {
margin-bottom: 5px; margin-bottom: 5px;
font-weight: bold; font-weight: bold;
padding-right: 10px; padding-right: 10px;
}
.even {
background-color: #f3f8fb;
} }