-
Notifications
You must be signed in to change notification settings - Fork 3
Inserindo Instrumentacao com GoLang #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
API de Tarefas com OpenTelemetry em GoEste projeto é um exemplo prático de como implementar telemetria usando OpenTelemetry em uma aplicação Go. A aplicação consiste em uma API de gerenciamento de tarefas (todo list) com uma arquitetura em camadas e persistência em PostgreSQL. Estrutura do ProjetoO projeto segue uma arquitetura em camadas: Tecnologias UtilizadasBibliotecas Principais
OpenTelemetry
FuncionalidadesA API implementa operações CRUD para tarefas:
Implementação do OpenTelemetryA telemetria foi implementada em várias camadas da aplicação: 1. Inicialização (internal/telemetry/tracing.go)Configuração do provedor de traces, exportador OTLP e propagadores: func InitTracer(serviceName string, collectorURL string) (func(context.Context) error, error) {
// Configuração do tracer, exportador e propagadores
// ...
}2. Middleware HTTP (internal/telemetry/middleware.go)Instrumenta todas as requisições HTTP: func TracingMiddleware(next http.Handler) http.Handler {
// Criação de spans para cada requisição HTTP
// Propagação de contexto
// Captura de status code e headers
// ...
}3. Camada de Serviço (internal/core/task/service.go)Cada método de serviço cria spans próprios: func (s *TaskService) CreateTask(title, description string, concluded bool) error {
// Criação de span específico para esta operação
// Adição de atributos e metadados
// ...
}4. Repositório (internal/core/task/pg_repository.go)Operações de banco de dados também são rastreadas: func (r *PgTaskRepository) GetAll() ([]Task, error) {
// Span para operação de banco
// Atributos como tipo de operação SQL
// Métricas como número de linhas retornadas
// ...
}Configuração do AmbienteO projeto usa Docker Compose para configurar:
version: '3.8'
services:
postgres:
# Configuração do PostgreSQL
jaeger:
# Configuração do Jaeger All-in-One
# Expõe UI na porta 16686Como Executar
ObservabilidadeA implementação de OpenTelemetry permite:
Benefícios do OpenTelemetry
ContribuindoContribuições são bem-vindas! Este projeto serve como referência para implementação de telemetria em aplicações Go. |
| @@ -0,0 +1,54 @@ | |||
| services: | |||
| postgres: | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Acho que aqui pode deixar só o Postgres, o resto já tem lá no docker-compose global
https://github.com/douglasjunior/learning-open-telemetry/blob/main/docker/docker-compose.yml
| go run main.go | ||
| ``` | ||
|
|
||
| 5. Visualize os traces em http://localhost:16686 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Vc chegou a adicionar um swagger na API pra facilitar a geração dos tracings?
| ctx, span := tracer.Start(ctx, "DeleteTask", trace.WithAttributes( | ||
| attribute.String("task.id", id), | ||
| )) | ||
| defer span.End() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uma dúvida, o span.End não deveria acontecer DEPOIS do s.repo.Delete(id)?
Pergunto pq se o span terminar primeiro, acho que o Delete não vai ser instrumentado, ou vai?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
O mesmo vale para o EditTask
|
|
||
| func (s *TaskService) EditTask(id string, newTask Task) error { | ||
| ctx := context.Background() | ||
| tracer := otel.Tracer("task-service") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dúvida, vi na DOC do OTEL que eles sugerem criar uma função de Handler para capturar o tracing "automático" para todas as rotas, pelo oq entendi vira um wrapper da função de Handler do GO.
https://opentelemetry.io/docs/languages/go/getting-started/#instrument-the-http-server
Será que não fica melhor doq controlar o tracing na mão aqui?

No description provided.