Пример #1
0
    def pre_receive(self, alert, **kwargs):
        HEARTBEAT_EVENTS = self.get_config('HEARTBEAT_EVENTS',
                                           default=['Heartbeat'],
                                           type=list,
                                           **kwargs)

        if alert.event in HEARTBEAT_EVENTS:
            if 'timeout' in request.json:
                timeout = alert.timeout
            else:
                timeout = current_app.config['HEARTBEAT_TIMEOUT']

            hb = Heartbeat(origin=alert.origin,
                           tags=alert.tags,
                           attributes={
                               'environment': alert.environment,
                               'severity': alert.severity,
                               'service': alert.service,
                               'group': alert.group
                           },
                           timeout=timeout,
                           customer=alert.customer)
            r = hb.create()
            raise HeartbeatReceived(r.id)

        return alert
Пример #2
0
def list_heartbeats():
    query = qb.from_params(request.args, customers=g.customers)
    total = Heartbeat.count(query)
    paging = Page.from_params(request.args, total)
    heartbeats = Heartbeat.find_all(query,
                                    page=paging.page,
                                    page_size=paging.page_size)

    if heartbeats:
        return jsonify(
            status='ok',
            page=paging.page,
            pageSize=paging.page_size,
            pages=paging.pages,
            more=paging.has_more,
            heartbeats=[heartbeat.serialize for heartbeat in heartbeats],
            total=total)
    else:
        return jsonify(status='ok',
                       page=paging.page,
                       pageSize=paging.page_size,
                       pages=paging.pages,
                       more=paging.has_more,
                       message='not found',
                       heartbeats=[],
                       total=0)
Пример #3
0
    def pre_receive(self, alert):

        if alert.event == 'Heartbeat':
            hb = Heartbeat(origin=alert.origin,
                           tags=alert.tags,
                           timeout=alert.timeout,
                           customer=alert.customer)
            hb.create()
            raise HeartbeatReceived('Alert converted to heartbeat')

        return alert
Пример #4
0
    def pre_receive(self, alert, **kwargs):

        if alert.event == 'Heartbeat':
            hb = Heartbeat(origin=alert.origin,
                           tags=alert.tags,
                           timeout=alert.timeout,
                           customer=alert.customer)
            r = hb.create()
            raise HeartbeatReceived(r.id)

        return alert
Пример #5
0
    def pre_receive(self, alert, **kwargs):

        if alert.event == 'Heartbeat':
            hb = Heartbeat(
                origin=alert.origin,
                tags=alert.tags,
                timeout=alert.timeout,
                customer=alert.customer
            )
            hb.create()
            raise HeartbeatReceived('Alert converted to heartbeat')

        return alert
Пример #6
0
    def pre_receive(self, alert, **kwargs):
        HEARTBEAT_EVENTS = self.get_config('HEARTBEAT_EVENTS',
                                           default=['Heartbeat'],
                                           type=list,
                                           **kwargs)

        if alert.event in HEARTBEAT_EVENTS:
            hb = Heartbeat(origin=alert.origin,
                           tags=alert.tags,
                           timeout=alert.timeout,
                           customer=alert.customer)
            r = hb.create()
            raise HeartbeatReceived(r.id)

        return alert
Пример #7
0
def create_heartbeat():
    try:
        heartbeat = Heartbeat.parse(request.json)
    except ValueError as e:
        raise ApiError(str(e), 400)

    heartbeat.customer = assign_customer(wanted=heartbeat.customer,
                                         permission=Scope.admin_heartbeats)

    try:
        heartbeat = heartbeat.create()
    except Exception as e:
        raise ApiError(str(e), 500)

    write_audit_trail.send(current_app._get_current_object(),
                           event='heartbeat-created',
                           message='',
                           user=g.login,
                           customers=g.customers,
                           scopes=g.scopes,
                           resource_id=heartbeat.id,
                           type='heartbeat',
                           request=request)

    if heartbeat:
        return jsonify(status='ok',
                       id=heartbeat.id,
                       heartbeat=heartbeat.serialize), 201
    else:
        raise ApiError('insert or update of received heartbeat failed', 500)
Пример #8
0
def get_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if heartbeat:
        return jsonify(status='ok', total=1, heartbeat=heartbeat.serialize)
    else:
        raise ApiError('not found', 404)
Пример #9
0
def get_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.get(heartbeat_id, customer)

    if heartbeat:
        return jsonify(status="ok", total=1, heartbeat=heartbeat.serialize)
    else:
        raise ApiError("not found", 404)
Пример #10
0
def get_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if heartbeat:
        return jsonify(status='ok', total=1, heartbeat=heartbeat.serialize)
    else:
        raise ApiError('not found', 404)
