예제 #1
0
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,
        ))
예제 #2
0
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,
        ))
예제 #3
0
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))
예제 #4
0
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))
예제 #5
0
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))
예제 #6
0
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)
예제 #7
0
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))
예제 #8
0
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))
예제 #9
0
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 {}
예제 #10
0
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))