udistrital / core_documentacion

0 stars 0 forks source link

Iniciar interoperabilidad entre microcliente de auditoria y MID #251

Open diagutierrezro opened 6 days ago

diagutierrezro commented 6 days ago

Se requiere realizar la interoperabilidad entre el microcliente de auditoría con el MID, inicialmente modificar el endpoint para que sea una petición POST que reciba como parametros inicialmente las fechas de consulta y el API a revisar.

Realizar ajustes en el cliente para que una vez se presione el botón de busqueda se envíen los parametros seleccionados y se realice la busqueda y se realice el listado de logs.

Sub Tareas

Criterios de aceptación

Requerimientos

No aplica

Definition of Ready - DoR

Definition of Done - DoD - Desarrollo

JulianAvella commented 4 days ago

En el MID se agrega el método http Post para poder enviar la información del log a buscar:

@documentNamespaceController.route('/buscarLog', strict_slashes=False) class FilterLogs(Resource): @documentDoc.doc(responses={ 200: 'Success', 400: 'Bad request', 500: 'Server error' }, body=auditoria_params['filtro_log_model'])
@documentNamespaceController.expect(auditoria_params['filtro_log_model'])
@cross_origin(**api_cors_config) def post(self): """ Filtra los logs de AWS con base en parámetros específicos.

    Parameters
    ----------
    request : json
        Un JSON que contiene:
        - fechaInicio (str): Fecha de inicio en formato dd-mm-aaaa-hh:mm
        - fechaFin (str): Fecha de fin en formato dd-mm-aaaa-hh:mm
        - tipoLog (str): Tipo de log (GET, POST, PUT, etc.)
        - codigoResponsable (int): Código del responsable
        - rolResponsable (str): Rol del responsable

    Returns
    -------
    Response
        Respuesta con los logs filtrados en formato JSON.
    """
    params = request.args  
    return auditoria.postBuscarLog(params)

def postBuscarLog(data): """ Consulta un log específico en CloudWatch en un rango de tiempo

    Parameters
    ----------
    body : json
        json con parametros como fechaInicio (str), fechaFin (str), tipoLog (str), codigoResponsable (int), rolResponsable (str)

    Returns
    -------
    json : información del log a consultar
"""
response_array=[]
try:
    return auditoriaService.getOneLog(data)
except Exception as e:
    return False

def getOneLog(params): """ Consulta un solo evento de logs en CloudWatch para un grupo de logs específico con filtros adicionales.

    Parameters
    ----------
    params : MultiDict
        Parámetros que incluyen:
        - logGroupName (str): Nombre del grupo de logs.
        - logStreamNames (list): Lista de streams dentro del grupo de logs.
        - startTime (str): Tiempo de inicio (formato: 'YYYY-MM-DD HH:MM').
        - endTime (str): Tiempo de fin (formato: 'YYYY-MM-DD HH:MM').
        - filterPattern (str): Patrón para filtrar los logs.
        - limit (int): Límite de eventos a devolver.

    Returns
    -------
    json : Evento de log o información de error.
"""
try:
    log_group_name = params.get('logGroupName', '/ecs/polux_crud_test')
    log_stream_names = params.getlist('logStreamNames') 
    filter_pattern = params.get('filterPattern', '')  
    limit = int(params.get('limit', 1))  

    start_time = int(time.mktime(datetime.strptime(params.get('startTime', '2024-08-01 00:00'), "%Y-%m-%d %H:%M").timetuple()) * 1000)
    end_time = int(time.mktime(datetime.strptime(params.get('endTime', '2024-08-02 23:59'), "%Y-%m-%d %H:%M").timetuple()) * 1000)

    response = client.filter_log_events(
        logGroupName=log_group_name,
        logStreamNames=log_stream_names if log_stream_names else None,
        startTime=start_time,
        endTime=end_time,
        filterPattern=filter_pattern,
        limit=limit
    )

    events = [{"timestamp": event['timestamp'], "message": event['message']} for event in response.get('events', [])]

    if not events:
        return Response(json.dumps({'Status': 'No logs found', 'Code': '404', 'Data': []}), status=404, mimetype='application/json')

    # Devuelve el primer evento encontrado
    return Response(json.dumps({'Status': 'Successful request', 'Code': '200', 'Data': events[0]}), status=200, mimetype='application/json')

except Exception as e:
    return Response(json.dumps({'Status': 'Internal Error', 'Code': '500', 'Error': str(e)}), status=500, mimetype='application/json')

from flask_restx import fields

def define_parameters(api):

filtro_log_model = api.model('filtro_log_request', {
    'fechaInicio': fields.String(
        required=True
    ),
    'fechaFin': fields.String(
        required=True
    ),
    'tipoLog': fields.String(
        required=True
    ),
    'codigoResponsable': fields.Integer(
        required=True
    ),
    'rolResponsable': fields.String(
        required=True
    )
})

return filtro_log_model
JulianAvella commented 21 hours ago

Se realiza el filtro de busqueda por fechas y por tipo de log:

image

Los datos que envia el cliente en angular al MID, mostrados en la consola del navegador solo para saber que al momento de desarrollo se estan enviando los datos, la respuesta que recibe el cliente de la api MID y los datos que recibe el cliente del MID:

image

En la terminal de desarrollo del MID muestra los logs con las características de filtro que enviamos desde el cliente:

image