backend-service/internal/middleware/tracing.go

38 lines
883 B
Go
Raw Permalink Normal View History

package middleware
import (
"crypto/rand"
"encoding/hex"
"github.com/gin-gonic/gin"
)
// TracingMiddleware adds trace ID to requests for better observability
func TracingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// Check if trace ID is already provided in headers
traceID := c.GetHeader("X-Trace-ID")
// Generate new trace ID if not provided
if traceID == "" {
traceID = generateTraceID()
}
// Set trace ID in context and response header
c.Set("trace_id", traceID)
c.Header("X-Trace-ID", traceID)
c.Next()
}
}
// generateTraceID generates a random trace ID
func generateTraceID() string {
bytes := make([]byte, 16)
if _, err := rand.Read(bytes); err != nil {
// Fallback to a simple timestamp-based ID if random generation fails
return "trace-" + hex.EncodeToString([]byte("fallback"))
}
return hex.EncodeToString(bytes)
}