Este proyecto implementa un entorno de observabilidad distribuida utilizando Go, OpenTelemetry, Jaeger, Grafana + Loki, SQS (via LocalStack) y terraform para la infraestructura local.
Su objetivo es trazar el ciclo de vida de eventos entre microservicios simulados (lambda-a y lambda-b) a través de colas y observabilidad centralizada.
observability-challenge/
├── lambda-a/ # Primer lambda: envía un mensaje trazado a SQS
│ └── main.go
├── lambda-b/ # Segundo lambda: consume el mensaje y continúa la traza
│ └── main.go
├── tracing/ # Inicializador global de OpenTelemetry
│ └── tracer.go
├── terraform/ # Infraestructura local simulada con Terraform y LocalStack
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfstate
├── docker-compose.yml # Stack de observabilidad (Jaeger, Loki, Grafana, LocalStack)
├── loki-config.yaml # Configuración de Loki
├── promtail-config.yaml # Configuración de Promtail para logs locales
├── go.mod # Dependencias Go
├── Makefile # Comandos para levantar, destruir, testear y monitorear
└── README.md # Documentación del proyecto (vos estás acá)
| Servicio | Tecnología | Función |
|---|---|---|
lambda-a |
Go + OpenTelemetry | Simula un productor que inicia una traza y publica en SQS |
lambda-b |
Go + OpenTelemetry | Simula un consumidor que recibe el mensaje y continúa la traza |
SQS |
LocalStack + Terraform | Cola que conecta lambda-a → lambda-b |
Jaeger |
Jaeger Docker | Visualización de trazas distribuidas |
Loki |
Grafana Loki | Ingesta y consulta de logs |
Grafana |
Grafana Docker | Visualización de logs desde Loki |
- 🔵 Lenguaje: Go
1.24.3 - ⚙️ Tracing: OpenTelemetry
v1.36.0 - 📬 Mensajería: AWS SQS (simulada con LocalStack)
- 📈 Trazabilidad visual: Jaeger
- 📄 Logs estructurados: Grafana + Loki + Promtail
- ☁️ Infraestructura como código: Terraform
v1.6+
Esta sección documenta distintos escenarios de ejecución que podés probar para validar la trazabilidad distribuida entre lambda-a y lambda-b. Cada playbook incluye comandos, qué observar en los logs y cómo se refleja en Jaeger o Grafana.
Simula un request HTTP que dispara un trace en lambda-a, que luego envía un mensaje a SQS. lambda-b recibe ese mensaje, crea un nuevo span, y completa el ciclo.
-
Asegurate de tener los servicios corriendo:
make observability-up make infra