Uma aplicação Go simples para demonstrar como expor métricas customizadas para o Prometheus e executar em Kubernetes.
- Visão Geral
- Funcionalidades
- Pré-requisitos
- Instalação
- Uso
- Deploy no Kubernetes
- Monitoramento
- Estrutura do Projeto
- Desenvolvimento
- Contribuição
Esta aplicação Go é um exemplo prático de como implementar métricas customizadas do Prometheus em uma aplicação Go e integrá-la com um stack de monitoramento Kubernetes usando ServiceMonitor.
A aplicação expõe uma métrica customizada chamada my_custom_metric que gera valores aleatórios a cada 5 segundos, simulando dados de uma aplicação real.
- Métricas Customizadas: Exposição de métricas Prometheus personalizadas
- HTTP Server: Endpoint
/metricspara coleta de métricas - Containerização: Aplicação totalmente containerizada com Docker
- Kubernetes Ready: Manifests completos para deploy em Kubernetes
- ServiceMonitor: Integração automática com Prometheus Operator
- Multi-stage Build: Dockerfile otimizado para produção
- Go 1.24.5 ou superior
- Docker (opcional)
- Cluster Kubernetes
- Prometheus Operator instalado
- kubectl configurado
- Clone o repositório:
git clone https://github.com/williamkoller/golang-custom-metrics.git
cd golang-custom-metrics- Instale as dependências:
go mod download- Execute a aplicação:
go run main.go- Acesse as métricas:
curl http://localhost:8080/metrics- Build da imagem:
docker build -t golang-custom-metrics .- Execute o container:
docker run -p 8080:8080 golang-custom-metricsA aplicação expõe métricas no endpoint padrão do Prometheus:
GET http://localhost:8080/metrics
- Nome:
my_custom_metric - Tipo: Gauge
- Descrição: Exemplo de métrica customizada para Prometheus
- Comportamento: Gera valores aleatórios entre 0 e 100 a cada 5 segundos
Exemplo de saída:
# HELP my_custom_metric Exemplo de métrica customizada para Prometheus
# TYPE my_custom_metric gauge
my_custom_metric 42.1337
kubectl apply -f k8s/- Deploy da aplicação:
kubectl apply -f k8s/deployment.yaml- Criar o service:
kubectl apply -f k8s/service.yaml- Configurar o ServiceMonitor:
kubectl apply -f k8s/servicemonitor.yaml# Verificar pods
kubectl get pods -l app=metrics-addon
# Verificar service
kubectl get svc metrics-addon
# Port-forward para testar
kubectl port-forward svc/metrics-addon 8080:8080O projeto inclui um ServiceMonitor que configura automaticamente o Prometheus para coletar métricas da aplicação:
- Intervalo de coleta: 15 segundos
- Endpoint:
/metrics - Porta:
http(8080)
O ServiceMonitor possui o label release: prometheus que permite ao Prometheus Operator descobrir automaticamente a aplicação e começar a coletar métricas.
# Valor atual da métrica customizada
my_custom_metric
# Taxa de mudança nos últimos 5 minutos
rate(my_custom_metric[5m])
# Valor médio na última hora
avg_over_time(my_custom_metric[1h])
golang-custom-metrics/
├── main.go # Aplicação principal
├── go.mod # Dependências do Go
├── go.sum # Checksums das dependências
├── Dockerfile # Configuração Docker
├── README.md # Documentação
└── k8s/ # Manifests Kubernetes
├── deployment.yaml # Deploy da aplicação
├── service.yaml # Service Kubernetes
└── servicemonitor.yaml # Configuração Prometheus
go test ./...go build -o metrics-addon .go fmt ./...golangci-lint rundocker build -t williamkoller/metrics-addon:latest .docker push williamkoller/metrics-addon:latest- Desenvolvimento local com
go run main.go - Teste das métricas acessando
http://localhost:8080/metrics - Build da imagem Docker para validação
- Deploy no Kubernetes para teste completo
- Verificação no Prometheus se as métricas estão sendo coletadas
- Adicionar mais tipos de métricas (Counter, Histogram)
- Implementar métricas de negócio mais realistas
- Adicionar testes unitários
- Configurar CI/CD pipeline
- Adicionar Grafana dashboards
- Implementar health checks
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
William Koller - @williamkoller
⭐ Se este projeto te ajudou, considere dar uma estrela no repositório!