fix bug with gzip in meter handler (#223)
This commit is contained in:
		| @@ -4,7 +4,7 @@ import ( | |||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"compress/gzip" | 	"compress/gzip" | ||||||
| 	"context" | 	"context" | ||||||
| 	"io" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
| @@ -91,32 +91,52 @@ func (h *Handler) Metrics(ctx context.Context, req *codecpb.Frame, rsp *codecpb. | |||||||
| 		log = logger.DefaultLogger | 		log = logger.DefaultLogger | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	var err error | ||||||
|  |  | ||||||
|  | 	if md, ok := metadata.FromIncomingContext(ctx); ok && gzipAccepted(md) && !h.Options.DisableCompress { | ||||||
|  | 		err = h.writeMetricsGzip(ctx, rsp) | ||||||
|  | 	} else { | ||||||
|  | 		err = h.writeMetricsPlain(ctx, rsp) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Error(ctx, "http/meter write failed", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *Handler) writeMetricsGzip(ctx context.Context, rsp *codecpb.Frame) error { | ||||||
|  | 	httpsrv.AppendResponseMetadata(ctx, metadata.Pairs(contentEncodingHeader, "gzip")) | ||||||
|  |  | ||||||
| 	buf := bufPool.Get().(*bytes.Buffer) | 	buf := bufPool.Get().(*bytes.Buffer) | ||||||
| 	defer bufPool.Put(buf) | 	defer bufPool.Put(buf) | ||||||
| 	buf.Reset() | 	buf.Reset() | ||||||
|  |  | ||||||
| 	w := io.Writer(buf) |  | ||||||
|  |  | ||||||
| 	if md, ok := metadata.FromIncomingContext(ctx); ok && gzipAccepted(md) && !h.Options.DisableCompress { |  | ||||||
| 		httpsrv.AppendResponseMetadata(ctx, metadata.Pairs(contentEncodingHeader, "gzip")) |  | ||||||
|  |  | ||||||
| 	gz := gzipPool.Get().(*gzip.Writer) | 	gz := gzipPool.Get().(*gzip.Writer) | ||||||
| 	defer gzipPool.Put(gz) | 	defer gzipPool.Put(gz) | ||||||
|  | 	gz.Reset(buf) | ||||||
|  |  | ||||||
| 		gz.Reset(w) | 	if err := h.Options.Meter.Write(gz, h.Options.MeterOptions...); err != nil { | ||||||
| 		defer gz.Close() | 		return fmt.Errorf("meter write: %w", err) | ||||||
|  |  | ||||||
| 		w = gz |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err := h.Options.Meter.Write(w, h.Options.MeterOptions...); err != nil { | 	if err := gz.Close(); err != nil { | ||||||
| 		log.Error(ctx, "http/meter write failed", err) | 		return fmt.Errorf("gzip close: %w", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rsp.Data = buf.Bytes() | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| 	// gz.Flush() must be called after writing metrics to ensure buffered data is written to the underlying writer. | func (h *Handler) writeMetricsPlain(_ context.Context, rsp *codecpb.Frame) error { | ||||||
| 	if gz, ok := w.(*gzip.Writer); ok { | 	buf := bufPool.Get().(*bytes.Buffer) | ||||||
| 		gz.Flush() | 	defer bufPool.Put(buf) | ||||||
|  | 	buf.Reset() | ||||||
|  |  | ||||||
|  | 	if err := h.Options.Meter.Write(buf, h.Options.MeterOptions...); err != nil { | ||||||
|  | 		return fmt.Errorf("meter write: %w", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rsp.Data = buf.Bytes() | 	rsp.Data = buf.Bytes() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user