Este é um exemplo de aplicação Go que demonstra a instrumentação com Jaeger para observabilidade.
- Go 1.22 ou superior
- Docker
- Kubernetes (opcional, para deploy com Helm)
- Jaeger (para visualização dos traces)
É uma boa prática nunca hardcodear endpoints de serviços externos (como o Jaeger) no código ou em arquivos de configuração. Isso porque:
- Portabilidade: O código deve ser portável entre diferentes ambientes (desenvolvimento, homologação, produção)
- Segurança: Evita exposição desnecessária de endpoints internos
- Manutenibilidade: Facilita mudanças de configuração sem necessidade de recompilar o código
- Flexibilidade: Permite diferentes configurações em diferentes ambientes
Nesta aplicação, seguimos estas práticas:
- O endpoint do Jaeger é configurado via variável de ambiente.
- No Kubernetes, usamos o DNS interno do cluster.
- Localmente, usamos o endpoint do ingress.
- Nenhum endpoint está hardcoded no código.
A aplicação utiliza as seguintes variáveis de ambiente:
PORT
: Porta em que a aplicação irá rodar (padrão: 8080)JAEGER_ENDPOINT
: Endpoint do Jaeger Collector (obrigatório)
- Instale as dependências:
cd src
go mod download
- Execute a aplicação:
go run main.go
- Build da imagem:
docker build -t nataliagranato/jaeger-go-instrumentation:0.1.1 .
- Execute o container:
# Para execução local (fora do cluster Kubernetes)
docker run -p 8080:8080 -e JAEGER_ENDPOINT="https://jaeger-http-collector.nataliagranato.xyz/api/traces" nataliagranato/jaeger-go-instrumentation:0.1.1
- Instale o chart:
helm install jaeger-go-instrumentation ./charts
- Para atualizar o endpoint do Jaeger, edite o arquivo
charts/values.yaml
e atualize o valor deJAEGER_ENDPOINT
.
Quando a aplicação está rodando dentro do cluster Kubernetes, usamos o DNS interno do Kubernetes:
env:
- name: JAEGER_ENDPOINT
value: "http://jaeger-collector.jaeger.svc.cluster.local:14268/api/traces"
Onde:
jaeger-collector
: nome do serviço do Jaegerjaeger
: namespace onde o Jaeger está instalado14268
: porta HTTP do collector
Quando a aplicação está rodando localmente (fora do cluster), usamos o endpoint do ingress do Jaeger:
JAEGER_ENDPOINT="https://jaeger-http-collector.nataliagranato.xyz/api/traces"
Após iniciar a aplicação, você pode testar enviando uma requisição para o endpoint:
curl http://localhost:8080/
Os traces serão enviados para o Jaeger e podem ser visualizados na interface do Jaeger UI.
- Acesse a interface do Jaeger UI:
kubectl port-forward -n jaeger svc/jaeger-query 16686:16686
-
Abra o navegador em
http://localhost:16686
-
Na interface do Jaeger:
- Selecione o serviço "go-example-service"
- Clique em "Find Traces"
- Você verá os traces gerados pela aplicação
Cada trace mostrará:
- Nome da operação (helloHandler)
- Duração da operação
- Atributos configurados (event e message)
.
├── Dockerfile
├── README.md
├── charts/
│ ├── Chart.yaml
│ ├── templates/
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
└── src/
├── go.mod
├── go.sum
└── main.go