def check_changes(request, name): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) query = dedent("""\ COPY ( SELECT array_to_json(coalesce(array_agg(json_build_object( 'datetime', f.datetime, 'enabled', f.enabled, 'warning', f.warning, 'critical', f.critical, 'description', f.description )), '{}')) FROM monitoring.get_check_changes(%s, %s, %s, %s, %s) f ) TO STDOUT """) return jsonify( sql_json_query( request, query, host_id, instance_id, name, start, end, ))
def state_changes(request, name): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) key = request.handler.get_argument('key', default=None) if name not in check_specs: raise HTTPError(404, "Unknown check '%s'" % name) query = dedent("""\ COPY ( SELECT array_to_json(coalesce(array_agg(json_build_object( 'datetime', f.datetime, 'state', f.state, 'value', f.value, 'warning', f.warning, 'critical', f.critical )), '{}')) FROM monitoring.get_state_changes(%s, %s, %s, %s, %s, %s) f ) TO STDOUT """) return jsonify( sql_json_query( request, query, host_id, instance_id, name, key, start, end, ))
def json_chart_data_db(request, dbid): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) data = getstatdata_sample(request, "db", start, end, dbid=dbid) data = convert_decimal_to_float(data) return jsonify(dict(data=data))
def json_data(request, dbid, queryid=None, userid=None): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) query = text(""" SELECT DISTINCT(datname) FROM statements.statements WHERE dbid = :dbid AND agent_address = :agent_address AND agent_port = :agent_port; """) datname = request.db_session.execute( query, dict(agent_address=request.instance.agent_address, agent_port=request.instance.agent_port, dbid=dbid)).fetchone()[0] params = dict(agent_address=request.instance.agent_address, agent_port=request.instance.agent_port, dbid=dbid, start=start, end=end) query = BASE_QUERY_STATDATA_DATABASE queryidfilter = '' if queryid is not None and userid is not None: queryidfilter = 'AND queryid = :queryid AND userid = :userid' params.update(dict(queryid=queryid, userid=userid)) query = query.format(**dict(queryidfilter=queryidfilter)) statements = request.db_session.execute(query, params).fetchall() statements = [dict(statement) for statement in statements] return jsonify(dict(datname=datname, data=statements))
def json_data_instance(request): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) base_query = BASE_QUERY_STATDATA diffs = get_diffs_forstatdata() query = (select([ column("datname"), column("dbid"), ] + diffs).select_from(base_query).group_by( column("dbid"), column("datname")).having( func.max(column("calls")) - func.min(column("calls")) > 0)) statements = request.db_session.execute( query, dict(agent_address=request.instance.agent_address, agent_port=request.instance.agent_port, start=start, end=end)) \ .fetchall() statements = [dict(statement) for statement in statements] metas = request.db_session.execute( METAS_QUERY, dict(agent_address=request.instance.agent_address, agent_port=request.instance.agent_port)).fetchone() metas = dict(metas) if metas is not None else None return jsonify(dict(data=statements, metas=metas))
def states(request, name): host_id, instance_id = get_request_ids(request) if name not in check_specs: raise HTTPError(404, "Unknown check '%s'" % name) detail = check_state_detail(request.db_session, host_id, instance_id, name) for d in detail: spec = check_specs[name] if 'value_type' in spec: d['value_type'] = spec['value_type'] return jsonify(detail)
def json_chart_data_query(request, dbid, queryid, userid): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) data = getstatdata_sample(request, "query", start, end, dbid=dbid, queryid=queryid, userid=userid) return jsonify(dict(data=data))
def alerts(request): host_id, instance_id = get_request_ids(request) query = dedent("""\ COPY ( SELECT array_to_json(coalesce(array_agg(x), '{}')) FROM ( SELECT json_build_object('description', c.description, 'name', c.name, 'key', sc.key, 'state', sc.state, 'datetime', sc.datetime, 'value', sc.value, 'warning', sc.warning, 'critical', sc.critical) as x FROM monitoring.state_changes sc JOIN monitoring.checks c ON (sc.check_id = c.check_id) WHERE c.host_id = %s AND c.instance_id = %s AND (sc.state = 'WARNING' OR sc.state = 'CRITICAL') ORDER BY sc.datetime desc LIMIT 20 ) as tab ) TO STDOUT """) # noqa # Tornado refuses to send lists as JSON. We must explicitly use jsonify. # Cf. https://github.com/tornadoweb/tornado/issues/1009 return jsonify(sql_json_query(request, query, host_id, instance_id))
def checks(request): host_id, instance_id = get_request_ids(request) if 'GET' == request.method: data = checks_info(request.db_session, host_id, instance_id) for datum in data: spec = check_specs[datum['name']] if 'value_type' in spec: datum['value_type'] = spec['value_type'] return jsonify(data) else: post = tornado.escape.json_decode(request.body) if 'checks' not in post or type(post.get('checks')) is not list: raise HTTPError(400, "Post data not valid.") for row in post['checks']: if row.get('name') not in check_specs: raise HTTPError(404, "Unknown check '%s'" % row.get('name')) for row in post['checks']: # Find the check from its name check = request.db_session.query(Check).filter( Check.name == str(row.get('name')), Check.host_id == host_id, Check.instance_id == instance_id).first() enabled_before = check.enabled if u'enabled' in row: enabled_after = bool(row.get(u'enabled')) check.enabled = enabled_after # detect any change from enabled to disabled is_getting_disabled = enabled_before and not enabled_after if u'warning' in row: warning = row.get(u'warning') if type(warning) not in (int, float): raise HTTPError(400, "Post data not valid.") check.warning = warning if u'critical' in row: critical = row.get(u'critical') if type(critical) not in (int, float): raise HTTPError(400, "Post data not valid.") check.critical = critical if u'description' in row: check.description = row.get(u'description') request.db_session.merge(check) if is_getting_disabled: cs = request.db_session.query(CheckState).filter( CheckState.check_id == check.check_id, ) for i in cs: i.state = str('UNDEF') request.db_session.merge(i) request.db_session.execute( "SELECT monitoring.append_state_changes(:d, :i," ":s, :k, :v, :w, :c)", { 'd': datetime.utcnow(), 'i': check.check_id, 's': 'UNDEF', 'k': i.key, 'v': None, 'w': check.warning, 'c': check.critical }) request.db_session.commit() return {}
def json_chart_data_instance(request): host_id, instance_id = get_request_ids(request) start, end = parse_start_end(request) data = getstatdata_sample(request, "instance", start, end) return jsonify(dict(data=data))