graftel

package module
v2.4.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 22, 2025 License: MIT Imports: 27 Imported by: 0

README

Graftel

Go Reference Go Report Card

Graftel é uma biblioteca Go que facilita o uso do OpenTelemetry, focada em métricas, logs e traces. Projetada para ser simples, intuitiva e seguir as melhores práticas da comunidade Go.

🚀 Características

  • Inicialização simplificada do OpenTelemetry
  • Suporte completo para métricas: Counter, Gauge, Histogram, UpDownCounter
  • Logs estruturados com múltiplos níveis (Trace, Debug, Info, Warn, Error, Fatal)
  • Tracing distribuído - suporte completo a spans e traces
  • Middleware HTTP - para Gin, Echo, Chi e net/http com observabilidade automática
  • Helpers de contexto - propagação de tags e context logger
  • Integração com Prometheus (opcional)
  • Exportação via OTLP HTTP para sistemas de observabilidade
  • Processamento automático de URLs - aceita URLs completas com path
  • Configuração via variáveis de ambiente - suporte completo a ENVs
  • API fluente com pattern builder
  • Interfaces bem definidas para testabilidade
  • Documentação completa com exemplos práticos
  • Atributos de log organizados - prefixo automático tags. para melhor estruturação
  • Resource sanitizado - remove campos sensíveis automaticamente

📦 Instalação

go get github.com/CristianSsousa/graftel

🎯 Uso Básico

Inicialização
package main

import (
    "context"
    "log"

    "github.com/CristianSsousa/graftel"
)

func main() {
    // Configurar usando o pattern de builder
    // As configurações podem ser fornecidas via variáveis de ambiente GRAFTEL_*
    // ou explicitamente via métodos With*. A ordem de prioridade é:
    // 1. Valores passados via With* (maior prioridade)
    // 2. Variáveis de ambiente GRAFTEL_*
    // 3. Valores padrão

    config := graftel.NewConfig("meu-servico").
        WithServiceVersion("1.0.0").
        WithOTLPEndpoint("http://localhost:4318"). // Aceita URLs completas com path
        WithInsecure(true) // Para desenvolvimento local (HTTP sem TLS)

    client, err := graftel.NewClient(config)
    if err != nil {
        log.Fatal(err)
    }

    ctx := context.Background()
    if err := client.Initialize(ctx); err != nil {
        log.Fatal(err)
    }
    defer client.Shutdown(ctx)

    // Usar métricas e logs...
}
Processamento de URLs

A biblioteca processa automaticamente diferentes formatos de URL:

  • URLs completas: https://example.com:4318/v1/traces → extrai host:port e path
  • URLs sem path: http://localhost:4318 → usa path padrão
  • Host:port simples: localhost:4318 → funciona normalmente
  • Host:port com path: localhost:4318/otlp → extrai path corretamente

O processamento é feito automaticamente, então você pode usar qualquer formato que preferir.

📊 Métricas

Counter (Contador)
metrics := client.NewMetricsHelper("meu-servico/metrics")

counter, err := metrics.NewCounter(
    "requests_total",
    "Total de requisições recebidas",
)
if err != nil {
    log.Fatal(err)
}

// Incrementar contador
counter.Increment(ctx,
    attribute.String("method", "GET"),
    attribute.String("path", "/api/users"),
    attribute.Int("status", 200),
)

// Adicionar valor específico
counter.Add(ctx, 5, attribute.String("method", "POST"))
Histogram
histogram, err := metrics.NewHistogram(
    "request_duration_seconds",
    "Duração das requisições em segundos",
)
if err != nil {
    log.Fatal(err)
}

// Registrar duração
start := time.Now()
// ... fazer algo ...
duration := time.Since(start)
histogram.RecordDuration(ctx, duration,
    attribute.String("endpoint", "/api/users"),
)
UpDownCounter
connections, err := metrics.NewUpDownCounter(
    "active_connections",
    "Número de conexões ativas",
)
if err != nil {
    log.Fatal(err)
}

// Incrementar
connections.Increment(ctx, attribute.String("type", "websocket"))

// Decrementar
connections.Decrement(ctx, attribute.String("type", "websocket"))
Gauge (Observable)
gauge, err := metrics.NewGauge(
    "memory_usage_bytes",
    "Uso de memória em bytes",
    func(ctx context.Context, observer metric.Float64Observer) error {
        var m runtime.MemStats
        runtime.ReadMemStats(&m)
        observer.Observe(float64(m.Alloc),
            attribute.String("type", "heap"))
        return nil
    },
)

📝 Logs

Logs Simples
logs := client.NewLogsHelper("meu-servico/logs")

// Logs simples
// Nota: Todos os atributos customizados são automaticamente prefixados com "tags."
// para melhor organização (ex: "port" vira "tags.port")
logs.Info(ctx, "Servidor iniciado",
    attribute.String("port", "8080"),
    attribute.String("environment", "production"),
)

logs.Debug(ctx, "Processando requisição",
    attribute.String("method", "GET"),
    attribute.String("path", "/api/users"),
)

logs.Warn(ctx, "Tentativa de acesso não autorizado",
    attribute.String("ip", "192.168.1.1"),
)

