Skip to content

Commit

Permalink
Merge 5c02abe into a53a5a6
Browse files Browse the repository at this point in the history
  • Loading branch information
mohierf committed Jan 17, 2017
2 parents a53a5a6 + 5c02abe commit b33bbbd
Show file tree
Hide file tree
Showing 5 changed files with 280 additions and 26 deletions.
24 changes: 20 additions & 4 deletions alignak_backend/app.py
Expand Up @@ -1729,7 +1729,7 @@ def cron_timeseries():


@app.route("/cron_grafana")
def cron_grafana(engine='jsonify'):
def cron_grafana(engine='jsonify'): # pylint: disable=too-many-locals
"""
Cron used to add / update grafana dashboards
Expand All @@ -1743,6 +1743,8 @@ def cron_grafana(engine='jsonify'):
services_db = current_app.data.driver.db['service']
grafana_db = current_app.data.driver.db['grafana']
realm_db = current_app.data.driver.db['realm']
graphite_db = current_app.data.driver.db['graphite']
statsd_db = current_app.data.driver.db['statsd']

for grafana in grafana_db.find():
graf = Grafana(grafana)
Expand All @@ -1751,6 +1753,17 @@ def cron_grafana(engine='jsonify'):
"create_dashboard": []
}
if graf.connection:
# get the graphites of the grafana
graphite_prefix = ''
statsd_prefix = ''
graphite = graphite_db.find_one({'grafana': grafana['_id']})
if graphite and graphite['prefix'] != '':
graphite_prefix = graphite['prefix']
if graphite and graphite['statsd']:
statsd = statsd_db.find_one({'_id': graphite['statsd']})
if statsd and statsd['prefix'] != '':
statsd_prefix = statsd['prefix']

# get the realms of the grafana
realm = realm_db.find_one({'_id': grafana['_realm']})
if grafana['_sub_realm']:
Expand All @@ -1762,10 +1775,12 @@ def cron_grafana(engine='jsonify'):
items = hosts_db.find({'ls_grafana': False, '_realm': realm['_id'],
'ls_perf_data': {"$ne": ""}, '_is_template': False})
for item in items:
created = graf.create_dashboard(item['_id'])
created = graf.create_dashboard(item['_id'],
graphite_prefix, statsd_prefix)
if created:
resp[grafana['name']]['create_dashboard'].append(item['name'])
# manage the cases hosts have new services or hosts not have ls_perf_data

# manage the case where hosts have new services or hosts do not have ls_perf_data
hosts_dashboards = {}
if grafana['_sub_realm']:
children = realm['_all_children']
Expand All @@ -1779,7 +1794,8 @@ def cron_grafana(engine='jsonify'):
if item['host'] not in hosts_dashboards:
host = hosts_db.find_one({'_id': item['host']})
if not host['_is_template']:
created = graf.create_dashboard(item['host'])
created = graf.create_dashboard(item['host'],
graphite_prefix, statsd_prefix)
if created:
resp[grafana['name']]['create_dashboard'].append(host['name'])
hosts_dashboards[item['host']] = True
Expand Down
124 changes: 102 additions & 22 deletions alignak_backend/grafana.py
Expand Up @@ -59,7 +59,8 @@ def __init__(self, data):
self.timeseries[child_realm] = influxdb
self.get_datasource()

def create_dashboard(self, host_id): # pylint: disable=too-many-locals
def create_dashboard(self, host_id, graphite_prefix='', statsd_prefix=''):
# pylint: disable=too-many-locals
"""
Create / update a dashboard in Grafana
Expand Down Expand Up @@ -96,25 +97,64 @@ def create_dashboard(self, host_id): # pylint: disable=too-many-locals
for measurement in perfdata.metrics:
fields = perfdata.metrics[measurement].__dict__
fields['name'] = fields['name'].replace(" ", "_")
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
mytarget += '.' + fields['name']
elements = {'measurement': fields['name'], 'refid': refids[num], 'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'], 'refid': refids[num],
'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics in the performance data for '%s'!\n-----"
% (host['name']))
elements = {'measurement': fields['name'], 'refid': '', 'mytarget': mytarget}

