Este projeto faz parte dos Laboratórios de Pós-Graduação em Go da FullCycle. Consiste em microsserviços para obtenção de informações meteorológicas baseadas em CEP, utilizando OpenTelemetry para rastreamento.
Desenvolver um sistema em Go que receba um CEP, identifica a cidade e retorna o clima atual (temperatura em graus celsius, fahrenheit e kelvin) juntamente com a cidade. Esse sistema deverá implementar OTEL(Open Telemetry) e Zipkin.
- Receber um input de 8 dígitos via POST, através do schema:
{ "cep": "29902555" } - Validar se o input é válido (contém 8 dígitos) e é uma STRING
- Se válido, encaminhar para o Serviço B via HTTP
- Se inválido, retornar:
- Código HTTP: 422
- Mensagem: "invalid zipcode"
- Receber um CEP válido de 8 dígitos
- Realizar a pesquisa do CEP e encontrar o nome da localização
- Retornar as temperaturas formatadas em: Celsius, Fahrenheit, Kelvin juntamente com o nome da localização
- Cenários de resposta:
- Sucesso:
- Código HTTP: 200
- Response Body:
{ "city": "São Paulo", "temp_C": 28.5, "temp_F": 28.5, "temp_K": 28.5 } - CEP inválido (com formato correto):
- Código HTTP: 422
- Mensagem: "invalid zipcode"
- CEP não encontrado:
- Código HTTP: 404
- Mensagem: "can not find zipcode"
- Sucesso:
- Cenários de resposta:
- Implementar tracing distribuído entre Serviço A - Serviço B
- Utilizar span para medir o tempo de resposta do serviço de busca de CEP e busca de temperatura
.
├── config
│ └── otel
├── serviceA
├── serviceB
├── .editorconfig
├── .gitignore
├── README.md
└── docker-compose.yml
- Docker
- Docker Compose
-
Clone o repositório:
git clone https://github.com/valms/zipcode-temperature-tracing.git cd zipcode-temperature-tracing -
Configure as variáveis de ambiente: Crie um arquivo
.envno diretório raiz e adicione as seguintes variáveis:API_KEY=sua_weather_api_keySubstitua
sua_weather_api_keypor uma chave API válida do API WeatherAPI. -
Inicie os serviços usando Docker Compose:
docker-compose up --build -
Os serviços estarão disponíveis nos seguintes endereços:
- ServiceA: http://localhost:8080
- ServiceB: http://localhost:8081
- Coletor OpenTelemetry: http://localhost:4318 (Exportador OTLP HTTP)
Para utilizar o serviço, envie uma requisição POST para o ServiceA com um CEP no corpo da requisição:
curl -X POST http://localhost:8080 -H "Content-Type: application/json" -d '{"cep": "01001000"}'
O serviço retornará as informações de temperatura para o CEP fornecido.
Este projeto utiliza OpenTelemetry para rastreamento distribuído. Você pode visualizar os rastros usando Zipkin.
Ponto de entrada da aplicação. Recebe requisições de CEP, valida-as e as encaminha para o ServiceB.
Recebe requisições de CEP do ServiceA, busca as informações da cidade e obtém as informações de temperatura.
O diretório config/otel contém arquivos de configuração para o Coletor OpenTelemetry.
- https://opentelemetry.io/docs/languages/go/instrumentation/
- open-telemetry/opentelemetry-go#23
- https://opentelemetry.io/docs/languages/go/getting-started/
- https://stackoverflow.com/questions/72867313/opentelemetry-open-span-in-one-process-and-close-it-in-another
- https://opentelemetry.io/docs/concepts/signals/traces/