def cli(obj, alert, severity, timeout, purge):
    """List heartbeats."""
    client = obj['client']

    if obj['output'] == 'json':
        r = client.http.get('/heartbeats')
        click.echo(json.dumps(r['heartbeats'], sort_keys=True, indent=4, ensure_ascii=False))
    else:
        timezone = obj['timezone']
        headers = {
            'id': 'ID', 'origin': 'ORIGIN', 'customer': 'CUSTOMER', 'tags': 'TAGS', 'createTime': 'CREATED',
            'receiveTime': 'RECEIVED', 'latency': 'LATENCY', 'timeout': 'TIMEOUT', 'since': 'SINCE', 'status': 'STATUS'
        }
        heartbeats = client.get_heartbeats()
        click.echo(tabulate([h.tabular(timezone) for h in heartbeats], headers=headers, tablefmt=obj['output']))

        not_ok = [hb for hb in heartbeats if hb.status != 'ok']
        if purge:
            with click.progressbar(not_ok, label='Purging {} heartbeats'.format(len(not_ok))) as bar:
                for b in bar:
                    client.delete_heartbeat(b.id)

        elif alert:
            with click.progressbar(heartbeats, label='Alerting {} heartbeats'.format(len(heartbeats))) as bar:
                for b in bar:
                    params = dict(filter(lambda a: len(a) == 2, map(lambda a: a.split(':'), b.tags)))
                    environment = params.get('environment', 'Production')
                    group = params.get('group', 'System')
                    tags = list(filter(lambda a: not a.startswith('environment:') and
                                       not a.startswith('group:'), b.tags))

                    if b.status == 'expired':  # aka. "stale"
                        client.send_alert(
                            resource=b.origin,
                            event='HeartbeatFail',
                            correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
                            group=group,
                            environment=environment,
                            service=['Alerta'],
                            severity=severity,
                            value='{}'.format(b.since),
                            text='Heartbeat not received in {} seconds'.format(b.timeout),
                            tags=tags,
                            type='heartbeatAlert',
                            timeout=timeout,
                            customer=b.customer
                        )
                    elif b.status == 'slow':
                        client.send_alert(
                            resource=b.origin,
                            event='HeartbeatSlow',
                            correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
                            group=group,
                            environment=environment,
                            service=['Alerta'],
                            severity=severity,
                            value='{}ms'.format(b.latency),
                            text='Heartbeat took more than {}ms to be processed'.format(MAX_LATENCY),
                            tags=tags,
                            type='heartbeatAlert',
                            timeout=timeout,
                            customer=b.customer
                        )
                    else:
                        client.send_alert(
                            resource=b.origin,
                            event='HeartbeatOK',
                            correlate=['HeartbeatFail', 'HeartbeatSlow', 'HeartbeatOK'],
                            group=group,
                            environment=environment,
                            service=['Alerta'],
                            severity='normal',
                            value='',
                            text='Heartbeat OK',
                            tags=tags,
                            type='heartbeatAlert',
                            customer=b.customer
                        )
def cli ( obj , alert , severity , timeout , purge ) : client = obj [ 'client' ] if obj [ 'output' ] == 'json' : r = client . http . get ( '/heartbeats' ) click . echo ( json . dumps ( r [ 'heartbeats' ] , sort_keys = True , indent = 4 , ensure_ascii = False ) ) else : timezone = obj [ 'timezone' ] headers = { 'id' : 'ID' , 'origin' : 'ORIGIN' , 'customer' : 'CUSTOMER' , 'tags' : 'TAGS' , 'createTime' : 'CREATED' , 'receiveTime' : 'RECEIVED' , 'latency' : 'LATENCY' , 'timeout' : 'TIMEOUT' , 'since' : 'SINCE' , 'status' : 'STATUS' } heartbeats = client . get_heartbeats ( ) click . echo ( tabulate ( [ h . tabular ( timezone ) for h in heartbeats ] , headers = headers , tablefmt = obj [ 'output' ] ) ) not_ok = [ hb for hb in heartbeats if hb . status != 'ok' ] if purge : with click . progressbar ( not_ok , label = 'Purging {} heartbeats' . format ( len ( not_ok ) ) ) as bar : for b in bar : client . delete_heartbeat ( b . id ) elif alert : with click . progressbar ( heartbeats , label = 'Alerting {} heartbeats' . format ( len ( heartbeats ) ) ) as bar : for b in bar : params = dict ( filter ( lambda a : len ( a ) == 2 , map ( lambda a : a . split ( ':' ) , b . tags ) ) ) environment = params . get ( 'environment' , 'Production' ) group = params . get ( 'group' , 'System' ) tags = list ( filter ( lambda a : not a . startswith ( 'environment:' ) and not a . startswith ( 'group:' ) , b . tags ) ) if b . status == 'expired' : client . send_alert ( resource = b . origin , event = 'HeartbeatFail' , correlate = [ 'HeartbeatFail' , 'HeartbeatSlow' , 'HeartbeatOK' ] , group = group , environment = environment , service = [ 'Alerta' ] , severity = severity , value = '{}' . format ( b . since ) , text = 'Heartbeat not received in {} seconds' . format ( b . timeout ) , tags = tags , type = 'heartbeatAlert' , timeout = timeout , customer = b . customer ) elif b . status == 'slow' : client . send_alert ( resource = b . origin , event = 'HeartbeatSlow' , correlate = [ 'HeartbeatFail' , 'HeartbeatSlow' , 'HeartbeatOK' ] , group = group , environment = environment , service = [ 'Alerta' ] , severity = severity , value = '{}ms' . format ( b . latency ) , text = 'Heartbeat took more than {}ms to be processed' . format ( MAX_LATENCY ) , tags = tags , type = 'heartbeatAlert' , timeout = timeout , customer = b . customer ) else : client . send_alert ( resource = b . origin , event = 'HeartbeatOK' , correlate = [ 'HeartbeatFail' , 'HeartbeatSlow' , 'HeartbeatOK' ] , group = group , environment = environment , service = [ 'Alerta' ] , severity = 'normal' , value = '' , text = 'Heartbeat OK' , tags = tags , type = 'heartbeatAlert' , customer = b . customer )
List heartbeats.