targets.append(self.generate_target(elements, {"host": hostname},
ObjectId(host['_realm'])))
num += 1
if fields['warning'] is not None:
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
num += 1
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
mytarget += '.' + fields['name'] + '_warning'
elements = {'measurement': fields['name'] + '_warning', 'refid': refids[num],
'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'] + '_warning', 'refid': refids[num],
'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics (warning) in the "
"performance data for '%s'!\n-----"
% (host['name']))
elements = {'measurement': fields['name'] + '_warning', 'refid': '',
'mytarget': mytarget}

targets.append(self.generate_target(elements, {"host": hostname},
ObjectId(host['_realm'])))
num += 1

if fields['critical'] is not None:
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
num += 1
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
mytarget += '.' + fields['name'] + '_critical'
elements = {'measurement': fields['name'] + '_critical', 'refid': refids[num],
'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'] + '_critical', 'refid': refids[num],
'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics (critical) in the "
"performance data for '%s'!\n-----"
% (host['name']))
elements = {'measurement': fields['name'] + '_critical', 'refid': '',
'mytarget': mytarget}

targets.append(self.generate_target(elements, {"host": hostname},
ObjectId(host['_realm'])))
num += 1
Expand All @@ -141,30 +181,70 @@ def create_dashboard(self, host_id): # pylint: disable=too-many-locals
for measurement in perfdata.metrics:
fields = perfdata.metrics[measurement].__dict__
fields['name'] = fields['name'].replace(" ", "_")
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
mytarget += '.' + service['name'] + '.' + fields['name']
elements = {'measurement': fields['name'], 'refid': refids[num],
'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'], 'refid': refids[num],
'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics in the performance data for '%s/%s'!\n-----"
% (host['name'], service['name']))
elements = {'measurement': fields['name'], 'refid': '',
'mytarget': mytarget}

targets.append(self.generate_target(elements,
{"host": hostname,
"service": service['name']},
ObjectId(service['_realm'])))
num += 1
if fields['warning'] is not None:
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
num += 1
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm'])
mytarget += '.' + hostname
mytarget += '.' + service['name'] + '.' + fields['name'] + "_warning"
elements = {'measurement': fields['name'] + "_warning",
'refid': refids[num], 'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'] + "_warning",
'refid': refids[num], 'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics (warning) in the "
"performance data for '%s/%s'!\n-----"
% (host['name'], service['name']))
elements = {'measurement': fields['name'] + "_warning",
'refid': '', 'mytarget': mytarget}

targets.append(self.generate_target(elements,
{"host": hostname,
"service": service['name']},
ObjectId(service['_realm'])))
num += 1
if fields['critical'] is not None:
mytarget = Timeseries.get_realms_prefix(host['_realm']) + '.' + hostname
num += 1
# Add statsd, graphite and realm prefixes
mytarget = '.'.join([statsd_prefix, graphite_prefix])
mytarget += '.' + Timeseries.get_realms_prefix(host['_realm'])
mytarget += '.' + hostname
mytarget += '.' + service['name'] + '.' + fields['name'] + "_critical"
elements = {'measurement': fields['name'] + "_critical",
'refid': refids[num], 'mytarget': mytarget}
while mytarget.startswith('.'):
mytarget = mytarget[1:]

try:
elements = {'measurement': fields['name'] + "_critical",
'refid': refids[num], 'mytarget': mytarget}
except IndexError as e:
print("-----\nToo much metrics (critical) in the "
"performance data for '%s/%s'!\n-----"
% (host['name'], service['name']))
elements = {'measurement': fields['name'] + "_critical",
'refid': '', 'mytarget': mytarget}

targets.append(self.generate_target(elements,
{"host": hostname,
"service": service['name']},
Expand Down
4 changes: 4 additions & 0 deletions alignak_backend/models/statsd.py
Expand Up @@ -43,6 +43,10 @@ def get_schema():
'empty': False,
'default': 8125
},
'prefix': {
'type': 'string',
'default': '',
},
'_realm': {
'type': 'objectid',
'data_relation': {
Expand Down
5 changes: 5 additions & 0 deletions alignak_backend/timeseries.py
Expand Up @@ -263,6 +263,11 @@ def send_to_statsd(data, statsd_id, prefix):
"""
Send data to statsd
Do not take care of the StatsD prefix because it is managed internally by the
StatsD daemon
Provide the Graphite prefix to the StatsD client
:param data: list of perfdata to send to statsd
:type data: list
:param statsd_id: id of statsd
Expand Down

0 comments on commit b33bbbd

Please sign in to comment.