logs.Error(ctx, "Falha ao processar requisição",
    attribute.String("error", "timeout"),
)

// Log com erro
err := fmt.Errorf("erro ao conectar ao banco")
logs.ErrorWithError(ctx, "Falha na conexão", err,
    attribute.String("database", "postgres"),
)
Logs com Campos Extras
// Logs com campos extras usando map
logs.InfoWithFields(ctx, "Processando requisição",
    map[string]interface{}{
        "user_id":    12345,
        "request_id": "req-abc-123",
        "ip":         "192.168.1.1",
        "duration":   150.5,
        "success":    true,
    },
    attribute.String("method", "POST"),
    attribute.String("path", "/api/users"),
)

// Log de erro com campos extras
err := fmt.Errorf("falha na conexão")
logs.ErrorWithFields(ctx, "Erro ao processar",
    map[string]interface{}{
        "error_code": "DB_CONNECTION_FAILED",
        "retry_count": 3,
    },
)
logs.ErrorWithError(ctx, "Erro ao processar", err,
    attribute.String("error_code", "DB_CONNECTION_FAILED"),
)

🔍 Tracing (Rastreamento)

Spans Básicos
tracing := client.NewTracingHelper("meu-servico")

// Criar um span
ctx, span := tracing.StartSpanWithTags(ctx, "operacao",
    attribute.String("user_id", "123"),
    attribute.String("operation", "processar"),
)
defer span.End()

// Executar operação dentro de um span
err := tracing.WithSpan(ctx, "processar-dados", func(ctx context.Context) error {
    // Sua lógica aqui
    return nil
}, attribute.String("tipo", "batch"))
Spans com Retorno
result, err := tracing.WithSpanAndReturn(ctx, "buscar-dados",
    func(ctx context.Context) (interface{}, error) {
        // Buscar dados
        return dados, nil
    },
    attribute.String("tabela", "usuarios"),
)
Gerenciamento de Erros e Status
ctx, span := tracing.StartSpan(ctx, "operacao")
defer span.End()

// Adicionar tags durante a execução
tracing.AddSpanTags(ctx, attribute.String("progress", "50%"))

// Registrar erro
if err != nil {
    tracing.SetSpanError(ctx, err,
        attribute.String("retry_count", "3"))
}

// Definir status manualmente
tracing.SetSpanStatus(ctx, codes.Ok, "Operação concluída")
Informações de Trace
traceID := tracing.GetTraceID(ctx)
spanID := tracing.GetSpanID(ctx)
fmt.Printf("Trace ID: %s, Span ID: %s\n", traceID, spanID)
Funções Auxiliares Globais
// Executar função com span e timing automático
err := graftel.WithSpanTiming(ctx, "operacao-lenta", func(ctx context.Context) error {
    // Sua lógica aqui
    return nil
}, attribute.String("tipo", "processamento"))

🌐 Middleware HTTP

net/http
import (
    "net/http"
    "github.com/CristianSsousa/graftel"
)

mux := http.NewServeMux()
mux.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("OK"))
})

config := graftel.DefaultMiddlewareConfig("meu-servico")
handler := graftel.HTTPMiddleware(client, config)(mux)

http.ListenAndServe(":8080", handler)
Gin
import (
    "github.com/gin-gonic/gin"
    "github.com/CristianSsousa/graftel"
)

router := gin.Default()
config := graftel.DefaultMiddlewareConfig("meu-servico")
router.Use(graftel.GinMiddleware(client, config))

router.GET("/api/users", func(c *gin.Context) {
    c.JSON(200, gin.H{"message": "OK"})
})

router.Run(":8080")
Echo
import (
    "github.com/labstack/echo/v4"
    "github.com/CristianSsousa/graftel"
)

e := echo.New()
config := graftel.DefaultMiddlewareConfig("meu-servico")
e.Use(graftel.EchoMiddleware(client, config))

e.GET("/api/users", func(c echo.Context) error {
    return c.JSON(200, map[string]string{"message": "OK"})
})

e.Start(":8080")
Chi
import (
    "github.com/go-chi/chi/v5"
    "github.com/CristianSsousa/graftel"
)

r := chi.NewRouter()
config := graftel.DefaultMiddlewareConfig("meu-servico")
r.Use(graftel.ChiMiddleware(client, config))

r.Get("/api/users", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("OK"))
})

http.ListenAndServe(":8080", r)
Configuração do Middleware
config := graftel.MiddlewareConfig{
    ServiceName:        "meu-servico",
    SkipPaths:          []string{"/health", "/metrics", "/ready"},
    RecordRequestBody:  false,
    RecordResponseBody: false,
    MaxBodySize:        4096,
}

// Ou usar configuração padrão
config := graftel.DefaultMiddlewareConfig("meu-servico")

O middleware automaticamente captura:

  • Métricas: http_requests_total, http_request_duration_seconds, http_request_size_bytes, http_response_size_bytes
  • Traces: Spans para cada requisição HTTP
  • Logs: Logs automáticos de requisições e respostas

🏷️ Helpers de Contexto

Adicionar Tags ao Contexto
// Adicionar tags ao contexto
ctx = graftel.WithTags(ctx,
    attribute.String("user_id", "123"),
    attribute.String("request_id", "req-abc-123"),
)

// Obter tags do contexto
tags := graftel.GetTagsFromContext(ctx)

// Mesclar tags existentes com novas
ctx = graftel.MergeContextTags(ctx,
    attribute.String("additional_tag", "value"),
)
Context Logger

O ContextLogger herda automaticamente as tags do contexto:

// Criar logger com contexto
ctx = graftel.WithTags(ctx,
    attribute.String("user_id", "123"),
    attribute.String("session_id", "sess-456"),
)

logger := graftel.NewContextLogger(logs, ctx)

// Todos os logs incluirão automaticamente user_id e session_id
logger.Info("Operação iniciada")
logger.Error("Erro ao processar", attribute.String("error_code", "E001"))

// Adicionar tags adicionais apenas para este log
logger.WithTags(attribute.String("step", "validation")).Info("Validação concluída")
Propagação de Tags
// Em uma função
func processarRequisicao(ctx context.Context, userID string) error {
    // Adicionar tags ao contexto
    ctx = graftel.WithTags(ctx,
        attribute.String("user_id", userID),
        attribute.String("function", "processarRequisicao"),
    )

    // Criar logger que herda as tags
    logger := graftel.NewContextLogger(logs, ctx)
    logger.Info("Processando requisição")

    // Chamar outra função - tags são propagadas
    return processarDados(ctx)
}

func processarDados(ctx context.Context) error {
    // Tags do contexto anterior estão disponíveis
    logger := graftel.NewContextLogger(logs, ctx)
    logger.Info("Processando dados") // Inclui user_id e function automaticamente
    return nil
}

⚙️ Configuração

Formatos de URL Suportados

A biblioteca aceita diferentes formatos de URL para o endpoint OTLP:

// URL completa com protocolo e path (recomendado)
config := graftel.NewConfig("meu-servico").
    WithOTLPEndpoint("https://otlp-gateway-prod-us-central-0.grafana.net/otlp")

// URL completa sem path (usa path padrão)
config := graftel.NewConfig("meu-servico").
    WithOTLPEndpoint("http://localhost:4318")

// Apenas host:port (sem protocolo)
config := graftel.NewConfig("meu-servico").
    WithOTLPEndpoint("localhost:4318")

// Host:port com path
config := graftel.NewConfig("meu-servico").
    WithOTLPEndpoint("localhost:4318/v1/traces")

Nota: A biblioteca processa automaticamente a URL, extraindo o host:port e o path quando necessário. URLs completas com http:// ou https:// são automaticamente parseadas.

Configuração com Prometheus

Para expor métricas via Prometheus (útil para Grafana):

config := graftel.NewConfig("meu-servico").
    WithPrometheusEndpoint(":8080") // Expor em http://localhost:8080/metrics

client, err := graftel.NewClient(config)
if err != nil {
    log.Fatal(err)
}

ctx := context.Background()
if err := client.Initialize(ctx); err != nil {
    log.Fatal(err)
}
defer client.Shutdown(ctx)

// Obter exporter Prometheus
exporter := client.GetPrometheusExporter()
if exporter != nil {
    http.Handle("/metrics", exporter)
    http.ListenAndServe(":8080", nil)
}
Configuração Avançada
config := graftel.NewConfig("meu-servico").
    WithServiceVersion("1.0.0").
    WithOTLPEndpoint("http://localhost:4318").
    WithResourceAttributes(map[string]string{
        "environment": "production",
        "team":        "backend",
    }).
    WithMetricExportInterval(30 * time.Second).
    WithLogExportInterval(30 * time.Second).
    WithInsecure(true) // Para desenvolvimento local (HTTP sem TLS)
Opções de Configuração Disponíveis
Método Descrição ENV Padrão
WithServiceVersion(version) Define a versão do serviço GRAFTEL_SERVICE_VERSION ""
WithOTLPEndpoint(endpoint) Define o endpoint OTLP (aceita URLs completas) GRAFTEL_OTLP_ENDPOINT "http://localhost:4318"
WithAPIKey(key) Define a chave de API para autenticação GRAFTEL_API_KEY ""
WithInstanceID(id) Define o ID da instância (usado como service.instance.id) GRAFTEL_INSTANCE_ID ""
WithPrometheusEndpoint(endpoint) Define o endpoint para expor métricas Prometheus GRAFTEL_PROMETHEUS_ENDPOINT ""
WithResourceAttribute(key, value) Adiciona um atributo ao resource - {}
WithResourceAttributes(attrs) Adiciona múltiplos atributos ao resource - {}
WithMetricExportInterval(interval) Define o intervalo de exportação de métricas GRAFTEL_METRIC_EXPORT_INTERVAL 30s
WithLogExportInterval(interval) Define o intervalo de exportação de logs GRAFTEL_LOG_EXPORT_INTERVAL 30s
WithExportTimeout(timeout) Define o timeout para exportação GRAFTEL_EXPORT_TIMEOUT 10s
WithInsecure(insecure) Desabilita TLS (apenas para desenvolvimento) GRAFTEL_INSECURE false

🔧 Configuração via Variáveis de Ambiente

A biblioteca suporta configuração completa via variáveis de ambiente, facilitando o deploy em diferentes ambientes sem alterar código.

Ordem de Prioridade

As configurações são carregadas na seguinte ordem (maior para menor prioridade):

  1. Valores passados via métodos With* (maior prioridade)
  2. Variáveis de ambiente GRAFTEL_*
  3. Valores padrão
Variáveis de Ambiente Disponíveis
Variável Descrição Exemplo
GRAFTEL_SERVICE_NAME Nome do serviço meu-servico
GRAFTEL_SERVICE_VERSION Versão do serviço 1.0.0
GRAFTEL_OTLP_ENDPOINT Endpoint OTLP https://otlp.example.com/otlp
GRAFTEL_API_KEY Chave de API para autenticação sua-chave-api
GRAFTEL_INSTANCE_ID ID da instância instance-123
GRAFTEL_PROMETHEUS_ENDPOINT Endpoint Prometheus :8080
GRAFTEL_INSECURE Desabilitar TLS true ou false
GRAFTEL_METRIC_EXPORT_INTERVAL Intervalo de exportação de métricas 30s
GRAFTEL_LOG_EXPORT_INTERVAL Intervalo de exportação de logs 30s
GRAFTEL_EXPORT_TIMEOUT Timeout para exportação 10s
Exemplo: Usando Apenas Variáveis de Ambiente
package main

import (
    "context"
    "log"

    "github.com/CristianSsousa/graftel"
)

func main() {
    // Todas as configurações vêm das variáveis de ambiente GRAFTEL_*
    // Configure-as antes de executar:
    // export GRAFTEL_SERVICE_NAME="meu-servico"
    // export GRAFTEL_OTLP_ENDPOINT="https://otlp.example.com/otlp"
    // export GRAFTEL_API_KEY="sua-chave"

    config := graftel.NewConfig("") // ServiceName será lido de GRAFTEL_SERVICE_NAME

    client, err := graftel.NewClient(config)
    if err != nil {
        log.Fatal(err)
    }

    ctx := context.Background()
    if err := client.Initialize(ctx); err != nil {
        log.Fatal(err)
    }
    defer client.Shutdown(ctx)

    // Usar métricas e logs...
}
Exemplo: Misturando ENV e With*
// Valores passados via With* têm prioridade sobre ENV
config := graftel.NewConfig("meu-servico"). // ServiceName explícito
    WithServiceVersion("1.0.0").            // Version explícita
    // OTLPEndpoint será lido de GRAFTEL_OTLP_ENDPOINT se não fornecido
    // APIKey será lido de GRAFTEL_API_KEY se não fornecido

🏷️ Atributos de Log Organizados

Todos os atributos customizados adicionados aos logs são automaticamente prefixados com tags. para melhor organização e estruturação dos metadados.

logs.Info(ctx, "Requisição processada",
    attribute.String("method", "GET"),      // Vira "tags.method"
    attribute.String("path", "/api/users"), // Vira "tags.path"
    attribute.Int("status", 200),           // Vira "tags.status"
)

Os atributos do Resource do OpenTelemetry (como process.pid, host.name, os.type, etc.) não são prefixados, mantendo a compatibilidade com os padrões do OpenTelemetry.

🛡️ Resource Sanitizado

A biblioteca automaticamente remove campos sensíveis ou desnecessários do Resource OpenTelemetry:

Campos removidos:

  • process.command_args - Argumentos de linha de comando
  • process.executable.path - Caminho completo do executável
  • process.executable.name - Nome do executável
  • process.command - Comando completo
  • process.owner - Proprietário do processo

Campos mantidos:

  • process.pid - ID do processo (útil para debugging)
  • process.runtime.* - Informações sobre o runtime (Go version, etc.)
  • host.name - Nome do host
  • os.type, os.description - Informações do sistema operacional
  • service.name, service.version - Informações do serviço
  • service.instance.id - ID da instância (se configurado)

Isso reduz o volume de dados enviados e remove informações sensíveis dos logs.

📚 Exemplos

A biblioteca inclui exemplos completos na pasta examples/:

  • examples/basic/ - Exemplo básico com métricas e logs usando endpoint local
  • examples/prometheus/ - Exemplo com Prometheus para expor métricas
  • examples/grafana-cloud/ - Exemplo usando variáveis de ambiente e autenticação
  • examples/tracing/ - Exemplo de uso de tracing com spans
  • examples/middleware/ - Exemplo de middleware HTTP com Gin
  • examples/context/ - Exemplo de uso de context helpers e context logger

Para executar um exemplo:

# Exemplo básico (endpoint local)
cd examples/basic
go run main.go

# Exemplo com Prometheus
cd examples/prometheus
go run main.go
# Acesse http://localhost:8080/metrics

# Exemplo com configuração via variáveis de ambiente
cd examples/grafana-cloud
export GRAFTEL_SERVICE_NAME="meu-servico"
export GRAFTEL_OTLP_ENDPOINT="https://otlp.example.com/otlp"
export GRAFTEL_API_KEY="sua-chave-aqui"
export GRAFTEL_INSTANCE_ID="seu-instance-id"  # Opcional
go run main.go

# Exemplo de tracing
cd examples/tracing
go run main.go

# Exemplo de middleware HTTP
cd examples/middleware
go run main.go
# Acesse http://localhost:8080/api/users

# Exemplo de context helpers
cd examples/context
go run main.go
Exemplo: Uso com Diferentes Formatos de URL
// Exemplo 1: URL completa com path e autenticação
config1 := graftel.NewConfig("servico-1").
    WithOTLPEndpoint("https://otlp.example.com/otlp").
    WithAPIKey("sua-chave").
    WithInstanceID("instance-123").
    WithInsecure(false)

// Exemplo 2: URL local sem path
config2 := graftel.NewConfig("servico-2").
    WithOTLPEndpoint("http://localhost:4318").
    WithInsecure(true)

// Exemplo 3: Apenas host:port
config3 := graftel.NewConfig("servico-3").
    WithOTLPEndpoint("localhost:4318").
    WithInsecure(true)

// Exemplo 4: Host:port com path customizado
config4 := graftel.NewConfig("servico-4").
    WithOTLPEndpoint("localhost:4318/v1/custom").
    WithInsecure(true)

🏗️ Estrutura do Projeto

.
├── client.go             # Cliente principal e inicialização
├── config.go             # Configuração com pattern builder
├── metrics.go            # Helpers para métricas
├── logs.go               # Helpers para logs
├── tracing.go             # Helpers para tracing
├── middleware.go         # Middlewares HTTP
├── context.go            # Helpers de contexto
├── errors.go             # Erros customizados
├── *_test.go             # Testes unitários
├── examples/             # Exemplos de uso
│   ├── basic/            # Exemplo básico
│   ├── prometheus/       # Exemplo com Prometheus
│   └── grafana-cloud/    # Exemplo com Grafana Cloud
├── go.mod                # Dependências do módulo
├── go.sum                # Checksums das dependências
├── .gitignore            # Arquivos ignorados pelo Git
└── README.md             # Esta documentação

🧪 Testes

Execute os testes:

go test ./graftel/... -v

📋 Requisitos

  • Go 1.23 ou superior
  • OpenTelemetry SDK v1.38.0 ou superior

🔗 Dependências Principais

  • go.opentelemetry.io/otel - OpenTelemetry Go SDK
  • go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp - Exportador OTLP para métricas
  • go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp - Exportador OTLP para logs
  • go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp - Exportador OTLP para traces
  • go.opentelemetry.io/otel/exporters/prometheus - Exportador Prometheus
  • github.com/gin-gonic/gin - Framework Gin (opcional, para middleware)
  • github.com/labstack/echo/v4 - Framework Echo (opcional, para middleware)

🤝 Contribuindo

Contribuições são bem-vindas! Sinta-se à vontade para:

  1. Fazer fork do projeto
  2. Criar uma branch para sua feature (git checkout -b feature/AmazingFeature)
  3. Commit suas mudanças (git commit -m 'Add some AmazingFeature')
  4. Push para a branch (git push origin feature/AmazingFeature)
  5. Abrir um Pull Request

📄 Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.

👤 Autor

Cristian S. Sousa

🙏 Agradecimentos

  • OpenTelemetry pela excelente especificação e SDK
  • Comunidade Go por todas as ferramentas e bibliotecas incríveis

📖 Documentação Adicional


⭐ Se este projeto foi útil para você, considere dar uma estrela no repositório!

Documentation

Overview

Package graftel fornece uma interface simplificada para trabalhar com OpenTelemetry em aplicações Go, focando em métricas e logs.

Exemplo básico:

config := graftel.NewConfig("meu-servico").
	WithServiceVersion("1.0.0").
	WithOTLPEndpoint("http://localhost:4318").
	WithInsecure(true)

client, err := graftel.NewClient(config)
if err != nil {
	log.Fatal(err)
}

ctx := context.Background()
if err := client.Initialize(ctx); err != nil {
	log.Fatal(err)
}
defer client.Shutdown(ctx)

Package graftel fornece helpers para trabalhar com logs OpenTelemetry.

Package graftel fornece helpers para trabalhar com métricas OpenTelemetry.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func ChiMiddleware

func ChiMiddleware(client Client, config MiddlewareConfig) func(http.Handler) http.Handler

func EchoMiddleware

func EchoMiddleware(client Client, config MiddlewareConfig) echo.MiddlewareFunc

func GetTagsFromContext

func GetTagsFromContext(ctx context.Context) []attribute.KeyValue

func GinMiddleware

func GinMiddleware(client Client, config MiddlewareConfig) gin.HandlerFunc

func HTTPMiddleware

func HTTPMiddleware(client Client, config MiddlewareConfig) func(http.Handler) http.Handler

func MergeContextTags

func MergeContextTags(ctx context.Context, additionalTags ...attribute.KeyValue) context.Context

func StartSpan

func StartSpan(ctx context.Context, name string, tags ...attribute.KeyValue) (context.Context, trace.Span)

func WithSpan

func WithSpan(ctx context.Context, name string, fn func(context.Context) error, tags ...attribute.KeyValue) error

func WithSpanTiming

func WithSpanTiming(ctx context.Context, name string, fn func(context.Context) error, tags ...attribute.KeyValue) error

func WithTags

func WithTags(ctx context.Context, tags ...attribute.KeyValue) context.Context

Types

type Client

type Client interface {
	// Initialize inicializa o OpenTelemetry com métricas e logs.
	// Deve ser chamado antes de usar qualquer funcionalidade.
	Initialize(ctx context.Context) error

	// Shutdown encerra o cliente OpenTelemetry de forma segura.
	// Deve ser chamado ao finalizar a aplicação.
	Shutdown(ctx context.Context) error

	// GetMeter retorna um Meter para criar métricas.
	GetMeter(name string, opts ...otelmetric.MeterOption) otelmetric.Meter

	// GetLogger retorna um Logger para criar logs.
	GetLogger(name string) otellog.Logger

	// GetPrometheusExporter retorna o exporter Prometheus, se configurado.
	// Retorna nil se Prometheus não estiver habilitado.
	GetPrometheusExporter() *prometheus.Exporter

	// NewMetricsHelper cria um helper para facilitar o uso de métricas.
	NewMetricsHelper(name string) MetricsHelper

	// NewLogsHelper cria um helper para facilitar o uso de logs.
	NewLogsHelper(name string) LogsHelper

	// GetTracer retorna um Tracer para criar spans e traces.
	GetTracer(name string, opts ...trace.TracerOption) trace.Tracer

	// NewTracingHelper cria um helper para facilitar o uso de tracing.
	NewTracingHelper(name string) TracingHelper
}

Client gerencia a inicialização e uso do OpenTelemetry. É a interface principal para trabalhar com métricas e logs.

func NewClient

func NewClient(config Config) (Client, error)

NewClient cria uma nova instância do cliente OpenTelemetry. A configuração é validada antes de criar o cliente.

type Config

type Config struct {
	// ServiceName é o nome do serviço (obrigatório).
	ServiceName string

	// ServiceVersion é a versão do serviço.
	ServiceVersion string

	// OTLPEndpoint é o endpoint OTLP para métricas e logs.
	// Pode ser configurado via GRAFTEL_OTLP_ENDPOINT ou WithOTLPEndpoint.
	// Padrão: http://localhost:4318
	OTLPEndpoint string

	// APIKey é a chave de API para autenticação (obrigatória se usar autenticação).
	// Pode ser configurada via GRAFTEL_API_KEY ou WithAPIKey.
	APIKey string

	// InstanceID é o ID da instância (opcional).
	// Se fornecido, será usado como service.instance.id no resource OpenTelemetry.
	// Pode ser configurado via GRAFTEL_INSTANCE_ID ou WithInstanceID.
	InstanceID string

	// PrometheusEndpoint é o endpoint para expor métricas Prometheus (ex: :8080).
	// Se vazio, não expõe endpoint Prometheus.
	PrometheusEndpoint string

	// ResourceAttributes são atributos adicionais para o resource.
	ResourceAttributes map[string]string

	// MetricExportInterval é o intervalo de exportação de métricas.
	// Padrão: 30 segundos
	MetricExportInterval time.Duration

	// LogExportInterval é o intervalo de exportação de logs.
	// Padrão: 30 segundos
	LogExportInterval time.Duration

	// ExportTimeout é o timeout para exportação de dados OTLP.
	// Padrão: 10 segundos
	ExportTimeout time.Duration

	// Insecure desabilita TLS (apenas para desenvolvimento local).
	Insecure bool
}

Config contém as configurações para inicializar o OpenTelemetry. Use NewConfig para criar uma configuração com valores padrão.

func NewConfig

func NewConfig(serviceName string) Config

NewConfig cria uma nova configuração com valores padrão. O serviceName é obrigatório, mas pode ser fornecido via GRAFTEL_SERVICE_NAME. Valores são carregados na seguinte ordem de prioridade: 1. Valores passados via métodos With* (maior prioridade) 2. Variáveis de ambiente GRAFTEL_* 3. Valores padrão

func (*Config) Validate

func (c *Config) Validate() error

Validate valida a configuração e retorna um erro se inválida. Define valores padrão se não foram configurados.

func (Config) WithAPIKey

func (c Config) WithAPIKey(apiKey string) Config

WithAPIKey define a chave de API para autenticação. Se não fornecido, será lido de GRAFTEL_API_KEY.

func (Config) WithExportTimeout

func (c Config) WithExportTimeout(timeout time.Duration) Config

WithExportTimeout define o timeout para exportação de dados OTLP.

func (Config) WithInsecure

func (c Config) WithInsecure(insecure bool) Config

WithInsecure desabilita TLS (apenas para desenvolvimento local).

func (Config) WithInstanceID

func (c Config) WithInstanceID(instanceID string) Config

WithInstanceID define o ID da instância. Este ID será usado como service.instance.id no resource OpenTelemetry. Se não fornecido, será lido de GRAFTEL_INSTANCE_ID.

func (Config) WithLogExportInterval

