gofiber / contrib

🧬 Repository for third party middlewares with dependencies
https://docs.gofiber.io/contrib/
MIT License
198 stars 102 forks source link

🐛 [Bug]: Otelfiber blocks stream writers #1126

Open RohanDoshi21 opened 1 month ago

RohanDoshi21 commented 1 month ago

Bug Description

The stream writer is attempting to flush events, but the initial response is never received on the client, neither are the subsequent events.

How to Reproduce

Steps to reproduce the behavior:

  1. Use go-fiber recipe example Link
  2. Add otel-fiber middleware to this example
  3. Immediately the requests gets blocked get

Expected Behavior

Otelfiber shouldn't block stream writers.

Contrib package Version

v1.0.10

Code Snippet (optional)

package main

import (
    "bufio"
    "fmt"
    "log"
    "time"

    "github.com/gofiber/contrib/otelfiber"
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/cors"
    "github.com/valyala/fasthttp"
)

func main() {
    // Fiber instance
    app := fiber.New()

    // CORS for external resources
    app.Use(cors.New(cors.Config{
        AllowOrigins: "*",
        AllowHeaders: "Cache-Control",
    }))

    app.Use(otelfiber.Middleware(
        otelfiber.WithServerName("test"),
    ))

    app.Get("/sse", func(c *fiber.Ctx) error {
        c.Set("Content-Type", "text/event-stream")
        c.Set("Cache-Control", "no-cache")
        c.Set("Connection", "keep-alive")
        c.Set("Transfer-Encoding", "chunked")

        c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
            fmt.Println("WRITER")
            var i int
            for {
                i++
                msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
                fmt.Fprintf(w, "data: Message: %s\n\n", msg)
                fmt.Println(msg)

                w.Flush()
                time.Sleep(5 * time.Second)
            }
        }))

        return nil
    })

    // Start server
    log.Fatal(app.Listen(":3000"))
}

Checklist:

chenxi393 commented 1 week ago

I also encountered this problem. How can I solve this problem while using otel-fiber?