Пример #11
0
def delete_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if not heartbeat:
        raise ApiError('not found', 404)

    if heartbeat.delete():
        return jsonify(status='ok')
    else:
        raise ApiError('failed to delete heartbeat', 500)
Пример #12
0
def delete_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.get(heartbeat_id, customer)

    if not heartbeat:
        raise ApiError("not found", 404)

    if heartbeat.delete():
        return jsonify(status="ok")
    else:
        raise ApiError("failed to delete heartbeat", 500)
Пример #13
0
def delete_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if not heartbeat:
        raise ApiError("not found", 404)

    if heartbeat.delete():
        return jsonify(status="ok")
    else:
        raise ApiError("failed to delete heartbeat", 500)
Пример #14
0
def delete_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if not heartbeat:
        raise ApiError('not found', 404)

    write_audit_trail.send(current_app._get_current_object(), event='heartbeat-deleted', message='', user=g.user,
                           customers=g.customers, scopes=g.scopes, resource_id=heartbeat.id, type='heartbeat', request=request)

    if heartbeat.delete():
        return jsonify(status='ok')
    else:
        raise ApiError('failed to delete heartbeat', 500)
Пример #15
0
def health_check():

    try:
        heartbeats = Heartbeat.find_all()
        for heartbeat in heartbeats:
            delta = datetime.datetime.utcnow() - heartbeat.receive_time
            threshold = int(heartbeat.timeout) * 4
            if delta.seconds > threshold:
                return 'HEARTBEAT_STALE: %s' % heartbeat.origin, 503

    except Exception as e:
        return 'HEALTH_CHECK_FAILED: %s' % e, 503

    return 'OK'
Пример #16
0
def health_check():

    try:
        heartbeats = Heartbeat.find_all()
        for heartbeat in heartbeats:
            delta = datetime.datetime.utcnow() - heartbeat.receive_time
            threshold = int(heartbeat.timeout) * 4
            if delta.seconds > threshold:
                return 'HEARTBEAT_STALE: %s' % heartbeat.origin, 503

    except Exception as e:
        return 'HEALTH_CHECK_FAILED: %s' % e, 503

    return 'OK'
Пример #17
0
def delete_heartbeat(heartbeat_id):
    customer = g.get('customer', None)
    heartbeat = Heartbeat.find_by_id(heartbeat_id, customer)

    if not heartbeat:
        raise ApiError('not found', 404)

    write_audit_trail.send(current_app._get_current_object(), event='heartbeat-deleted', message='', user=g.login,
                           customers=g.customers, scopes=g.scopes, resource_id=heartbeat.id, type='heartbeat', request=request)

    if heartbeat.delete():
        return jsonify(status='ok')
    else:
        raise ApiError('failed to delete heartbeat', 500)
Пример #18
0
def list_heartbeats():
    query = qb.from_params(request.args)
    heartbeats = Heartbeat.find_all(query)

    if heartbeats:
        return jsonify(
            status='ok',
            heartbeats=[heartbeat.serialize for heartbeat in heartbeats],
            total=len(heartbeats))
    else:
        return jsonify(status='ok',
                       message='not found',
                       heartbeats=[],
                       total=0)
Пример #19
0
def list_heartbeats():
    query = qb.from_params(request.args)
    heartbeats = Heartbeat.find_all(query)

    if heartbeats:
        return jsonify(
            status="ok",
            heartbeats=[heartbeat.serialize for heartbeat in heartbeats],
            total=len(heartbeats)
        )
    else:
        return jsonify(
            status="ok",
            message="not found",
            heartbeats=[],
            total=0
        )
Пример #20
0
def create_heartbeat():
    try:
        heartbeat = Heartbeat.parse(request.json)
    except ValueError as e:
        raise ApiError(str(e), 400)

    heartbeat.customer = assign_customer(wanted=heartbeat.customer, permission='admin:heartbeats')

    try:
        heartbeat = heartbeat.create()
    except Exception as e:
        raise ApiError(str(e), 500)

    if heartbeat:
        return jsonify(status="ok", id=heartbeat.id, heartbeat=heartbeat.serialize), 201
    else:
        raise ApiError("insert or update of received heartbeat failed", 500)
Пример #21
0
def list_heartbeats():
    query = qb.from_params(request.args, customers=g.customers)
    heartbeats = Heartbeat.find_all(query)

    if heartbeats:
        return jsonify(
            status='ok',
            heartbeats=[heartbeat.serialize for heartbeat in heartbeats],
            total=len(heartbeats)
        )
    else:
        return jsonify(
            status='ok',
            message='not found',
            heartbeats=[],
            total=0
        )
Пример #22
0
def create_heartbeat():
    try:
        heartbeat = Heartbeat.parse(request.json)
    except ValueError as e:
        raise ApiError(str(e), 400)

    if g.get('customer', None):
        heartbeat.customer = g.get('customer')

    try:
        heartbeat = heartbeat.create()
    except Exception as e:
        raise ApiError(str(e), 500)

    if heartbeat:
        return jsonify(status="ok", id=heartbeat.id, heartbeat=heartbeat.serialize), 201
    else:
        raise ApiError("insert or update of received heartbeat failed", 500)
Пример #23
0
def create_heartbeat():
    try:
        heartbeat = Heartbeat.parse(request.json)
    except ValueError as e:
        raise ApiError(str(e), 400)

    if g.get('customer', None):
        heartbeat.customer = g.get('customer')

    try:
        heartbeat = heartbeat.create()
    except Exception as e:
        raise ApiError(str(e), 500)

    if heartbeat:
        return jsonify(status="ok",
                       id=heartbeat.id,
                       heartbeat=heartbeat.serialize), 201
    else:
        raise ApiError("insert or update of received heartbeat failed", 500)
Пример #24
0
def create_heartbeat():
    try:
        heartbeat = Heartbeat.parse(request.json)
    except ValueError as e:
        raise ApiError(str(e), 400)

    heartbeat.customer = assign_customer(wanted=heartbeat.customer, permission=Scope.admin_heartbeats)

    try:
        heartbeat = heartbeat.create()
    except Exception as e:
        raise ApiError(str(e), 500)

    write_audit_trail.send(current_app._get_current_object(), event='heartbeat-created', message='', user=g.login,
                           customers=g.customers, scopes=g.scopes, resource_id=heartbeat.id, type='heartbeat', request=request)

    if heartbeat:
        return jsonify(status='ok', id=heartbeat.id, heartbeat=heartbeat.serialize), 201
    else:
        raise ApiError('insert or update of received heartbeat failed', 500)
Пример #25
0
    def test_timeout(self):

        # create heartbeat with default timeout
        response = self.client.post('/heartbeat', data=json.dumps(self.heartbeat), headers=self.headers)
        self.assertEqual(response.status_code, 201)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['heartbeat']['timeout'], 4)

        # resend heartbeat with different timeout
        self.heartbeat['timeout'] = 20
        response = self.client.post('/heartbeat', data=json.dumps(self.heartbeat), headers=self.headers)
        self.assertEqual(response.status_code, 201)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['heartbeat']['timeout'], 20)

        # resend heartbeat with timeout disabled (ie. 0)
        self.heartbeat['timeout'] = 0
        response = self.client.post('/heartbeat', data=json.dumps(self.heartbeat), headers=self.headers)
        self.assertEqual(response.status_code, 201)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['heartbeat']['timeout'], 0)

        # send heartbeat with different timeout
        self.heartbeat['timeout'] = 10
        response = self.client.post('/heartbeat', data=json.dumps(self.heartbeat), headers=self.headers)
        self.assertEqual(response.status_code, 201)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['heartbeat']['timeout'], 10)

        # send heartbeat with very short timeout
        self.heartbeat['timeout'] = 2
        response = self.client.post('/heartbeat', data=json.dumps(self.heartbeat), headers=self.headers)
        self.assertEqual(response.status_code, 201)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['heartbeat']['timeout'], 2)

        heartbeat_id = data['id']

        time.sleep(4)

        # get heartbeat
        response = self.client.get('/heartbeat/' + heartbeat_id)
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(heartbeat_id, data['heartbeat']['id'])
        self.assertEqual(data['heartbeat']['timeout'], 2)
        self.assertEqual(data['heartbeat']['status'], 'expired')

        with self.app.app_context():
            hb = Heartbeat.parse(data['heartbeat'])

        payload = {
            'resource': hb.origin,
            'event': 'HeartbeatFail',
            'environment': 'Production',
            'severity': 'major',
            'correlate': ['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
            'service': ['Test'],
            'group': 'Alerta',
            'value': f'{hb.since}',
            'text': f'Heartbeat not received in {hb.timeout} seconds',
            'tags': hb.tags,
            'attributes': hb.attributes,
            # 'timeout': None
        }

        # create heartbeat alert
        response = self.client.post('/alert', json=payload)
        self.assertEqual(response.status_code, 201, response.data)
        data = json.loads(response.data.decode('utf-8'))
        self.assertEqual(data['alert']['resource'], hb.origin)
        self.assertEqual(data['alert']['status'], 'open')
        self.assertEqual(data['alert']['service'], ['Test'])
        self.assertEqual(data['alert']['timeout'], 2)
        self.assertEqual(data['alert']['duplicateCount'], 0)
        self.assertEqual(data['alert']['trendIndication'], 'moreSevere')
        self.assertEqual(data['alert']['history'][0]['user'], None)