Skip to content
Snippets Groups Projects
Commit 336d7c1a authored by Julian Rother's avatar Julian Rother
Browse files

Added db cluster status page

parent 311d687d
Branches
No related tags found
No related merge requests found
......@@ -42,6 +42,9 @@ if config['DB_ENGINE'] == 'sqlite':
params = [(p.replace(microsecond=0) if isinstance(p, datetime) else p) for p in params]
return operation, params
def show(operation, host=None):
return {}
elif config['DB_ENGINE'] == 'mysql':
import mysql.connector
......@@ -57,6 +60,29 @@ elif config['DB_ENGINE'] == 'mysql':
params = [(p.replace(microsecond=0) if isinstance(p, datetime) else p) for p in params]
return operation, params
def show(operation, host=config.get('MYSQL_HOST', None)):
if host:
db = mysql.connector.connect(user=config['MYSQL_USER'], password=config['MYSQL_PASSWD'], host=host, port=config.get('MYSQL_PORT', 3306))
else:
db = mysql.connector.connect(user=config['MYSQL_USER'], password=config['MYSQL_PASSWD'], unix_socket=config.get('MYSQL_UNIX', None))
cur = db.cursor()
cur.execute(operation)
rows = []
try:
rows = cur.fetchall()
except mysql.connector.errors.InterfaceError as ie:
if ie.msg == 'No result set to fetch from.':
# no problem, we were just at the end of the result set
pass
else:
raise
res = {}
for row in rows:
res[row[0]] = row[1]
cur.close()
db.close()
return res
def query(operation, *params, delim="sep"):
operation, params = fix_query(operation, params)
cur = get_dbcursor()
......
......@@ -70,7 +70,7 @@ app.jinja_env.globals['gitversion'] = { 'hash': output[1], 'longhash': output[0]
if not config.get('SECRET_KEY', None):
config['SECRET_KEY'] = os.urandom(24)
from db import query, modify, searchquery, ldapauth, ldapget
from db import query, modify, show, searchquery, ldapauth, ldapget
mod_endpoints = []
......@@ -617,7 +617,33 @@ def legacy(phpfile=None):
return redirect(url_for('feed', handle=request.args.copy().popitem()[0]),code=302)
print("Unknown legacy url:",request.url)
return redirect(url_for('index'),code=302)
import json
@app.route('/internal/dbstatus')
@register_navbar('DB-Status', icon='ok')
@mod_required
def dbstatus():
hosts = set()
clusters = {}
status = {}
variables = {}
for host in config.get('MYSQL_DBSTATUS_HOSTS', [])+[config.get('MYSQL_HOST', None)]:
for _host in show('SHOW VARIABLES LIKE "wsrep_cluster_address"', host=host)['wsrep_cluster_address'][len('gcomm://'):].split(','):
hosts.add(_host)
for host in hosts:
try:
status[host] = show('SHOW GLOBAL STATUS LIKE "wsrep%"', host=host)
variables[host] = show('SHOW GLOBAL VARIABLES LIKE "wsrep%"', host=host)
except:
status[host] = {'wsrep_cluster_state_uuid': '', 'wsrep_local_state_comment': 'Not reachable', 'wsrep_cluster_conf_id': '0', 'wsrep_cluster_status': 'Unknown'}
variables[host] = {'wsrep_node_name': host, 'wsrep_cluster_name': 'unknown'}
cluster = variables[host]['wsrep_cluster_name']+'-'+status[host]['wsrep_cluster_conf_id']
if cluster not in clusters:
clusters[cluster] = []
clusters[cluster].append(host)
return render_template('dbstatus.html', clusters=clusters, statuses=status, vars=variables), 200
import edit
import feeds
import importer
......
{% extends "base.html" %}
{% block content %}
<div class="panel panel-default">
<div class="panel-heading"><h1 class="panel-title">Cluster</b></h1></div>
<ul class="list-group">
{% for clustername, clusternodes in clusters.items() %}
<li class="list-group-item"><strong>{{vars[clusternodes|first]['wsrep_cluster_name']}}</strong> ({{statuses[clusternodes|first]['wsrep_cluster_status']}}, Größe={{statuses[clusternodes|first]['wsrep_cluster_size']}}, Konfiguration={{statuses[clusternodes|first]['wsrep_cluster_conf_id']}})
<ul class="list-group">
{% for host in clusternodes %}
<li class="list-group-item list-group-item-{{{'1': 'warning', '2': 'warning', '3': 'info', '4': 'success'}.get(statuses[host]['wsrep_local_state'], 'danger')}}"><a href="#{{host|tagid}}">{{vars[host]['wsrep_node_name']}}</a> ({{statuses[host]['wsrep_local_state_comment']}}, Letzte Änderung={{statuses[host]['wsrep_last_committed']}}, Recv.-Avg.={{statuses[host]['wsrep_local_recv_queue_avg']}}, Send-Avg.={{statuses[host]['wsrep_local_send_queue_avg']}})</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
</table>
</div>
{% for host, status in statuses.items() %}
<div class="panel panel-default" id="{{host|tagid}}">
<div class="panel-heading"><h1 class="panel-title">{{vars[host]['wsrep_node_name']}}</h1></div>
<div class="row" style="margin: 0px;">
<div class="col-xs-6 table-responsive">
<table class="table">
<tr>
<th>Variable</th>
<th>Wert</th>
</tr>
{% for key, value in vars[host].items() %}
<tr>
<td>{{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</table>
</div>
<div class="col-xs-6 table-responsive">
<table class="table">
<tr>
<th>Status-Variable</th>
<th>Wert</th>
</tr>
{% for key, value in status.items() %}
<tr>
<td>{{key}}</td>
<td>{{value}}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment