def get_environments(tenant): tenant = generateDBName(tenant) try: query, _, _, _, limit, _ = parse_fields(request) except Exception as e: return jsonify(status="error", message=str(e)), 400 try: environments = db.get_environments(tenant, query=query, limit=limit) except Exception as e: return jsonify(status="error", message=str(e)), 500 if environments: return jsonify( status="ok", total=len(environments), environments=environments ) else: return jsonify( status="ok", message="not found", total=0, environments=[], )
def get_heartbeats(tenant): tenant = generateDBName(tenant) try: heartbeats = db.get_heartbeats(tenant) except Exception as e: return jsonify(status="error", message=str(e)), 500 hb_list = list() for hb in heartbeats: body = hb.get_body() if g.get('role', None) != 'admin' and not body['customer'] == g.get('customer', None): continue body['href'] = "%s/%s" % (request.base_url.replace('heartbeats', 'heartbeat'), hb.id) hb_list.append(body) if hb_list: return jsonify( status="ok", total=len(heartbeats), heartbeats=hb_list, time=datetime.datetime.utcnow() ) else: return jsonify( status="ok", message="not found", total=0, heartbeats=hb_list, time=datetime.datetime.utcnow() )
def create_blackout(tenant): data = request.json tenant = generateDBName(tenant) if request.json and 'environment' in request.json: environment = request.json['environment'] else: return jsonify(status="error", message="must supply 'environment' as parameter"), 400 resource = request.json.get("resource", None) service = request.json.get("service", None) event = request.json.get("event", None) group = request.json.get("group", None) tags = request.json.get("tags", None) start_time = request.json.get("startTime", None) end_time = request.json.get("endTime", None) duration = request.json.get("duration", None) if start_time: start_time = datetime.datetime.strptime(start_time, '%Y-%m-%dT%H:%M:%S.%fZ') if end_time: end_time = datetime.datetime.strptime(end_time, '%Y-%m-%dT%H:%M:%S.%fZ') try: blackout = db.create_blackout(tenant,environment, resource, service, event, group, tags, start_time, end_time, duration) except Exception as e: return jsonify(status="error", message=str(e)), 500 return jsonify(status="ok", blackout=blackout), 201, {'Location': '%s/%s' % (request.base_url, blackout)}
def get_services(tenant): tenant = generateDBName(tenant) try: query, _, _, _, limit, _ = parse_fields(request) except Exception as e: return jsonify(status="error", message=str(e)), 400 try: services = db.get_services(tenant, query=query, limit=limit) except Exception as e: return jsonify(status="error", message=str(e)), 500 if services: return jsonify( status="ok", total=len(services), services=services ) else: return jsonify( status="ok", message="not found", total=0, services=[], )
def get_counts(tenant): tenant = generateDBName(tenant) try: query, _, _, _, _, _ = parse_fields(request) except Exception as e: return jsonify(status="error", message=str(e)), 400 try: severity_count = db.get_counts(tenant, query=query, fields={"severity": 1}, group="severity") except Exception as e: return jsonify(status="error", message=str(e)), 500 try: status_count = db.get_counts(tenant, query=query, fields={"status": 1}, group="status") except Exception as e: return jsonify(status="error", message=str(e)), 500 if sum(severity_count.values()): return jsonify( status="ok", total=sum(severity_count.values()), severityCounts=severity_count, statusCounts=status_count ) else: return jsonify( status="ok", message="not found", total=0, severityCounts=severity_count, statusCounts=status_count )
def get_top10(tenant): tenant = generateDBName(tenant) try: query, _, group, _, _, _ = parse_fields(request) except Exception as e: return jsonify(status="error", message=str(e)), 400 try: top10 = db.get_topn(tenant, query=query, group=group, limit=10) except Exception as e: return jsonify(status="error", message=str(e)), 500 for item in top10: for resource in item['resources']: resource['href'] = "%s/%s" % (request.base_url.replace('alerts/top10', 'alert'), resource['id']) if top10: return jsonify( status="ok", total=len(top10), top10=top10 ) else: return jsonify( status="ok", message="not found", total=0, top10=[], )
def tag_alert(tenant, id): # FIXME - should only allow role=user to set status for alerts for that customer # Above comment is from original code, can ignore for now tag_started = tag_timer.start_timer() data = request.json tenant = generateDBName(tenant) if data and 'tags' in data: try: response = db.tag_alert(id, tenant, data['tags']) except Exception as e: return jsonify(status="error", message=str(e)), 500 else: tag_timer.stop_timer(tag_started) return jsonify(status="error", message="must supply 'tags' as list parameter"), 400 tag_timer.stop_timer(tag_started) if response: return jsonify(status="ok") else: return jsonify(status="error", message="not found"), 404
def set_status(id): # FIXME - should only allow role=user to set status for alerts for that customer # Above comment is from original code, can ignore it for now status_started = status_timer.start_timer() tenant = getTenantFromHeader(request) if len(tenant) == 0: return jsonify(status="error", message="bad request"), 400 data = request.json tenant = generateDBName(tenant) if data and 'status' in data: try: alert = db.set_status(tenant, id=id, status=data['status'], text=data.get('text', '')) except Exception as e: return jsonify(status="error", message=str(e)), 500 else: status_timer.stop_timer(status_started) return jsonify(status="error", message="must supply 'status' as parameter"), 400 if alert: status_timer.stop_timer(status_started) return jsonify(status="ok") else: status_timer.stop_timer(status_started) return jsonify(status="error", message="not found"), 404
def get_history(tenant): tenant = generateDBName(tenant) try: query, _, _, _, limit, query_time = parse_fields(request) except Exception as e: return jsonify(status="error", message=str(e)), 400 try: history = db.get_history(tenant, query=query, limit=limit) except Exception as e: return jsonify(status="error", message=str(e)), 500 for alert in history: alert['href'] = "%s/%s" % (request.base_url.replace('alerts/history', 'alert'), alert['id']) if len(history) > 0: return jsonify( status="ok", history=history, lastTime=history[-1]['updateTime'] ) else: return jsonify( status="ok", message="not found", history=[], lastTIme=query_time )
def delete_heartbeat(tenant, id): tenant = generateDBName(tenant) try: response = db.delete_heartbeat(tenant, id) except Exception as e: return jsonify(status="error", message=str(e)), 500 if response: return jsonify(status="ok") else: return jsonify(status="error", message="not found"), 404
def delete_alert(tenant,id): started = delete_timer.start_timer() tenant = generateDBName(tenant) try: response = db.delete_alert(tenant,id) except Exception as e: return jsonify(status="error", message=str(e)), 500 delete_timer.stop_timer(started) if response: return jsonify(status="ok") else: return jsonify(status="error", message="not found"), 404
def get_heartbeat(tenant,id): tenant = generateDBName(tenant) try: heartbeat = db.get_heartbeat(tenant, id=id) except Exception as e: return jsonify(status="error", message=str(e)), 500 if heartbeat: if g.get('role', None) != 'admin' and not heartbeat.customer == g.get('customer', None): return jsonify(status="error", message="not found", total=0, alert=None), 404 body = heartbeat.get_body() body['href'] = request.base_url return jsonify(status="ok", total=1, heartbeat=body) else: return jsonify(status="error", message="not found", total=0, heartbeat=None), 404
def receive_alert(tenant): ## recv_started = receive_timer.start_timer() tenant = generateDBName(tenant) try: incomingAlert = Alert.parse_alert(request.data) except ValueError as e: ## receive_timer.stop_timer(recv_started) return jsonify(status="error", message=str(e)), 400 if g.get('customer', None): incomingAlert.customer = g.get('customer') if request.headers.getlist("X-Forwarded-For"): incomingAlert.attributes.update(ip=request.headers.getlist("X-Forwarded-For")[0]) else: incomingAlert.attributes.update(ip=request.remote_addr) try: alert = process_alert(incomingAlert, tenant) except RejectException as e: # receive_timer.stop_timer(recv_started) return jsonify(status="error", message=str(e)), 403 except RuntimeWarning as e: # receive_timer.stop_timer(recv_started) return jsonify(status="ok", id=incomingAlert.id, message=str(e)), 202 except Exception as e: # receive_timer.stop_timer(recv_started) return jsonify(status="error", message=str(e)), 500 # receive_timer.stop_timer(recv_started) if alert: body = alert.get_body() body['href'] = "%s/%s" % (request.base_url, alert.id) return jsonify(status="ok", id=alert.id, alert=body), 201, {'Location': '%s/%s' % (request.base_url, alert.id)} else: return jsonify(status="error", message="insert or update of received alert failed"), 500
def create_heartbeat(tenant): tenant = generateDBName(tenant) try: heartbeat = Heartbeat.parse_heartbeat(request.data) except ValueError as e: return jsonify(status="error", message=str(e)), 400 if g.get('role', None) != 'admin': heartbeat.customer = g.get('customer', None) try: heartbeat = db.save_heartbeat(tenant, heartbeat) except Exception as e: return jsonify(status="error", message=str(e)), 500 body = heartbeat.get_body() body['href'] = "%s/%s" % (request.base_url, heartbeat.id) return jsonify(status="ok", id=heartbeat.id, heartbeat=body), 201, {'Location': '%s/%s' % (request.base_url, heartbeat.id)}
def get_blackouts(tenant): tenant = generateDBName(tenant) try: blackouts = db.get_blackouts(tenant) except Exception as e: return jsonify(status="error", message=str(e)), 500 if len(blackouts): return jsonify( status="ok", total=len(blackouts), blackouts=blackouts, time=datetime.datetime.utcnow() ) else: return jsonify( status="ok", message="not found", total=0, blackouts=[], time=datetime.datetime.utcnow() )
def get_alerts(): tenant = getTenantFromHeader(request) if len(tenant) == 0: return jsonify(status="error", message="bad request"), 400 tenant = generateDBName(tenant) gets_started = gets_timer.start_timer() try: query, sort, _, page, limit, query_time = parse_fields(request) except Exception as e: gets_timer.stop_timer(gets_started) return jsonify(status="error", message=str(e)), 400 try: severity_count = db.get_counts(tenant, query=query, fields={"severity": 1}, group="severity") except Exception as e: return jsonify(status="error", message=str(e)), 500 try: status_count = db.get_counts(tenant, query=query, fields={"status": 1}, group="status") except Exception as e: return jsonify(status="error", message=str(e)), 500 if limit < 1: return jsonify(status="error", message="page 'limit' of %s is not valid" % limit), 416 total = sum(severity_count.values()) pages = ((total - 1) // limit) + 1 if total and page > pages or page < 0: return jsonify(status="error", message="page out of range: 1-%s" % pages), 416 fields = dict() fields['history'] = {'$slice': app.config['HISTORY_LIMIT']} try: alerts = db.get_alerts(tenant, query=query, fields=fields, sort=sort, page=page, limit=limit) except Exception as e: return jsonify(status="error", message=str(e)), 500 alert_response = list() if len(alerts) > 0: last_time = None for alert in alerts: body = alert.get_body() body['href'] = "%s/%s" % (request.base_url.replace('alerts', 'alert'), alert.id) if not last_time: last_time = body['lastReceiveTime'] elif body['lastReceiveTime'] > last_time: last_time = body['lastReceiveTime'] alert_response.append(body) gets_timer.stop_timer(gets_started) return jsonify( status="ok", total=total, page=page, pageSize=limit, pages=pages, more=page < pages, alerts=alert_response, severityCounts=severity_count, statusCounts=status_count, lastTime=last_time, autoRefresh=Switch.get('auto-refresh-allow').is_on(), ) else: gets_timer.stop_timer(gets_started) return jsonify( status="ok", message="not found", total=total, page=page, pageSize=limit, pages=pages, more=False, alerts=[], severityCounts=severity_count, statusCounts=status_count, lastTime=query_time, autoRefresh=Switch.get('auto-refresh-allow').is_on() )