Cloud Run
Google Cloud Run es un servicio serverless que ejecuta containers en respuesta a requests HTTP o eventos en la arquitectura de data engineering de Solvento.
Descripción
Cloud Run permite ejecutar servicios containerizados de manera serverless, escalando automáticamente según la demanda. Es ideal para servicios que procesan datos, APIs, y procesamiento de eventos.
Flujo de Datos
graph TB
subgraph triggers["Triggers"]
HTTP[HTTP Requests]
PubSub[Pub/Sub]
Scheduler[Cloud Scheduler]
Webhooks[Webhooks]
end
subgraph cloudrun["Cloud Run"]
Service1[Service 1]
Service2[Service 2]
Service3[Service 3]
end
subgraph destinos["Destinos"]
BigQuery[BigQuery]
PubSubOut[Pub/Sub]
Storage[Cloud Storage]
end
HTTP --> Service1
PubSub --> Service2
Scheduler --> Service3
Webhooks --> Service1
Service1 --> BigQuery
Service2 --> PubSubOut
Service3 --> Storage
Recursos
Services
Los servicios containerizados que procesan requests y eventos. Documenta aquí los servicios principales:
Servicios de Webhooks
| Service Name | URL | Imagen | Función | Pub/Sub Topics Publicados |
|---|---|---|---|---|
webhook-syntage-inline-prod |
https://webhook-syntage-inline-prod-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/webhook-syntage-inline:20251107-171207 |
Recibe webhooks de Syntage y publica a múltiples topics | invoices-webhook-prod, buro-webhook-prod, items-api-topic, cp-api-prod, tax-compliance-api-syntage-success |
retry-errors-syntage-prod |
https://retry-errors-syntage-prod-gqomdmitoa-uc.a.run.app |
Por verificar | Reintenta errores de Syntage | Por verificar |
Detalles de webhook-syntage-inline-prod:
- Topics configurados:
- INVOICE_TOPIC: invoices-webhook-prod
- BURO_TOPIC: buro-webhook-prod
- INVOICE_ITEM_TOPIC: items-api-topic
- INVOICE_CFDI_CP_TOPIC: cp-api-prod
- TAX_COMPLIANCE_CHECK_TOPIC: tax-compliance-api-syntage-success
- Base URL: https://api.syntage.com
- Región: us-central1
Servicios de Consistencia de Datos
| Service Name | URL | Imagen | Función | Trigger |
|---|---|---|---|---|
consistencia-elk-bq-syntage |
https://consistencia-elk-bq-syntage-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/consistencia-elk-bq-syntage:latest |
Ejecuta procesos de consistencia entre ELK y BigQuery para datos de Syntage | Cloud Scheduler (cada hora y diario) |
items-consistency-prod |
https://items-consistency-prod-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/syntage-items-consistency:20251107-184328 |
Ajusta y corrige datos de items en BigQuery | Por verificar |
Endpoints de consistencia-elk-bq-syntage:
- /consistency/90days - Ejecuta consistencia de últimos 90 días (cada hora)
- /consistency/historical - Ejecuta consistencia histórica (diario a las 8 AM)
Servicios de APIs y Handlers
| Service Name | URL | Imagen | Función |
|---|---|---|---|
cp-api-syntage-requests-handler-prod |
https://cp-api-syntage-requests-handler-prod-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/api-syntage-requests-handler:20251030-122850 |
Maneja requests de API de CP desde Syntage |
tax-compliance-api-syntage-requests-handler-prod |
https://tax-compliance-api-syntage-requests-handler-prod-gqomdmitoa-uc.a.run.app |
Por verificar | Maneja requests de API de tax compliance desde Syntage |
Servicios de Scraping y Ingesta
| Service Name | URL | Imagen | Función |
|---|---|---|---|
banxico-scraper |
https://banxico-scraper-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/banxico-scraper:latest |
Scrapea datos de Banxico |
diesel-price-scraper |
https://diesel-price-scraper-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/diesel-price-scraper |
Scrapea precios de diesel |
diesel-price-mensual |
https://diesel-price-mensual-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-data-prod/diesel-price-mensual:latest |
Procesa precios mensuales de diesel |
keycloack-ingest-prod |
https://keycloack-ingest-prod-gqomdmitoa-uc.a.run.app |
Por verificar | Ingestiona datos de Keycloak |
terminal-uploader-prod |
https://terminal-uploader-prod-gqomdmitoa-uc.a.run.app |
gcr.io/solvento-adv-analytics-prod/terminal-uploader:latest |
Pipeline ETL BigQuery → Supabase para el Proyecto Terminal. Ver detalles técnicos → |
Servicios de Insights y Analytics
| Service Name | URL | Imagen | Función |
|---|---|---|---|
insights-publisher |
https://insights-publisher-gqomdmitoa-uc.a.run.app |
Por verificar | Publica insights y analytics |
syntage-ciec-extraction-status-prod |
https://syntage-ciec-extraction-status-prod-gqomdmitoa-uc.a.run.app |
Por verificar | Extrae status de CIEC de Syntage |
Configuraciones Relevantes
Container Image
- Imagen Docker utilizada y registry (Artifact Registry, Container Registry)
Scaling
- Min Instances: Número mínimo de instancias
- Max Instances: Número máximo de instancias
- Concurrency: Requests por instancia
Resources
- CPU: Asignación de CPU
- Memory: Asignación de memoria
- Timeout: Tiempo máximo de ejecución
Environment Variables
- Variables de entorno y secretos utilizados
VPC Connector
- Configuración de conectividad a VPC si aplica
IAM
- Permisos y roles IAM para el servicio
Relaciones con Otros Componentes
Triggers (Activadores)
- HTTP Requests: Requests HTTP activan servicios
- Pub/Sub: Mensajes de topics activan servicios
- Cloud Scheduler: Programación periódica activa servicios
- Webhooks: Requests HTTP de sistemas externos
Destinos (Outputs)
- BigQuery: Servicios escriben datos procesados
- Pub/Sub: Servicios publican eventos
- Cloud Storage: Servicios escriben archivos
- APIs: Servicios exponen endpoints HTTP
Patrones de Uso
API Services
Servicios que exponen APIs RESTful para consumo de datos y procesamiento.
Event Processors
Procesamiento de eventos desde Pub/Sub con lógica compleja que requiere containers.
Scheduled Jobs
Jobs programados que se ejecutan periódicamente para procesamiento de datos.
Webhook Handlers
Manejo de webhooks de sistemas externos con procesamiento más complejo que Cloud Functions.
Ejemplos de Servicio
Servicio HTTP Simple
from flask import Flask, request, jsonify
from google.cloud import bigquery
app = Flask(__name__)
@app.route('/process', methods=['POST'])
def process_data():
data = request.get_json()
# Procesar datos
processed = process(data)
# Escribir a BigQuery
client = bigquery.Client(project='solvento-adv-analytics-prod')
table = client.get_table('dataset.table')
client.insert_rows_json(table, [processed])
return jsonify({'status': 'success'})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Deploy
gcloud run deploy my-service \
--image gcr.io/solvento-data-prod/my-service:latest \
--platform managed \
--region us-central1 \
--project solvento-data-prod
Monitoreo y Métricas
El estado operativo de los servicios webhook de Cloud Run se monitorea en el dashboard "Data Processes" de Google Cloud Monitoring (solvento-data-prod).
Ver dashboard Data Processes →
Ver documentación de observabilidad →
Servicio webhook-syntage-inline-prod
Es el servicio webhook principal de Syntage. El dashboard incluye una sección dedicada con tres widgets:
| Widget | Tipo | Métrica / Filtro |
|---|---|---|
| Syntage Webhook Cloud Run Events | Gráfica de línea | Métrica custom logging.googleapis.com/user/webhook_syntage_events — cuenta eventos procesados por el servicio |
| Syntage Webhook Inline — logs ≥ WARNING | Panel de logs | resource.type="cloud_run_revision" service_name="webhook-syntage-inline-prod" location="us-central1" severity>=WARNING |
| Syntage Webhook Inline — request latency (p50 / p95 / p99, ms) | Gráfica de línea | run.googleapis.com/request_latencies — distribución de latencia de requests del servicio en us-central1 |
La sección de Syntage en el dashboard actúa como punto de entrada del flujo: si hay errores o picos de latencia aquí, el problema está en la recepción del webhook antes de que llegue a Pub/Sub.
Servicio bucket-xml-parser-prod
Servicio que procesa archivos XML desde Cloud Storage y escribe a solvento-data-prod.svc_master_public.xml_data.
| Widget | Tipo | Métrica / Filtro |
|---|---|---|
| xml_data — Cloud Run events (files processed) | Gráfica de línea | Métrica custom logging.googleapis.com/user/xml-data-files-processed filtrado por service_name="bucket-xml-parser-prod" |
| xml_data — logs ≥ WARNING | Panel de logs | resource.type="cloud_run_revision" service_name="bucket-xml-parser-prod" severity>=WARNING |
| xml_data — BQ Table Size | Scorecard | bigquery.googleapis.com/storage/stored_bytes en svc_master_public.xml_data |
Flujo completo por pipeline (Pub/Sub → Dataflow → BigQuery)
El dashboard monitorea el flujo completo de cada pipeline de ingesta. Para cada uno se visualizan cinco señales en conjunto:
| Señal | Métrica GCP | Qué indica |
|---|---|---|
| Pub/Sub Messages | pubsub.googleapis.com/topic/send_message_operation_count |
Tasa de mensajes publicados al topic (carga entrante) |
| Dataflow Throughput | dataflow.googleapis.com/job/elements_produced_count por ptransform |
Elementos procesados en la etapa clave del job |
| Dataflow Warnings + Errors | Logs severity>=WARNING filtrados por job_name |
Errores y advertencias en el procesamiento |
| BQ Table Size | bigquery.googleapis.com/storage/stored_bytes |
Tamaño de la tabla destino (señal de que datos siguen llegando) |
| System Lag | pubsub.googleapis.com/topic/oldest_unacked_message_age_by_region |
Edad del mensaje no acusado más antiguo. Umbrales: 600 s (amarillo) / 1 200 s (rojo) |
Pipelines cubiertos y sus topics / jobs / tablas en BQ:
| Pipeline | Topic Pub/Sub | Job Dataflow | Tabla BQ destino |
|---|---|---|---|
| Invoices | invoices-webhook-prod |
^invoices-webhook-prod.* |
syntage.invoices |
| Items | items-api-topic |
^items-api-prod.* |
syntage.invoices_items |
| Carta Porte | cp-api-prod |
^cp-api-multischema-prod.* |
syntage.cp_body |
| Insights NRT + Batch | insights-staging-topic-prod |
^insights-sales-revenue-customers-daily-staging.* |
insights.sales_revenue_customers_daily_staging |
| Tax Compliance | tax-compliance-api-syntage-success |
^tax-compliance-api-multischema-prod.* |
syntage.tax_compliance_body |
| Buro | buro-webhook-prod |
^buro-webhook-prod.* |
buro.buro_body |
| Shinkansen Metadata | shinkansen-payout-metadata-prod |
^shinkansen-metadata-webhook-prod.* |
shinkansen.shinkansen_metadata |
| Shinkansen Payout Results | shinkansen-payout-results-prod |
^shinkansen-payout-results-webhook-prod.* |
shinkansen.shinkansen_payout_results |
Resumen de métricas por servicio webhook
| Servicio | Tipo de métrica | Métrica |
|---|---|---|
webhook-syntage-inline-prod |
Custom (logging) | logging.googleapis.com/user/webhook_syntage_events |
webhook-syntage-inline-prod |
Request latency | run.googleapis.com/request_latencies |
bucket-xml-parser-prod |
Custom (logging) | logging.googleapis.com/user/xml-data-files-processed |
| Todos | Logs ≥ WARNING | Logs de Cloud Run filtrados por service_name y severity>=WARNING |