3.7 KiB
3.7 KiB
Referencia técnica (SaveUrl.py)
Constantes relevantes
APP_NAME:PYTHON_CREATE_URL-FTP_APPVERSION:2.0.0PROCEDURE_ID_SUFFIX:000301900001FTP_BASE_URL:https://000oqta.rcomhost.comFTP_BASE_PATH:/www/imglm/2026/WEBHOOK_URL: se obtiene desde Airflow VariableWEBHOOK_URL_NOTIFICATIONINFORMATIONS: lista de fuentes a procesar (carpeta, identity_id, database lógico, database_id)
Clase KafkaLogger
Responsabilidad
Publica logs de ejecución a Kafka en el topic:
executions_logs
Inicialización
Parámetros:
source: string (se usaf"{APP_NAME}_{VERSION}")bootstrap_servers: lista/string de brokersuse_ssl: boolean
Comportamiento:
- serializa
valuecomo JSON (json.dumps(...).encode('utf-8')) - si
use_sslesTrue, agrega configuración SASL/SSL desdeos.getenv
Método log(...)
Firma (conceptual):
log(database, db_id, procedure_name, status, message, executed_by, target_date, date, extra_info=None)
Payload enviado a Kafka (campos clave):
database: nombre lógico (ej.glm_pmi)procedure_id:str(db_id) + PROCEDURE_ID_SUFFIXprocedure_name: texto comoGeneracion de URL <db>procedure_type:PYTHON_APPstatus:STARTING|SUCCESS|FAILED|FINISHEDmessage: descripción del eventoexecuted_by: usuario SQL (DB_MSSQ_USER)source:sourcedel loggerextra_info: string (sanitiza comillas simples)target_date: fecha objetivo (YYYY-MM-DD)date: timestamp (string)
Función read_ftp(...)
Responsabilidad
Conecta al FTP y lista archivos en:
FTP_BASE_PATH + code_folder
Luego construye URLs públicas y parsea metadatos en un dict.
Parámetros:
ftp_server,ftp_user,ftp_passwordcode_folder: carpeta calculada (<name_folder><MM>)identity_id: string para ubicarIDcodigodentro del nombreyear,month: se usan para encontrar_{YYYY}-{MM}
Salida:
list[dict]con llaves:Folder,Date,IDcodigo,ObjectCode,TaskName,URL
Errores esperados:
- fallo de login o conectividad FTP
- path inexistente (depende de cómo responda
nlst) - parsing incorrecto si el nombre no contiene los patrones esperados
Función read_table_where(...)
Responsabilidad
Lee registros existentes en SQL Server desde una tabla, filtrando por Folder.
Query:
SELECT * FROM [URL_FTP] WHERE Folder LIKE '%<folder>%'
Salida:
- lista de dicts (columna → valor)
Errores esperados:
- driver ODBC no instalado en runtime
- credenciales inválidas / permisos insuficientes
- tabla inexistente
Función insert_records(...)
Responsabilidad
Inserta registros en SQL Server en lotes de 1000.
Detalles:
- toma columnas desde el primer elemento del
data - excluye
IDyExportDatesi existen en el dict - arma un
INSERT INTO [URL_FTP] ([col1],...) VALUES (?,...)
Salida:
- cantidad de registros insertados (int)
Errores esperados:
- tipos incompatibles con schema SQL
- restricciones (NOT NULL, UNIQUE) no satisfechas
- problemas de red/conexión
Función run_save_url(**context)
Responsabilidad
Orquesta toda la ejecución:
- inicializa
KafkaLogger - obtiene Variables de Airflow (FTP/SQL/Kafka/webhook)
- recorre
INFORMATIONS - para cada item:
read_ftp→read_table_where→ diff porIDcodigo→insert_records- logging a Kafka por pasos
- notificación por webhook si hay errores
Notificación (webhook)
En errores, construye un texto (formato “ALERTA PIPELINE”) y hace:
POST <WEBHOOK_URL_NOTIFICATION>con JSON:{"message": "<texto>"}
Consideraciones Airflow
- El parámetro
**contextpermite que el callable sea usado porPythonOperator. - La función usa
datetime.now()(no usaexecution_datede Airflow).