contrib icon indicating copy to clipboard operation
contrib copied to clipboard

🐛 [Bug]: Otelfiber blocks stream writers

Open RohanDoshi21 opened this issue 1 year ago • 1 comments

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:

  • [X] I agree to follow Fiber's Code of Conduct.
  • [X] I have checked for existing issues that describe my problem prior to opening this one.
  • [X] I understand that improperly formatted bug reports may be closed without explanation.

RohanDoshi21 avatar Jun 07 '24 09:06 RohanDoshi21

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

chenxi393 avatar Jun 24 '24 15:06 chenxi393

Seems the code makes an exception for "text/event-stream" but I haven't verified if this fixes the issue.

jonasv3 avatar Sep 19 '25 10:09 jonasv3