func (c Config) WithLogExportInterval(interval time.Duration) Config

WithLogExportInterval define o intervalo de exportação de logs.

func (Config) WithMetricExportInterval

func (c Config) WithMetricExportInterval(interval time.Duration) Config

WithMetricExportInterval define o intervalo de exportação de métricas.

func (Config) WithOTLPEndpoint

func (c Config) WithOTLPEndpoint(endpoint string) Config

WithOTLPEndpoint define o endpoint OTLP. Se não fornecido, será lido de GRAFTEL_OTLP_ENDPOINT.

func (Config) WithPrometheusEndpoint

func (c Config) WithPrometheusEndpoint(endpoint string) Config

WithPrometheusEndpoint define o endpoint para expor métricas Prometheus.

func (Config) WithResourceAttribute

func (c Config) WithResourceAttribute(key, value string) Config

WithResourceAttribute adiciona um atributo ao resource.

func (Config) WithResourceAttributes

func (c Config) WithResourceAttributes(attrs map[string]string) Config

WithResourceAttributes adiciona múltiplos atributos ao resource.

func (Config) WithServiceVersion

func (c Config) WithServiceVersion(version string) Config

WithServiceVersion define a versão do serviço. Se não fornecido, será lido de GRAFTEL_SERVICE_VERSION.

type ContextLogger

type ContextLogger struct {
	// contains filtered or unexported fields
}

func NewContextLogger

func NewContextLogger(logger LogsHelper, ctx context.Context) *ContextLogger

func (*ContextLogger) Debug

func (cl *ContextLogger) Debug(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) Error

func (cl *ContextLogger) Error(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) ErrorWithError

func (cl *ContextLogger) ErrorWithError(msg string, err error, tags ...attribute.KeyValue)

func (*ContextLogger) Fatal

func (cl *ContextLogger) Fatal(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) Info

func (cl *ContextLogger) Info(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) Log

func (cl *ContextLogger) Log(level LogLevel, msg string, tags ...attribute.KeyValue)

func (*ContextLogger) LogWithError

func (cl *ContextLogger) LogWithError(level LogLevel, msg string, err error, tags ...attribute.KeyValue)

func (*ContextLogger) LogWithFields

func (cl *ContextLogger) LogWithFields(level LogLevel, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

func (*ContextLogger) Trace

func (cl *ContextLogger) Trace(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) Warn

func (cl *ContextLogger) Warn(msg string, tags ...attribute.KeyValue)

func (*ContextLogger) WithTags

func (cl *ContextLogger) WithTags(tags ...attribute.KeyValue) *ContextLogger

type Counter

type Counter struct {
	// contains filtered or unexported fields
}

Counter representa um contador de métricas. Use NewCounter para criar uma instância.

func (*Counter) Add

func (c *Counter) Add(ctx context.Context, value int64, attrs ...attribute.KeyValue)

Add incrementa o contador pelo valor especificado.

func (*Counter) Increment

func (c *Counter) Increment(ctx context.Context, attrs ...attribute.KeyValue)

Increment incrementa o contador em 1.

type ErrInitializationFailed

type ErrInitializationFailed struct {
	Component string
	Err       error
}

ErrInitializationFailed é retornado quando a inicialização falha.

func (*ErrInitializationFailed) Error

func (e *ErrInitializationFailed) Error() string

func (*ErrInitializationFailed) Unwrap

func (e *ErrInitializationFailed) Unwrap() error

type ErrInvalidConfig

type ErrInvalidConfig struct {
	Field   string
	Message string
}

ErrInvalidConfig é retornado quando a configuração é inválida.

func (*ErrInvalidConfig) Error

func (e *ErrInvalidConfig) Error() string

type ErrShutdownFailed

type ErrShutdownFailed struct {
	Component string
	Err       error
}

ErrShutdownFailed é retornado quando o shutdown falha.

func (*ErrShutdownFailed) Error

func (e *ErrShutdownFailed) Error() string

func (*ErrShutdownFailed) Unwrap

func (e *ErrShutdownFailed) Unwrap() error

type Gauge

type Gauge struct {
	// contains filtered or unexported fields
}

Gauge representa um gauge de métricas observável.

type Histogram

type Histogram struct {
	// contains filtered or unexported fields
}

Histogram representa um histograma de métricas.

func (*Histogram) Record

func (h *Histogram) Record(ctx context.Context, value float64, attrs ...attribute.KeyValue)

Record registra um valor no histograma.

func (*Histogram) RecordDuration

func (h *Histogram) RecordDuration(ctx context.Context, duration time.Duration, attrs ...attribute.KeyValue)

RecordDuration registra uma duração no histograma (em segundos).

type LogLevel

type LogLevel int

LogLevel representa o nível de log.

const (
	// LogLevelTrace representa o nível de log trace.
	LogLevelTrace LogLevel = iota
	// LogLevelDebug representa o nível de log debug.
	LogLevelDebug
	// LogLevelInfo representa o nível de log info.
	LogLevelInfo
	// LogLevelWarn representa o nível de log warn.
	LogLevelWarn
	// LogLevelError representa o nível de log error.
	LogLevelError
	// LogLevelFatal representa o nível de log fatal.
	LogLevelFatal
)

func (LogLevel) String

func (l LogLevel) String() string

String retorna a representação em string do nível de log.

type LogsHelper

type LogsHelper interface {
	// Log envia um log com nível, mensagem e tags.
	Log(ctx context.Context, level LogLevel, msg string, tags ...attribute.KeyValue)

	// LogWithFields envia um log com campos extras formatados.
	LogWithFields(ctx context.Context, level LogLevel, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// LogWithError envia um log de erro com uma mensagem de erro.
	LogWithError(ctx context.Context, level LogLevel, msg string, err error, tags ...attribute.KeyValue)

	// Trace envia um log de nível trace.
	Trace(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// Debug envia um log de nível debug.
	Debug(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// Info envia um log de nível info.
	Info(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// Warn envia um log de nível warn.
	Warn(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// Error envia um log de nível error.
	Error(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// Fatal envia um log de nível fatal.
	Fatal(ctx context.Context, msg string, tags ...attribute.KeyValue)

	// TraceWithFields envia um log trace com campos extras.
	TraceWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// DebugWithFields envia um log debug com campos extras.
	DebugWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// InfoWithFields envia um log info com campos extras.
	InfoWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// WarnWithFields envia um log warn com campos extras.
	WarnWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// ErrorWithFields envia um log error com campos extras.
	ErrorWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// FatalWithFields envia um log fatal com campos extras.
	FatalWithFields(ctx context.Context, msg string, fields map[string]interface{}, tags ...attribute.KeyValue)

	// ErrorWithError envia um log de erro com uma mensagem de erro.
	ErrorWithError(ctx context.Context, msg string, err error, tags ...attribute.KeyValue)
}

LogsHelper facilita a criação e uso de logs estruturados. Use NewLogsHelper para criar uma instância.

func NewLogsHelper

func NewLogsHelper(logger otellog.Logger) LogsHelper

NewLogsHelper cria um novo helper de logs.

type MetricsHelper

type MetricsHelper interface {
	// NewCounter cria um novo contador de métricas.
	NewCounter(name, description string, opts ...otelmetric.Int64CounterOption) (*Counter, error)

	// NewUpDownCounter cria um novo contador que pode incrementar ou decrementar.
	NewUpDownCounter(name, description string, opts ...otelmetric.Int64UpDownCounterOption) (*UpDownCounter, error)

	// NewHistogram cria um novo histograma de métricas.
	NewHistogram(name, description string, opts ...otelmetric.Float64HistogramOption) (*Histogram, error)

	// NewGauge cria um novo gauge observável.
	NewGauge(name, description string, callback func(context.Context, otelmetric.Float64Observer) error, opts ...otelmetric.Float64ObservableGaugeOption) (*Gauge, error)
}

MetricsHelper facilita a criação e uso de métricas. Use NewMetricsHelper para criar uma instância.

func NewMetricsHelper

func NewMetricsHelper(meter otelmetric.Meter) MetricsHelper

NewMetricsHelper cria um novo helper de métricas.

type MiddlewareConfig

type MiddlewareConfig struct {
	ServiceName        string
	SkipPaths          []string
	RecordRequestBody  bool
	RecordResponseBody bool
	MaxBodySize        int64
}

func DefaultMiddlewareConfig

func DefaultMiddlewareConfig(serviceName string) MiddlewareConfig

type TracingHelper

type TracingHelper interface {
	StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span)
	StartSpanWithTags(ctx context.Context, name string, tags ...attribute.KeyValue) (context.Context, trace.Span)
	WithSpan(ctx context.Context, name string, fn func(context.Context) error, tags ...attribute.KeyValue) error
	WithSpanAndReturn(ctx context.Context, name string, fn func(context.Context) (interface{}, error), tags ...attribute.KeyValue) (interface{}, error)
	AddSpanTags(ctx context.Context, tags ...attribute.KeyValue)
	SetSpanError(ctx context.Context, err error, tags ...attribute.KeyValue)
	SetSpanStatus(ctx context.Context, code codes.Code, description string)
	GetSpan(ctx context.Context) trace.Span
	GetTraceID(ctx context.Context) string
	GetSpanID(ctx context.Context) string
}

func NewTracingHelper

func NewTracingHelper(tracer trace.Tracer) TracingHelper

type UpDownCounter

type UpDownCounter struct {
	// contains filtered or unexported fields
}

UpDownCounter representa um contador que pode incrementar ou decrementar.

func (*UpDownCounter) Add

func (u *UpDownCounter) Add(ctx context.Context, value int64, attrs ...attribute.KeyValue)

Add adiciona (ou subtrai) um valor ao contador.

func (*UpDownCounter) Decrement

func (u *UpDownCounter) Decrement(ctx context.Context, attrs ...attribute.KeyValue)

Decrement decrementa o contador em 1.

func (*UpDownCounter) Increment

func (u *UpDownCounter) Increment(ctx context.Context, attrs ...attribute.KeyValue)

Increment incrementa o contador em 1.

Directories

Path Synopsis
examples
basic command
context command
grafana-cloud command
middleware command
prometheus command
tracing command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL